package com.kodcu.service.convert.ebook; import com.kodcu.config.EditorConfigBean; import com.kodcu.config.LocationConfigBean; import com.kodcu.controller.ApplicationController; import com.kodcu.other.Current; import com.kodcu.other.ExtensionFilters; import com.kodcu.other.IOHelper; import com.kodcu.service.DirectoryService; import com.kodcu.service.ThreadService; import com.kodcu.service.convert.DocumentConverter; import com.kodcu.service.ui.IndikatorService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.zeroturnaround.exec.ProcessExecutor; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.util.function.Consumer; /** * Created by usta on 02.09.2014. */ @Component public class MobiConverter implements DocumentConverter<String> { private final Logger logger = LoggerFactory.getLogger(MobiConverter.class); private final ApplicationController controller; private final ThreadService threadService; private final EpubConverter epubConverter; private final Current current; private final DirectoryService directoryService; private final IndikatorService indikatorService; private final EditorConfigBean editorConfigBean; private final LocationConfigBean locationConfigBean; @Autowired public MobiConverter(final ApplicationController controller, final ThreadService threadService, final EpubConverter epubConverter, final Current current, final DirectoryService directoryService, final IndikatorService indikatorService, EditorConfigBean editorConfigBean, LocationConfigBean locationConfigBean) { this.controller = controller; this.threadService = threadService; this.epubConverter = epubConverter; this.current = current; this.directoryService = directoryService; this.indikatorService = indikatorService; this.editorConfigBean = editorConfigBean; this.locationConfigBean = locationConfigBean; } @Override public void convert(boolean askPath, Consumer<String>... nextStep) { try { indikatorService.startProgressBar(); logger.debug("Mobi conversion started"); final Path epubPath = epubConverter.produceEpub3Temp(); final Path currentTabPath = current.currentPath().get(); final Path currentTabPathDir = currentTabPath.getParent(); final String tabText = current.getCurrentTabText().replace("*", "").trim(); Path mobiPath = directoryService.getSaveOutputPath(ExtensionFilters.MOBI, askPath); final ProcessExecutor processExecutor = new ProcessExecutor(); processExecutor.readOutput(true); Path kindleGenPath = Paths.get(locationConfigBean.getKindlegen()); try { final String message = processExecutor .command(kindleGenPath.toString(), "-o", mobiPath.getFileName().toString(), epubPath.toString()) .execute() .outputUTF8(); logger.debug(message); IOHelper.move(epubPath.getParent().resolve(mobiPath.getFileName()), mobiPath, StandardCopyOption.REPLACE_EXISTING); indikatorService.stopProgressBar(); logger.debug("Mobi conversion ended"); controller.addRemoveRecentList(mobiPath); } catch (Exception e) { logger.error("Problem occured while converting to Mobi", e); } finally { indikatorService.stopProgressBar(); } } catch (Exception e) { logger.error("Problem occured while converting to Mobi", e); indikatorService.stopProgressBar(); } } }