// Path: src/main/java/org/chorem/ecd/EcdConfig.java
// @ApplicationScoped
// public class EcdConfig {
// 
//     private static final Logger logger = LoggerFactory.getLogger(EcdConfig.class);
// 
//     private final Properties props;
// 
//     public static final String STREAMS_DIR = "streams";
//     public static final String NEWS_DIR = "news";
//     public static final String WEATHER_DIR = "weather";
// 
//     public EcdConfig() {
//         props = new Properties();
//         try {
//             props.load(getClass().getClassLoader().getResourceAsStream("ecd.properties"));
//         } catch (IOException e) {
//             logger.error(e.getMessage(), e);
//         }
//     }
// 
//     public String getDataSourceUrl() {
//         return props.getProperty("ecd.datasource.url");
//     }
// 
//     public String getDataSourceLogin() {
//         return props.getProperty("ecd.datasource.login");
//     }
// 
//     public String getDataSourcePwd() {
//         return props.getProperty("ecd.datasource.pwd");
//     }
// 
//     public String getApiPathPrefix() {
//         return "/api/ecd";
//     }
// 
//     public String getMediaPathPrefix() {
//         return "/media/ecd";
//     }
// 
//     public String getDataDir() {
//         return props.getProperty("ecd.data.dir");
//     }
// 
//     public String getUploadDir() { return props.getProperty("ecd.upload.dir"); }
// 
//     public String getUnoconvCmd() {
//         return props.getProperty("ecd.cmd.unoconv");
//     }
// 
//     public String getResizeCmd() {
//         return props.getProperty("ecd.cmd.resize");
//     }
// 
//     public String getLocationSearchUrlFormat() {
//         return props.getProperty("ecd.location.searchUrlFormat");
//     }
// 
//     public Integer getDefaultStreamTiming() {
//         return Integer.valueOf(props.getProperty("ecd.default.streamTiming"));
//     }
// 
//     public Path getStreamsPath() {
//         return Paths.get(getDataDir(), STREAMS_DIR);
//     }
// 
//     public Path getAggregatedNewsPath() {
//         return Paths.get(getDataDir(), NEWS_DIR, "aggregated.json");
//     }
// 
//     public Path getWeatherForecastPath() {
//         return Paths.get(getDataDir(), WEATHER_DIR, "forecast.json");
//     }
// 
// }
// 
// Path: src/main/java/org/chorem/ecd/model/stream/SignageStreamFrame.java
// public class SignageStreamFrame {
// 
//     private String src;
// 
//     private String thumbnail;
// 
//     public SignageStreamFrame(Path src, Path thumbnail) {
//         this(src.toString(), thumbnail.toString());
//     }
// 
//     public SignageStreamFrame(String src, String thumbnail) {
//         this.src = src;
//         this.thumbnail = thumbnail;
//     }
// 
//     public String getSrc() {
//         return src;
//     }
// 
//     public void setSrc(String src) {
//         this.src = src;
//     }
// 
//     public String getThumbnail() {
//         return thumbnail;
//     }
// 
//     public void setThumbnail(String thumbnail) {
//         this.thumbnail = thumbnail;
//     }
// }


