Allows choosing and managing each tool

This commit is contained in:
Guillaume Tâche
2024-10-03 21:55:14 +02:00
parent 0a2f9e0c31
commit df58cf4585
117 changed files with 1547 additions and 1515 deletions

View File

@@ -15,9 +15,5 @@
<groupId>com.github.gtache.autosubtitle</groupId>
<artifactId>autosubtitle-whisper-common</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
</dependencies>
</project>

View File

@@ -1,4 +1,4 @@
package com.github.gtache.autosubtitle.modules.setup.whisper;
package com.github.gtache.autosubtitle.modules.setup.whisper.base;
import javax.inject.Qualifier;
import java.lang.annotation.Documented;
@@ -12,5 +12,5 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Documented
@Retention(RUNTIME)
@Target({ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD})
public @interface PythonVersion {
public @interface Whisper {
}

View File

@@ -1,4 +1,4 @@
package com.github.gtache.autosubtitle.modules.setup.whisper;
package com.github.gtache.autosubtitle.modules.setup.whisper.base;
import javax.inject.Qualifier;
import java.lang.annotation.Documented;

View File

@@ -0,0 +1,16 @@
package com.github.gtache.autosubtitle.modules.setup.whisper.base;
import javax.inject.Qualifier;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Qualifier
@Documented
@Retention(RUNTIME)
@Target({ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD})
public @interface WhisperPythonVersion {
}

View File

@@ -1,30 +1,33 @@
package com.github.gtache.autosubtitle.modules.setup.whisper.base;
import com.github.gtache.autosubtitle.impl.OS;
import com.github.gtache.autosubtitle.modules.setup.conda.CondaSetupModule;
import com.github.gtache.autosubtitle.modules.setup.impl.SubtitleExtractorSetup;
import com.github.gtache.autosubtitle.modules.setup.impl.ToolsRoot;
import com.github.gtache.autosubtitle.modules.setup.whisper.PythonVersion;
import com.github.gtache.autosubtitle.modules.setup.whisper.WhisperBundledRoot;
import com.github.gtache.autosubtitle.modules.setup.whisper.WhisperCommonSetupModule;
import com.github.gtache.autosubtitle.modules.setup.whisper.WhisperVenvPath;
import com.github.gtache.autosubtitle.setup.SetupManager;
import com.github.gtache.autosubtitle.setup.whisper.WhisperSetupConfiguration;
import com.github.gtache.autosubtitle.setup.whisper.base.WhisperSetupManager;
import dagger.Binds;
import dagger.Module;
import dagger.Provides;
import dagger.multibindings.IntoMap;
import dagger.multibindings.StringKey;
import java.nio.file.Path;
/**
* Setup module for Whisper
*/
@Module(includes = WhisperCommonSetupModule.class)
@Module(includes = CondaSetupModule.class)
public abstract class WhisperSetupModule {
@Binds
@SubtitleExtractorSetup
@IntoMap
@StringKey("whisper")
abstract SetupManager bindsSubtitleExtractorSetupManager(final WhisperSetupManager manager);
@Provides
@PythonVersion
@WhisperPythonVersion
static String providesPythonVersion() {
return "3.9.19";
}
@@ -40,4 +43,13 @@ public abstract class WhisperSetupModule {
static Path providesWhisperVenvPath(@WhisperBundledRoot final Path root) {
return root.resolve("whisper-env");
}
@Provides
@Whisper
static WhisperSetupConfiguration providesWhisperSetupConfiguration(@WhisperBundledRoot final Path root,
@WhisperVenvPath final Path venvPath,
@WhisperPythonVersion final String pythonVersion,
final OS os) {
return new WhisperSetupConfiguration(root, venvPath, pythonVersion, os);
}
}

View File

@@ -1,4 +1,4 @@
package com.github.gtache.autosubtitle.modules.setup.whisper;
package com.github.gtache.autosubtitle.modules.setup.whisper.base;
import javax.inject.Qualifier;
import java.lang.annotation.Documented;

View File

@@ -4,6 +4,8 @@ import com.github.gtache.autosubtitle.subtitle.extractor.SubtitleExtractor;
import com.github.gtache.autosubtitle.subtitle.extractor.whisper.base.WhisperSubtitleExtractor;
import dagger.Binds;
import dagger.Module;
import dagger.multibindings.IntoMap;
import dagger.multibindings.StringKey;
/**
* Dagger module for Whisper
@@ -16,5 +18,7 @@ public abstract class WhisperExtractorModule {
}
@Binds
abstract SubtitleExtractor bindsSubtitleExtractor(final WhisperSubtitleExtractor extractor);
@IntoMap
@StringKey("whisper")
abstract SubtitleExtractor<?> bindsSubtitleExtractor(final WhisperSubtitleExtractor extractor);
}

View File

@@ -1,31 +0,0 @@
package com.github.gtache.autosubtitle.modules.subtitle.parser.json.whisper.base;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverter;
import com.github.gtache.autosubtitle.subtitle.parser.json.whisper.base.JSONSubtitleConverter;
import dagger.Binds;
import dagger.Module;
import dagger.Provides;
import dagger.multibindings.IntoMap;
import dagger.multibindings.StringKey;
import javax.inject.Singleton;
@Module
public abstract class WhisperJsonModule {
private WhisperJsonModule() {
}
@Binds
@IntoMap
@StringKey("json")
abstract SubtitleConverter bindsJSONSubtitleConverter(final JSONSubtitleConverter subtitleConverter);
@Provides
@Singleton
static ObjectMapper providesObjectMapper() {
return new ObjectMapper();
}
}

View File

@@ -2,16 +2,17 @@ package com.github.gtache.autosubtitle.modules.whisper.base;
import com.github.gtache.autosubtitle.modules.setup.whisper.base.WhisperSetupModule;
import com.github.gtache.autosubtitle.modules.subtitle.extractor.whisper.base.WhisperExtractorModule;
import com.github.gtache.autosubtitle.modules.subtitle.parser.json.whisper.base.WhisperJsonModule;
import com.github.gtache.autosubtitle.subtitle.extractor.ExtractionModelProvider;
import com.github.gtache.autosubtitle.whisper.base.WhisperExtractionModelProvider;
import dagger.Binds;
import dagger.Module;
import dagger.multibindings.IntoMap;
import dagger.multibindings.StringKey;
/**
* Dagger module for Whisper
*/
@Module(includes = {WhisperSetupModule.class, WhisperJsonModule.class, WhisperExtractorModule.class})
@Module(includes = {WhisperSetupModule.class, WhisperExtractorModule.class})
public abstract class WhisperModule {
private WhisperModule() {
@@ -19,5 +20,7 @@ public abstract class WhisperModule {
}
@Binds
@IntoMap
@StringKey("whisper")
abstract ExtractionModelProvider bindsExtractionModelProvider(final WhisperExtractionModelProvider provider);
}

View File

@@ -1,7 +1,9 @@
package com.github.gtache.autosubtitle.setup.whisper.base;
import com.github.gtache.autosubtitle.modules.setup.whisper.base.Whisper;
import com.github.gtache.autosubtitle.process.ProcessRunner;
import com.github.gtache.autosubtitle.setup.SetupException;
import com.github.gtache.autosubtitle.setup.SetupManager;
import com.github.gtache.autosubtitle.setup.conda.CondaSetupManager;
import com.github.gtache.autosubtitle.setup.whisper.AbstractWhisperSetupManager;
import com.github.gtache.autosubtitle.setup.whisper.WhisperSetupConfiguration;
@@ -17,7 +19,7 @@ import java.time.Duration;
import java.util.List;
/**
* {@link com.github.gtache.autosubtitle.setup.SetupManager} for Whisper
* {@link SetupManager} for Whisper
*/
@Singleton
public class WhisperSetupManager extends AbstractWhisperSetupManager {
@@ -25,7 +27,7 @@ public class WhisperSetupManager extends AbstractWhisperSetupManager {
private static final Logger logger = LogManager.getLogger(WhisperSetupManager.class);
@Inject
WhisperSetupManager(final CondaSetupManager condaSetupManager, final WhisperSetupConfiguration configuration,
WhisperSetupManager(final CondaSetupManager condaSetupManager, @Whisper final WhisperSetupConfiguration configuration,
final ProcessRunner processRunner, final HttpClient httpClient) {
super(condaSetupManager, configuration, processRunner, httpClient);
}

View File

@@ -1,4 +1,4 @@
package com.github.gtache.autosubtitle.subtitle.parser.json.whisper.base;
package com.github.gtache.autosubtitle.subtitle.converter.json.whisper.base;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

View File

@@ -1,4 +1,4 @@
package com.github.gtache.autosubtitle.subtitle.parser.json.whisper.base;
package com.github.gtache.autosubtitle.subtitle.converter.json.whisper.base;
import java.util.List;

View File

@@ -1,4 +1,4 @@
package com.github.gtache.autosubtitle.subtitle.parser.json.whisper.base;
package com.github.gtache.autosubtitle.subtitle.converter.json.whisper.base;
import java.util.List;

View File

@@ -2,9 +2,9 @@ package com.github.gtache.autosubtitle.subtitle.extractor.whisper.base;
import com.github.gtache.autosubtitle.Language;
import com.github.gtache.autosubtitle.impl.OS;
import com.github.gtache.autosubtitle.modules.setup.whisper.WhisperVenvPath;
import com.github.gtache.autosubtitle.modules.setup.whisper.base.WhisperVenvPath;
import com.github.gtache.autosubtitle.process.ProcessRunner;
import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverterProvider;
import com.github.gtache.autosubtitle.subtitle.converter.json.whisper.base.JSONSubtitleConverter;
import com.github.gtache.autosubtitle.subtitle.extractor.ExtractOptions;
import com.github.gtache.autosubtitle.subtitle.extractor.SubtitleExtractor;
import com.github.gtache.autosubtitle.subtitle.extractor.whisper.AbstractWhisperSubtitleExtractor;
@@ -24,9 +24,9 @@ public class WhisperSubtitleExtractor extends AbstractWhisperSubtitleExtractor {
@Inject
WhisperSubtitleExtractor(@WhisperVenvPath final Path venvPath, final SubtitleConverterProvider converterProvider,
WhisperSubtitleExtractor(@WhisperVenvPath final Path venvPath, final JSONSubtitleConverter converter,
final ProcessRunner processRunner, final OS os) {
super(venvPath, converterProvider, processRunner, os);
super(venvPath, converter, processRunner, os);
}
@Override

View File

@@ -3,13 +3,13 @@
*/
module com.github.gtache.autosubtitle.whisper.base {
requires transitive com.github.gtache.autosubtitle.whisper.common;
requires com.fasterxml.jackson.databind;
requires com.github.gtache.autosubtitle.core;
requires org.apache.logging.log4j;
exports com.github.gtache.autosubtitle.setup.whisper.base;
exports com.github.gtache.autosubtitle.subtitle.converter.json.whisper.base;
exports com.github.gtache.autosubtitle.subtitle.extractor.whisper.base;
exports com.github.gtache.autosubtitle.whisper.base;
exports com.github.gtache.autosubtitle.modules.setup.whisper.base;
exports com.github.gtache.autosubtitle.modules.subtitle.extractor.whisper.base;
exports com.github.gtache.autosubtitle.modules.whisper.base;

View File

@@ -1,25 +0,0 @@
package com.github.gtache.autosubtitle.modules.setup.whisper;
import com.github.gtache.autosubtitle.impl.OS;
import com.github.gtache.autosubtitle.modules.setup.conda.CondaSetupModule;
import com.github.gtache.autosubtitle.setup.whisper.WhisperSetupConfiguration;
import dagger.Module;
import dagger.Provides;
import java.nio.file.Path;
@Module(includes = CondaSetupModule.class)
public final class WhisperCommonSetupModule {
private WhisperCommonSetupModule() {
}
@Provides
static WhisperSetupConfiguration providesWhisperSetupConfiguration(@WhisperBundledRoot final Path root,
@WhisperVenvPath final Path venvPath,
@PythonVersion final String pythonVersion,
final OS os) {
return new WhisperSetupConfiguration(root, venvPath, pythonVersion, os);
}
}

View File

@@ -1,5 +1,6 @@
package com.github.gtache.autosubtitle.setup.whisper;
import com.github.gtache.autosubtitle.ToolType;
import com.github.gtache.autosubtitle.impl.OS;
import com.github.gtache.autosubtitle.process.ProcessRunner;
import com.github.gtache.autosubtitle.setup.SetupAction;
@@ -35,6 +36,11 @@ public abstract class AbstractWhisperSetupManager extends AbstractSetupManager {
this.configuration = requireNonNull(configuration);
}
@Override
public ToolType type() {
return ToolType.SUBTITLE_EXTRACTOR;
}
@Override
protected SetupStatus getStatus() throws SetupException {
if (isWhisperInstalled()) {

View File

@@ -5,17 +5,16 @@ import com.github.gtache.autosubtitle.File;
import com.github.gtache.autosubtitle.Video;
import com.github.gtache.autosubtitle.impl.OS;
import com.github.gtache.autosubtitle.process.ProcessRunner;
import com.github.gtache.autosubtitle.subtitle.Subtitle;
import com.github.gtache.autosubtitle.subtitle.SubtitleCollection;
import com.github.gtache.autosubtitle.subtitle.converter.ParseException;
import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverter;
import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverterProvider;
import com.github.gtache.autosubtitle.subtitle.extractor.ExtractEvent;
import com.github.gtache.autosubtitle.subtitle.extractor.ExtractException;
import com.github.gtache.autosubtitle.subtitle.extractor.ExtractOptions;
import com.github.gtache.autosubtitle.subtitle.extractor.SubtitleExtractor;
import com.github.gtache.autosubtitle.subtitle.extractor.SubtitleExtractorListener;
import com.github.gtache.autosubtitle.subtitle.extractor.impl.ExtractEventImpl;
import com.github.gtache.autosubtitle.subtitle.impl.SubtitleImpl;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -34,7 +33,7 @@ import static java.util.Objects.requireNonNull;
/**
* Base implementation of {@link SubtitleExtractor} for Whisper
*/
public abstract class AbstractWhisperSubtitleExtractor implements SubtitleExtractor<Subtitle> {
public abstract class AbstractWhisperSubtitleExtractor implements SubtitleExtractor<SubtitleImpl> {
private static final Logger logger = LogManager.getLogger(AbstractWhisperSubtitleExtractor.class);
@@ -44,14 +43,14 @@ public abstract class AbstractWhisperSubtitleExtractor implements SubtitleExtrac
private static final Pattern TQDM_PROGRESS_PATTERN = Pattern.compile("^(?<progress>\\d{1,3})%\\|.+");
private final Path venvPath;
private final ProcessRunner processRunner;
private final SubtitleConverter converter;
private final SubtitleConverter<SubtitleImpl> converter;
private final OS os;
private final Set<SubtitleExtractorListener> listeners;
protected AbstractWhisperSubtitleExtractor(final Path venvPath, final SubtitleConverterProvider converterProvider,
protected AbstractWhisperSubtitleExtractor(final Path venvPath, final SubtitleConverter<SubtitleImpl> converter,
final ProcessRunner processRunner, final OS os) {
this.venvPath = requireNonNull(venvPath);
this.converter = requireNonNull(converterProvider.getConverter("json"));
this.converter = requireNonNull(converter);
this.processRunner = requireNonNull(processRunner);
this.os = requireNonNull(os);
this.listeners = new HashSet<>();
@@ -78,16 +77,16 @@ public abstract class AbstractWhisperSubtitleExtractor implements SubtitleExtrac
@Override
public SubtitleCollection<Subtitle> extract(final Video video, final ExtractOptions options) throws ExtractException {
public SubtitleCollection<SubtitleImpl> extract(final Video video, final ExtractOptions options) throws ExtractException {
return extract(new AudioOrVideo(video), options);
}
@Override
public SubtitleCollection<Subtitle> extract(final Audio audio, final ExtractOptions options) throws ExtractException {
public SubtitleCollection<SubtitleImpl> extract(final Audio audio, final ExtractOptions options) throws ExtractException {
return extract(new AudioOrVideo(audio), options);
}
private SubtitleCollection<Subtitle> extract(final AudioOrVideo av, final ExtractOptions options) throws ExtractException {
private SubtitleCollection<SubtitleImpl> extract(final AudioOrVideo av, final ExtractOptions options) throws ExtractException {
if (av.inner() instanceof final File f) {
return extract(f.path(), options, av.info().duration());
} else {
@@ -99,7 +98,7 @@ public abstract class AbstractWhisperSubtitleExtractor implements SubtitleExtrac
}
}
private SubtitleCollection<Subtitle> dumpExtract(final AudioOrVideo av, final ExtractOptions options) throws ExtractException, IOException {
private SubtitleCollection<SubtitleImpl> dumpExtract(final AudioOrVideo av, final ExtractOptions options) throws ExtractException, IOException {
final var path = Files.createTempFile(AUTOSUBTITLE, "." + av.info().format());
try (final var in = av.getInputStream()) {
Files.copy(in, path, StandardCopyOption.REPLACE_EXISTING);
@@ -109,7 +108,7 @@ public abstract class AbstractWhisperSubtitleExtractor implements SubtitleExtrac
}
}
private SubtitleCollection<Subtitle> extract(final Path path, final ExtractOptions options, final long duration) throws ExtractException {
private SubtitleCollection<SubtitleImpl> extract(final Path path, final ExtractOptions options, final long duration) throws ExtractException {
try {
final var outputDir = Files.createTempDirectory(AUTOSUBTITLE);
final var args = createArgs(path, options, outputDir);
@@ -137,7 +136,7 @@ public abstract class AbstractWhisperSubtitleExtractor implements SubtitleExtrac
}
}
private SubtitleCollection<Subtitle> parseResult(final Path subtitleFile, final ExtractOptions options) throws ExtractException {
private SubtitleCollection<SubtitleImpl> parseResult(final Path subtitleFile, final ExtractOptions options) throws ExtractException {
try {
return converter.parse(subtitleFile, options.parseOptions());
} catch (final ParseException e) {

View File

@@ -10,5 +10,4 @@ module com.github.gtache.autosubtitle.whisper.common {
exports com.github.gtache.autosubtitle.whisper;
exports com.github.gtache.autosubtitle.setup.whisper;
exports com.github.gtache.autosubtitle.subtitle.extractor.whisper;
exports com.github.gtache.autosubtitle.modules.setup.whisper;
}

View File

@@ -1,23 +0,0 @@
package com.github.gtache.autosubtitle.modules.setup.whisper;
import com.github.gtache.autosubtitle.impl.OS;
import com.github.gtache.autosubtitle.setup.whisper.WhisperSetupConfiguration;
import org.junit.jupiter.api.Test;
import java.nio.file.Path;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.mock;
class TestWhisperCommonSetupModule {
@Test
void testWhisperSetupConfiguration() {
final var root = mock(Path.class);
final var venvPath = mock(Path.class);
final var pythonVersion = "3.10";
final var os = OS.LINUX;
final var expected = new WhisperSetupConfiguration(root, venvPath, pythonVersion, os);
assertEquals(expected, WhisperCommonSetupModule.providesWhisperSetupConfiguration(root, venvPath, pythonVersion, os));
}
}

View File

@@ -1,5 +1,6 @@
package com.github.gtache.autosubtitle.setup.whisper;
import com.github.gtache.autosubtitle.ToolType;
import com.github.gtache.autosubtitle.impl.OS;
import com.github.gtache.autosubtitle.process.ProcessRunner;
import com.github.gtache.autosubtitle.setup.SetupException;
@@ -53,6 +54,11 @@ class TestAbstractWhisperSetupManager {
assertEquals(BUNDLE_INSTALLED, setupManager.getStatus());
}
@Test
void testType() {
assertEquals(ToolType.SUBTITLE_EXTRACTOR, setupManager.type());
}
@Test
void testInstallAlreadyInstalled() throws SetupException {
final var venvPath = Paths.get("path");

View File

@@ -9,17 +9,16 @@ import com.github.gtache.autosubtitle.impl.OS;
import com.github.gtache.autosubtitle.process.ProcessListener;
import com.github.gtache.autosubtitle.process.ProcessResult;
import com.github.gtache.autosubtitle.process.ProcessRunner;
import com.github.gtache.autosubtitle.subtitle.Subtitle;
import com.github.gtache.autosubtitle.subtitle.SubtitleCollection;
import com.github.gtache.autosubtitle.subtitle.converter.ParseException;
import com.github.gtache.autosubtitle.subtitle.converter.ParseOptions;
import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverter;
import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverterProvider;
import com.github.gtache.autosubtitle.subtitle.extractor.ExtractEvent;
import com.github.gtache.autosubtitle.subtitle.extractor.ExtractException;
import com.github.gtache.autosubtitle.subtitle.extractor.ExtractOptions;
import com.github.gtache.autosubtitle.subtitle.extractor.SubtitleExtractorListener;
import com.github.gtache.autosubtitle.subtitle.extractor.impl.ExtractEventImpl;
import com.github.gtache.autosubtitle.subtitle.impl.SubtitleImpl;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -42,8 +41,7 @@ import static org.mockito.Mockito.*;
class TestAbstractWhisperSubtitleExtractor {
private final Path venvPath;
private final SubtitleConverter<Subtitle> converter;
private final SubtitleConverterProvider converterProvider;
private final SubtitleConverter<SubtitleImpl> converter;
private final ProcessRunner processRunner;
private final ProcessListener processListener;
private final ProcessResult processResult;
@@ -54,17 +52,16 @@ class TestAbstractWhisperSubtitleExtractor {
private final VideoInfo videoInfo;
private final ExtractOptions options;
private final ParseOptions parseOptions;
private final SubtitleCollection<Subtitle> collection;
private final SubtitleCollection<SubtitleImpl> collection;
TestAbstractWhisperSubtitleExtractor(@Mock final SubtitleConverterProvider converterProvider, @Mock final SubtitleConverter<Subtitle> converter,
TestAbstractWhisperSubtitleExtractor(@Mock final SubtitleConverter<SubtitleImpl> converter,
@Mock final ProcessRunner processRunner, @Mock final ProcessListener processListener,
@Mock final ProcessResult processResult, @Mock final VideoInfo videoInfo,
@Mock final AudioInfo audioInfo, @Mock final ExtractOptions options,
@Mock final ParseOptions parseOptions, @Mock final SubtitleCollection<Subtitle> collection) {
@Mock final ParseOptions parseOptions, @Mock final SubtitleCollection<SubtitleImpl> collection) {
this.venvPath = Path.of("venv");
this.os = OS.LINUX;
this.converterProvider = Objects.requireNonNull(converterProvider);
this.converter = Objects.requireNonNull(converter);
this.processRunner = Objects.requireNonNull(processRunner);
this.processListener = Objects.requireNonNull(processListener);
@@ -78,13 +75,12 @@ class TestAbstractWhisperSubtitleExtractor {
@BeforeEach
void beforeEach() throws IOException {
doReturn(converter).when(converterProvider).getConverter("json");
when(processRunner.startListen(anyList())).thenReturn(processListener);
when(processListener.join(Duration.ofHours(1))).thenReturn(processResult);
when(audioInfo.format()).thenReturn("mp3");
when(videoInfo.format()).thenReturn("mp4");
when(options.parseOptions()).thenReturn(parseOptions);
this.extractor = new DummyWhisperSubtitleExtractor(venvPath, converterProvider, processRunner, os);
this.extractor = new DummyWhisperSubtitleExtractor(venvPath, converter, processRunner, os);
}
@Test
@@ -200,14 +196,14 @@ class TestAbstractWhisperSubtitleExtractor {
@Test
void testGetPythonPathWindows() {
final var windowsExtractor = new DummyWhisperSubtitleExtractor(venvPath, converterProvider, processRunner, OS.WINDOWS);
final var windowsExtractor = new DummyWhisperSubtitleExtractor(venvPath, converter, processRunner, OS.WINDOWS);
assertEquals(venvPath.resolve("python.exe"), windowsExtractor.getPythonPath());
}
private static final class DummyWhisperSubtitleExtractor extends AbstractWhisperSubtitleExtractor {
private DummyWhisperSubtitleExtractor(final Path venvPath, final SubtitleConverterProvider converterProvider, final ProcessRunner processRunner, final OS os) {
super(venvPath, converterProvider, processRunner, os);
private DummyWhisperSubtitleExtractor(final Path venvPath, final SubtitleConverter<SubtitleImpl> converter, final ProcessRunner processRunner, final OS os) {
super(venvPath, converter, processRunner, os);
}
@Override

View File

@@ -16,9 +16,5 @@
<groupId>com.github.gtache.autosubtitle</groupId>
<artifactId>autosubtitle-whisper-common</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,16 @@
package com.github.gtache.autosubtitle.modules.setup.whisperx;
import javax.inject.Qualifier;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Qualifier
@Documented
@Retention(RUNTIME)
@Target({ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD})
public @interface WhisperX {
}

View File

@@ -0,0 +1,16 @@
package com.github.gtache.autosubtitle.modules.setup.whisperx;
import javax.inject.Qualifier;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Qualifier
@Documented
@Retention(RUNTIME)
@Target({ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD})
public @interface WhisperXBundledRoot {
}

View File

@@ -0,0 +1,16 @@
package com.github.gtache.autosubtitle.modules.setup.whisperx;
import javax.inject.Qualifier;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Qualifier
@Documented
@Retention(RUNTIME)
@Target({ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD})
public @interface WhisperXPythonVersion {
}

View File

@@ -1,43 +1,59 @@
package com.github.gtache.autosubtitle.modules.setup.whisperx;
import com.github.gtache.autosubtitle.impl.OS;
import com.github.gtache.autosubtitle.modules.setup.conda.CondaSetupModule;
import com.github.gtache.autosubtitle.modules.setup.impl.SubtitleExtractorSetup;
import com.github.gtache.autosubtitle.modules.setup.impl.ToolsRoot;
import com.github.gtache.autosubtitle.modules.setup.whisper.PythonVersion;
import com.github.gtache.autosubtitle.modules.setup.whisper.WhisperBundledRoot;
import com.github.gtache.autosubtitle.modules.setup.whisper.WhisperCommonSetupModule;
import com.github.gtache.autosubtitle.modules.setup.whisper.WhisperVenvPath;
import com.github.gtache.autosubtitle.setup.SetupManager;
import com.github.gtache.autosubtitle.setup.whisper.WhisperSetupConfiguration;
import com.github.gtache.autosubtitle.setup.whisperx.WhisperXSetupManager;
import dagger.Binds;
import dagger.Module;
import dagger.Provides;
import dagger.multibindings.IntoMap;
import dagger.multibindings.StringKey;
import java.nio.file.Path;
/**
* Setup module for Whisper
*/
@Module(includes = WhisperCommonSetupModule.class)
@Module(includes = CondaSetupModule.class)
public abstract class WhisperXSetupModule {
@Binds
@SubtitleExtractorSetup
@IntoMap
@StringKey("whisperx")
abstract SetupManager bindsSubtitleExtractorSetupManager(final WhisperXSetupManager manager);
@Binds
@SubtitleExtractorSetup
abstract SetupManager bindsDefaultSubtitleExtractorSetupManager(final WhisperXSetupManager manager);
@Provides
@PythonVersion
@WhisperXPythonVersion
static String providesPythonVersion() {
return "3.10";
}
@Provides
@WhisperBundledRoot
@WhisperXBundledRoot
static Path providesWhisperXBundledRoot(@ToolsRoot final Path root) {
return root.resolve("whisperx");
}
@Provides
@WhisperVenvPath
static Path providesWhisperXVenvPath(@WhisperBundledRoot final Path root) {
@WhisperXVenvPath
static Path providesWhisperXVenvPath(@WhisperXBundledRoot final Path root) {
return root.resolve("whisperx-env");
}
@Provides
@WhisperX
static WhisperSetupConfiguration providesWhisperSetupConfiguration(@WhisperXBundledRoot final Path root,
@WhisperXVenvPath final Path venvPath,
@WhisperXPythonVersion final String pythonVersion,
final OS os) {
return new WhisperSetupConfiguration(root, venvPath, pythonVersion, os);
}
}

View File

@@ -0,0 +1,16 @@
package com.github.gtache.autosubtitle.modules.setup.whisperx;
import javax.inject.Qualifier;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Qualifier
@Documented
@Retention(RUNTIME)
@Target({ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD})
public @interface WhisperXVenvPath {
}

View File

@@ -4,6 +4,8 @@ import com.github.gtache.autosubtitle.subtitle.extractor.SubtitleExtractor;
import com.github.gtache.autosubtitle.subtitle.extractor.whisperx.WhisperXSubtitleExtractor;
import dagger.Binds;
import dagger.Module;
import dagger.multibindings.IntoMap;
import dagger.multibindings.StringKey;
/**
* Dagger module for Whisper
@@ -16,5 +18,10 @@ public abstract class WhisperXExtractorModule {
}
@Binds
abstract SubtitleExtractor bindsSubtitleExtractor(final WhisperXSubtitleExtractor extractor);
@IntoMap
@StringKey("whisperx")
abstract SubtitleExtractor<?> bindsSubtitleExtractor(final WhisperXSubtitleExtractor extractor);
@Binds
abstract SubtitleExtractor providesDefaultSubtitleExtractor(final WhisperXSubtitleExtractor extractor);
}

View File

@@ -1,31 +0,0 @@
package com.github.gtache.autosubtitle.modules.subtitle.parser.json.whisperx;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverter;
import com.github.gtache.autosubtitle.subtitle.parser.json.whisperx.JSONSubtitleConverter;
import dagger.Binds;
import dagger.Module;
import dagger.Provides;
import dagger.multibindings.IntoMap;
import dagger.multibindings.StringKey;
import javax.inject.Singleton;
@Module
public abstract class WhisperXJsonModule {
private WhisperXJsonModule() {
}
@Binds
@IntoMap
@StringKey("json")
abstract SubtitleConverter bindsJSONSubtitleConverter(final JSONSubtitleConverter subtitleConverter);
@Provides
@Singleton
static ObjectMapper providesObjectMapper() {
return new ObjectMapper();
}
}

View File

@@ -2,16 +2,17 @@ package com.github.gtache.autosubtitle.modules.whisperx;
import com.github.gtache.autosubtitle.modules.setup.whisperx.WhisperXSetupModule;
import com.github.gtache.autosubtitle.modules.subtitle.extractor.whisperx.WhisperXExtractorModule;
import com.github.gtache.autosubtitle.modules.subtitle.parser.json.whisperx.WhisperXJsonModule;
import com.github.gtache.autosubtitle.subtitle.extractor.ExtractionModelProvider;
import com.github.gtache.autosubtitle.whisperx.WhisperXExtractionModelProvider;
import dagger.Binds;
import dagger.Module;
import dagger.multibindings.IntoMap;
import dagger.multibindings.StringKey;
/**
* Dagger module for Whisper
*/
@Module(includes = {WhisperXSetupModule.class, WhisperXJsonModule.class, WhisperXExtractorModule.class})
@Module(includes = {WhisperXSetupModule.class, WhisperXExtractorModule.class})
public abstract class WhisperXModule {
private WhisperXModule() {
@@ -19,5 +20,10 @@ public abstract class WhisperXModule {
}
@Binds
@IntoMap
@StringKey("whisperx")
abstract ExtractionModelProvider bindsExtractionModelProvider(final WhisperXExtractionModelProvider provider);
@Binds
abstract ExtractionModelProvider bindsDefaultExtractionModelProvider(final WhisperXExtractionModelProvider provider);
}

View File

@@ -1,7 +1,10 @@
package com.github.gtache.autosubtitle.setup.whisperx;
import com.github.gtache.autosubtitle.modules.setup.whisperx.WhisperX;
import com.github.gtache.autosubtitle.process.ProcessRunner;
import com.github.gtache.autosubtitle.setup.SetupException;
import com.github.gtache.autosubtitle.setup.SetupManager;
import com.github.gtache.autosubtitle.setup.SetupUserBridge;
import com.github.gtache.autosubtitle.setup.conda.CondaSetupManager;
import com.github.gtache.autosubtitle.setup.whisper.AbstractWhisperSetupManager;
import com.github.gtache.autosubtitle.setup.whisper.WhisperSetupConfiguration;
@@ -16,18 +19,22 @@ import java.nio.file.Files;
import java.time.Duration;
import java.util.List;
import static java.util.Objects.requireNonNull;
/**
* {@link com.github.gtache.autosubtitle.setup.SetupManager} for WhisperX
* {@link SetupManager} for WhisperX
*/
@Singleton
public class WhisperXSetupManager extends AbstractWhisperSetupManager {
private static final Logger logger = LogManager.getLogger(WhisperXSetupManager.class);
private final SetupUserBridge setupUserBridge;
@Inject
WhisperXSetupManager(final CondaSetupManager condaSetupManager, final WhisperSetupConfiguration configuration,
final ProcessRunner processRunner, final HttpClient httpClient) {
WhisperXSetupManager(final CondaSetupManager condaSetupManager, @WhisperX final WhisperSetupConfiguration configuration,
final SetupUserBridge setupUserBridge, final ProcessRunner processRunner, final HttpClient httpClient) {
super(condaSetupManager, configuration, processRunner, httpClient);
this.setupUserBridge = requireNonNull(setupUserBridge);
}
@Override
@@ -35,6 +42,7 @@ public class WhisperXSetupManager extends AbstractWhisperSetupManager {
return "WhisperX";
}
@Override
protected void installWhisper() throws SetupException {
final var path = getPythonPath();
@@ -42,6 +50,7 @@ public class WhisperXSetupManager extends AbstractWhisperSetupManager {
logger.info("Installing whisper");
final var result = processRunner().run(List.of(path.toString(), "-m", "pip", "install", "-U", "git+https://github.com/m-bain/whisperx.git", "numpy<2"), Duration.ofMinutes(15));
if (result.exitCode() == 0) {
checkInstallCuda();
logger.info("Whisper installed");
} else {
throw new SetupException("Error installing whisper: " + result.output());
@@ -51,6 +60,12 @@ public class WhisperXSetupManager extends AbstractWhisperSetupManager {
}
}
private void checkInstallCuda() {
if (setupUserBridge.askForUserConfirmation("WhisperX can use CUDA. Do you want to install it?")) {
//TODO install CUDA "conda install cudnn=8"
}
}
@Override
protected boolean isWhisperInstalled() throws SetupException {
final var path = getPythonPath();

View File

@@ -1,4 +1,4 @@
package com.github.gtache.autosubtitle.subtitle.parser.json.whisperx;
package com.github.gtache.autosubtitle.subtitle.converter.json.whisperx;
import java.util.List;

View File

@@ -1,4 +1,4 @@
package com.github.gtache.autosubtitle.subtitle.parser.json.whisperx;
package com.github.gtache.autosubtitle.subtitle.converter.json.whisperx;
public record JSONSubtitleWords(String word, double start, double end, double score) {
}

View File

@@ -1,4 +1,4 @@
package com.github.gtache.autosubtitle.subtitle.parser.json.whisperx;
package com.github.gtache.autosubtitle.subtitle.converter.json.whisperx;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

View File

@@ -1,4 +1,4 @@
package com.github.gtache.autosubtitle.subtitle.parser.json.whisperx;
package com.github.gtache.autosubtitle.subtitle.converter.json.whisperx;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -28,14 +28,14 @@ import java.util.stream.Stream;
* {@link SubtitleConverter} implementation for JSON files
*/
@Singleton
public class JSONSubtitleConverter implements SubtitleConverter<SubtitleImpl> {
public class WhisperXJSONSubtitleConverter implements SubtitleConverter<SubtitleImpl> {
private static final Pattern SPLIT_PATTERN = Pattern.compile("[ \n]+");
private final ObjectMapper mapper;
@Inject
JSONSubtitleConverter(final ObjectMapper mapper) {
WhisperXJSONSubtitleConverter(final ObjectMapper mapper) {
this.mapper = Objects.requireNonNull(mapper);
}

View File

@@ -2,16 +2,15 @@ package com.github.gtache.autosubtitle.subtitle.extractor.whisperx;
import com.github.gtache.autosubtitle.Language;
import com.github.gtache.autosubtitle.impl.OS;
import com.github.gtache.autosubtitle.modules.setup.whisper.WhisperVenvPath;
import com.github.gtache.autosubtitle.modules.setup.whisperx.WhisperXVenvPath;
import com.github.gtache.autosubtitle.process.ProcessRunner;
import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverterProvider;
import com.github.gtache.autosubtitle.subtitle.converter.json.whisperx.WhisperXJSONSubtitleConverter;
import com.github.gtache.autosubtitle.subtitle.extractor.ExtractOptions;
import com.github.gtache.autosubtitle.subtitle.extractor.SubtitleExtractor;
import com.github.gtache.autosubtitle.subtitle.extractor.whisper.AbstractWhisperSubtitleExtractor;
import com.github.gtache.autosubtitle.whisper.WhisperModels;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
@@ -19,12 +18,11 @@ import java.util.List;
/**
* WhisperX implementation of {@link SubtitleExtractor}
*/
@Singleton
public class WhisperXSubtitleExtractor extends AbstractWhisperSubtitleExtractor {
@Inject
WhisperXSubtitleExtractor(@WhisperVenvPath final Path venvPath, final SubtitleConverterProvider converterProvider, final ProcessRunner processRunner, final OS os) {
super(venvPath, converterProvider, processRunner, os);
WhisperXSubtitleExtractor(@WhisperXVenvPath final Path venvPath, final WhisperXJSONSubtitleConverter converter, final ProcessRunner processRunner, final OS os) {
super(venvPath, converter, processRunner, os);
}
@Override

View File

@@ -5,14 +5,12 @@ import com.github.gtache.autosubtitle.subtitle.extractor.ExtractionModelProvider
import com.github.gtache.autosubtitle.whisper.WhisperModels;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.Arrays;
import java.util.List;
/**
* Whisper implementation of {@link ExtractionModelProvider}
*/
@Singleton
public class WhisperXExtractionModelProvider implements ExtractionModelProvider {
@Inject

View File

@@ -3,15 +3,14 @@
*/
module com.github.gtache.autosubtitle.whisperx {
requires transitive com.github.gtache.autosubtitle.whisper.common;
requires transitive com.fasterxml.jackson.databind;
requires org.apache.logging.log4j;
exports com.github.gtache.autosubtitle.whisperx;
exports com.github.gtache.autosubtitle.setup.whisperx;
exports com.github.gtache.autosubtitle.subtitle.converter.json.whisperx;
exports com.github.gtache.autosubtitle.subtitle.extractor.whisperx;
exports com.github.gtache.autosubtitle.modules.whisperx;
exports com.github.gtache.autosubtitle.modules.setup.whisperx;
exports com.github.gtache.autosubtitle.subtitle.extractor.whisperx;
exports com.github.gtache.autosubtitle.modules.subtitle.extractor.whisperx;
exports com.github.gtache.autosubtitle.modules.subtitle.parser.json.whisperx;
exports com.github.gtache.autosubtitle.subtitle.parser.json.whisperx;
}

View File

@@ -1,5 +1,7 @@
package com.github.gtache.autosubtitle.modules.setup.whisperx;
import com.github.gtache.autosubtitle.impl.OS;
import com.github.gtache.autosubtitle.setup.whisper.WhisperSetupConfiguration;
import org.junit.jupiter.api.Test;
import java.nio.file.Paths;
@@ -24,4 +26,17 @@ class TestWhisperXSetupModule {
final var root = Paths.get("root");
assertEquals(root.resolve("whisperx-env"), WhisperXSetupModule.providesWhisperXVenvPath(root));
}
@Test
void testWhisperSetupConfiguration() {
final var root = Paths.get("root");
final var venvPath = Paths.get("venv");
final var pythonVersion = "3.10";
final var os = OS.WINDOWS;
final var configuration = new WhisperSetupConfiguration(root, venvPath, pythonVersion, os);
assertEquals(root, configuration.root());
assertEquals(venvPath, configuration.venvPath());
assertEquals(pythonVersion, configuration.pythonVersion());
assertEquals(os, configuration.os());
}
}

View File

@@ -1,14 +0,0 @@
package com.github.gtache.autosubtitle.modules.subtitle.parser.json.whisperx;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
class TestWhisperXJsonModule {
@Test
void testObjectMapper() {
assertInstanceOf(ObjectMapper.class, WhisperXJsonModule.providesObjectMapper());
}
}

View File

@@ -4,6 +4,7 @@ import com.github.gtache.autosubtitle.impl.OS;
import com.github.gtache.autosubtitle.process.ProcessResult;
import com.github.gtache.autosubtitle.process.ProcessRunner;
import com.github.gtache.autosubtitle.setup.SetupException;
import com.github.gtache.autosubtitle.setup.SetupUserBridge;
import com.github.gtache.autosubtitle.setup.conda.CondaSetupManager;
import com.github.gtache.autosubtitle.setup.whisper.WhisperSetupConfiguration;
import org.junit.jupiter.api.Test;
@@ -30,17 +31,19 @@ class TestWhisperXSetupManager {
private final CondaSetupManager condaSetupManager;
private final ProcessRunner processRunner;
private final SetupUserBridge setupUserBridge;
private final WhisperSetupConfiguration configuration;
private final HttpClient httpClient;
private final WhisperXSetupManager whisperXSetupManager;
TestWhisperXSetupManager(@Mock final CondaSetupManager condaSetupManager, @Mock final WhisperSetupConfiguration configuration,
@Mock final ProcessRunner processRunner, @Mock final HttpClient httpClient) {
@Mock final SetupUserBridge setupUserBridge, @Mock final ProcessRunner processRunner, @Mock final HttpClient httpClient) {
this.condaSetupManager = Objects.requireNonNull(condaSetupManager);
this.processRunner = Objects.requireNonNull(processRunner);
this.setupUserBridge = Objects.requireNonNull(setupUserBridge);
this.configuration = Objects.requireNonNull(configuration);
this.httpClient = Objects.requireNonNull(httpClient);
this.whisperXSetupManager = new WhisperXSetupManager(condaSetupManager, configuration, processRunner, httpClient);
this.whisperXSetupManager = new WhisperXSetupManager(condaSetupManager, configuration, setupUserBridge, processRunner, httpClient);
}
@Test
@@ -115,9 +118,10 @@ class TestWhisperXSetupManager {
@Test
void testIllegal() {
assertThrows(NullPointerException.class, () -> new WhisperXSetupManager(null, configuration, processRunner, httpClient));
assertThrows(NullPointerException.class, () -> new WhisperXSetupManager(condaSetupManager, null, processRunner, httpClient));
assertThrows(NullPointerException.class, () -> new WhisperXSetupManager(condaSetupManager, configuration, null, httpClient));
assertThrows(NullPointerException.class, () -> new WhisperXSetupManager(condaSetupManager, configuration, processRunner, null));
assertThrows(NullPointerException.class, () -> new WhisperXSetupManager(null, configuration, setupUserBridge, processRunner, httpClient));
assertThrows(NullPointerException.class, () -> new WhisperXSetupManager(condaSetupManager, null, setupUserBridge, processRunner, httpClient));
assertThrows(NullPointerException.class, () -> new WhisperXSetupManager(condaSetupManager, configuration, null, processRunner, httpClient));
assertThrows(NullPointerException.class, () -> new WhisperXSetupManager(condaSetupManager, configuration, setupUserBridge, null, httpClient));
assertThrows(NullPointerException.class, () -> new WhisperXSetupManager(condaSetupManager, configuration, setupUserBridge, processRunner, null));
}
}

View File

@@ -1,4 +1,4 @@
package com.github.gtache.autosubtitle.subtitle.parser.json.whisperx;
package com.github.gtache.autosubtitle.subtitle.converter.json.whisperx;
import org.junit.jupiter.api.Test;

View File

@@ -1,4 +1,4 @@
package com.github.gtache.autosubtitle.subtitle.parser.json.whisperx;
package com.github.gtache.autosubtitle.subtitle.converter.json.whisperx;
import org.junit.jupiter.api.Test;

View File

@@ -1,4 +1,4 @@
package com.github.gtache.autosubtitle.subtitle.parser.json.whisperx;
package com.github.gtache.autosubtitle.subtitle.converter.json.whisperx;
import org.junit.jupiter.api.Test;

View File

@@ -1,4 +1,4 @@
package com.github.gtache.autosubtitle.subtitle.parser.json.whisperx;
package com.github.gtache.autosubtitle.subtitle.converter.json.whisperx;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.gtache.autosubtitle.Language;
@@ -27,16 +27,16 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class TestJSONSubtitleConverter {
class TestWhisperXJSONSubtitleConverter {
private final ParseOptions parseOptions;
private final FormatOptions formatOptions;
private final JSONSubtitleConverter converter;
private final WhisperXJSONSubtitleConverter converter;
TestJSONSubtitleConverter(@Mock final ParseOptions parseOptions, @Mock final FormatOptions formatOptions) {
TestWhisperXJSONSubtitleConverter(@Mock final ParseOptions parseOptions, @Mock final FormatOptions formatOptions) {
this.parseOptions = Objects.requireNonNull(parseOptions);
this.formatOptions = Objects.requireNonNull(formatOptions);
this.converter = new JSONSubtitleConverter(new ObjectMapper());
this.converter = new WhisperXJSONSubtitleConverter(new ObjectMapper());
}
@BeforeEach

View File

@@ -3,9 +3,7 @@ package com.github.gtache.autosubtitle.subtitle.extractor.whisperx;
import com.github.gtache.autosubtitle.Language;
import com.github.gtache.autosubtitle.impl.OS;
import com.github.gtache.autosubtitle.process.ProcessRunner;
import com.github.gtache.autosubtitle.subtitle.Subtitle;
import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverter;
import com.github.gtache.autosubtitle.subtitle.converter.SubtitleConverterProvider;
import com.github.gtache.autosubtitle.subtitle.converter.json.whisperx.WhisperXJSONSubtitleConverter;
import com.github.gtache.autosubtitle.subtitle.extractor.ExtractOptions;
import com.github.gtache.autosubtitle.whisper.WhisperModels;
import org.junit.jupiter.api.BeforeEach;
@@ -21,23 +19,20 @@ import java.util.List;
import static java.util.Objects.requireNonNull;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class TestWhisperXSubtitleExtractor {
private final Path venvPath;
private final SubtitleConverterProvider converterProvider;
private final SubtitleConverter<Subtitle> converter;
private final WhisperXJSONSubtitleConverter converter;
private final ProcessRunner processRunner;
private final ExtractOptions options;
private final OS os;
private WhisperXSubtitleExtractor whisperXSubtitleExtractor;
TestWhisperXSubtitleExtractor(@Mock final SubtitleConverterProvider converterProvider, @Mock final SubtitleConverter<Subtitle> converter,
TestWhisperXSubtitleExtractor(@Mock final WhisperXJSONSubtitleConverter converter,
@Mock final ProcessRunner processRunner, @Mock final ExtractOptions options) {
this.converterProvider = requireNonNull(converterProvider);
this.converter = requireNonNull(converter);
this.processRunner = requireNonNull(processRunner);
this.options = requireNonNull(options);
@@ -47,8 +42,7 @@ class TestWhisperXSubtitleExtractor {
@BeforeEach
void beforeEach() {
doReturn(converter).when(converterProvider).getConverter("json");
this.whisperXSubtitleExtractor = new WhisperXSubtitleExtractor(venvPath, converterProvider, processRunner, os);
this.whisperXSubtitleExtractor = new WhisperXSubtitleExtractor(venvPath, converter, processRunner, os);
}
@Test
@@ -97,9 +91,9 @@ class TestWhisperXSubtitleExtractor {
@Test
void testIllegal() {
assertThrows(NullPointerException.class, () -> new WhisperXSubtitleExtractor(null, converterProvider, processRunner, os));
assertThrows(NullPointerException.class, () -> new WhisperXSubtitleExtractor(null, converter, processRunner, os));
assertThrows(NullPointerException.class, () -> new WhisperXSubtitleExtractor(venvPath, null, processRunner, os));
assertThrows(NullPointerException.class, () -> new WhisperXSubtitleExtractor(venvPath, converterProvider, null, os));
assertThrows(NullPointerException.class, () -> new WhisperXSubtitleExtractor(venvPath, converterProvider, processRunner, null));
assertThrows(NullPointerException.class, () -> new WhisperXSubtitleExtractor(venvPath, converter, null, os));
assertThrows(NullPointerException.class, () -> new WhisperXSubtitleExtractor(venvPath, converter, processRunner, null));
}
}