import com.google.common.base.CharMatcher;
import com.google.common.collect.ImmutableSortedSet;
import com.google.common.collect.Lists;
import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.PumpStreamHandler;
import org.chorem.ecd.EcdConfig;
import org.chorem.ecd.model.stream.SignageStreamFrame;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.SortedSet;
import java.util.stream.Collectors;
        return getVersion(config.getUnoconvCmd());
    }

    public String getConvertVersion() {
        return getVersion(config.getResizeCmd());
    }

    public List<SignageStreamFrame> extractFrames(Path source, Path destDir) throws IOException {
        List<String> cmdLineArgs = Arrays.asList(config.getUnoconvCmd(),
                "-vvv",
                "--doctype=presentation",
                "--format=html",
                "-e PublishMode=0",
                "-e Format=2",
                "-e Width=1024",
                "-e Compression=\"50%\"",
                "-e IsExportContentsPage=false",
                "--output=" + Paths.get(destDir.toString(), File.separator, ".").toString(),
                source.toString());

        executeCmd(cmdLineArgs);

        Comparator<Path> pathsWithDigitsComparator = (p1, p2) -> {
            int p1Sequence = Integer.parseInt(CharMatcher.digit().retainFrom(p1.getFileName().toString()));
            int p2Sequence = Integer.parseInt(CharMatcher.digit().retainFrom(p2.getFileName().toString()));
            return p1Sequence - p2Sequence;
        };

        Set<Path> toRemove = Files.list(destDir)
                .filter(p -> getFileExtension(p).equalsIgnoreCase("html"))
// Path: src/main/java/org/chorem/ecd/EcdConfig.java
// @ApplicationScoped
// public class EcdConfig {
// 
//     private static final Logger logger = LoggerFactory.getLogger(EcdConfig.class);
// 
//     private final Properties props;
// 
//     public static final String STREAMS_DIR = "streams";
//     public static final String NEWS_DIR = "news";
//     public static final String WEATHER_DIR = "weather";
// 
//     public EcdConfig() {
//         props = new Properties();
//         try {
//             props.load(getClass().getClassLoader().getResourceAsStream("ecd.properties"));
//         } catch (IOException e) {
//             logger.error(e.getMessage(), e);
//         }
//     }
// 
//     public String getDataSourceUrl() {
//         return props.getProperty("ecd.datasource.url");
//     }
// 
//     public String getDataSourceLogin() {
//         return props.getProperty("ecd.datasource.login");
//     }
// 
//     public String getDataSourcePwd() {
//         return props.getProperty("ecd.datasource.pwd");
//     }
// 
//     public String getApiPathPrefix() {
//         return "/api/ecd";
//     }
// 
//     public String getMediaPathPrefix() {
//         return "/media/ecd";
//     }
// 
//     public String getDataDir() {
//         return props.getProperty("ecd.data.dir");
//     }
// 
//     public String getUploadDir() { return props.getProperty("ecd.upload.dir"); }
// 
//     public String getUnoconvCmd() {
//         return props.getProperty("ecd.cmd.unoconv");
//     }
// 
//     public String getResizeCmd() {
//         return props.getProperty("ecd.cmd.resize");
//     }
// 
//     public String getLocationSearchUrlFormat() {
//         return props.getProperty("ecd.location.searchUrlFormat");
//     }
// 
//     public Integer getDefaultStreamTiming() {
//         return Integer.valueOf(props.getProperty("ecd.default.streamTiming"));
//     }
// 
//     public Path getStreamsPath() {
//         return Paths.get(getDataDir(), STREAMS_DIR);
//     }
// 
//     public Path getAggregatedNewsPath() {
//         return Paths.get(getDataDir(), NEWS_DIR, "aggregated.json");
//     }
// 
//     public Path getWeatherForecastPath() {
//         return Paths.get(getDataDir(), WEATHER_DIR, "forecast.json");
//     }
// 
// }
// 
// Path: src/main/java/org/chorem/ecd/model/stream/SignageStreamFrame.java
// public class SignageStreamFrame {
// 
//     private String src;
// 
//     private String thumbnail;
// 
//     public SignageStreamFrame(Path src, Path thumbnail) {
//         this(src.toString(), thumbnail.toString());
//     }
// 
//     public SignageStreamFrame(String src, String thumbnail) {
//         this.src = src;
//         this.thumbnail = thumbnail;
//     }
// 
//     public String getSrc() {
//         return src;
//     }
// 
//     public void setSrc(String src) {
//         this.src = src;
//     }
// 
//     public String getThumbnail() {
//         return thumbnail;
//     }
// 
//     public void setThumbnail(String thumbnail) {
//         this.thumbnail = thumbnail;
//     }
// }


// Path: src/main/java/org/chorem/ecd/service/MediaConverterService.java
import com.google.common.base.CharMatcher;
import com.google.common.collect.ImmutableSortedSet;
import com.google.common.collect.Lists;
import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.PumpStreamHandler;
import org.chorem.ecd.EcdConfig;
import org.chorem.ecd.model.stream.SignageStreamFrame;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.SortedSet;
import java.util.stream.Collectors;

        return getVersion(config.getUnoconvCmd());
    }

    public String getConvertVersion() {
        return getVersion(config.getResizeCmd());
    }

    public List<SignageStreamFrame> extractFrames(Path source, Path destDir) throws IOException {
        List<String> cmdLineArgs = Arrays.asList(config.getUnoconvCmd(),
                "-vvv",
                "--doctype=presentation",
                "--format=html",
                "-e PublishMode=0",
                "-e Format=2",
                "-e Width=1024",
                "-e Compression=\"50%\"",
                "-e IsExportContentsPage=false",
                "--output=" + Paths.get(destDir.toString(), File.separator, ".").toString(),
                source.toString());

        executeCmd(cmdLineArgs);

        Comparator<Path> pathsWithDigitsComparator = (p1, p2) -> {
            int p1Sequence = Integer.parseInt(CharMatcher.digit().retainFrom(p1.getFileName().toString()));
            int p2Sequence = Integer.parseInt(CharMatcher.digit().retainFrom(p2.getFileName().toString()));
            return p1Sequence - p2Sequence;
        };

        Set<Path> toRemove = Files.list(destDir)
                .filter(p -> getFileExtension(p).equalsIgnoreCase("html"))
                .collect(Collectors.toSet());