fix: implement new subtitle extraction paths for new JF/Emby scanners
Some checks are pending
Build / build (push) Waiting to run

This commit is contained in:
Christian Benincasa 2026-04-19 09:20:30 -04:00
parent 5db34080a4
commit 2c8dd5f059
5 changed files with 48 additions and 7 deletions

View file

@ -4,8 +4,10 @@ import { IProgramDB } from '../../db/interfaces/IProgramDB.ts';
import { MediaSourceDB } from '../../db/mediaSourceDB.ts';
import { MediaSourceType } from '../../db/schema/base.ts';
import { MediaSourceWithRelations } from '../../db/schema/derivedTypes.ts';
import { QueryResult } from '../../external/BaseApiClient.ts';
import { EmbyApiClient } from '../../external/emby/EmbyApiClient.ts';
import { MediaSourceApiFactory } from '../../external/MediaSourceApiFactory.ts';
import { ExternalSubtitleDownloader } from '../../stream/ExternalSubtitleDownloader.ts';
import { WrappedError } from '../../types/errors.ts';
import { KEYS } from '../../types/inject.ts';
import { EmbyT } from '../../types/internal.ts';
@ -13,9 +15,10 @@ import { EmbyMusicVideo } from '../../types/Media.ts';
import { Result } from '../../types/result.ts';
import { Logger } from '../../util/logging/LoggerFactory.ts';
import { MeilisearchService } from '../MeilisearchService.ts';
import { EmbyScanUtil } from './EmbyScanUtil.ts';
import { MediaSourceMusicVideoScanner } from './MediaSourceMusicVideoScanner.ts';
import { MediaSourceProgressService } from './MediaSourceProgressService.ts';
import { ScanContext } from './MediaSourceScanner.ts';
import { GetSubtitlesRequest, ScanContext } from './MediaSourceScanner.ts';
@injectable()
export class EmbyMediaSourceMusicVideoScanner extends MediaSourceMusicVideoScanner<
@ -37,6 +40,8 @@ export class EmbyMediaSourceMusicVideoScanner extends MediaSourceMusicVideoScann
mediaSourceProgressService: MediaSourceProgressService,
@inject(KEYS.ProgramDaoMinterFactory)
programMinterFactory: interfaces.AutoFactory<ProgramDaoMinter>,
@inject(ExternalSubtitleDownloader)
externalSubtitleDownloader: ExternalSubtitleDownloader,
) {
super(
logger,
@ -45,6 +50,7 @@ export class EmbyMediaSourceMusicVideoScanner extends MediaSourceMusicVideoScann
searchService,
mediaSourceProgressService,
programMinterFactory(),
externalSubtitleDownloader,
);
}
@ -94,4 +100,11 @@ export class EmbyMediaSourceMusicVideoScanner extends MediaSourceMusicVideoScann
protected getExternalKey(video: EmbyMusicVideo): string {
return video.externalId;
}
protected getSubtitles(
context: ScanContext<EmbyApiClient>,
request: GetSubtitlesRequest,
): Promise<QueryResult<string>> {
return EmbyScanUtil.getSubtitles(context, request);
}
}

View file

@ -4,8 +4,10 @@ import { ProgramDaoMinter } from '../../db/converters/ProgramMinter.ts';
import { IProgramDB } from '../../db/interfaces/IProgramDB.ts';
import { MediaSourceDB } from '../../db/mediaSourceDB.ts';
import type { MediaSourceWithRelations } from '../../db/schema/derivedTypes.ts';
import { QueryResult } from '../../external/BaseApiClient.ts';
import { EmbyApiClient } from '../../external/emby/EmbyApiClient.ts';
import { MediaSourceApiFactory } from '../../external/MediaSourceApiFactory.ts';
import { ExternalSubtitleDownloader } from '../../stream/ExternalSubtitleDownloader.ts';
import { WrappedError } from '../../types/errors.ts';
import { KEYS } from '../../types/inject.ts';
import type { EmbyT } from '../../types/internal.ts';
@ -13,9 +15,10 @@ import type { EmbyOtherVideo } from '../../types/Media.ts';
import { Result } from '../../types/result.ts';
import { Logger } from '../../util/logging/LoggerFactory.ts';
import { MeilisearchService } from '../MeilisearchService.ts';
import { EmbyScanUtil } from './EmbyScanUtil.ts';
import { MediaSourceOtherVideoScanner } from './MediaSourceOtherVideoScanner.ts';
import { MediaSourceProgressService } from './MediaSourceProgressService.ts';
import type { ScanContext } from './MediaSourceScanner.ts';
import type { GetSubtitlesRequest, ScanContext } from './MediaSourceScanner.ts';
@injectable()
export class EmbyMediaSourceOtherVideoScanner extends MediaSourceOtherVideoScanner<
@ -37,6 +40,8 @@ export class EmbyMediaSourceOtherVideoScanner extends MediaSourceOtherVideoScann
mediaSourceProgressService: MediaSourceProgressService,
@inject(KEYS.ProgramDaoMinterFactory)
programMinterFactory: interfaces.AutoFactory<ProgramDaoMinter>,
@inject(ExternalSubtitleDownloader)
externalSubtitleDownloader: ExternalSubtitleDownloader,
) {
super(
logger,
@ -45,6 +50,7 @@ export class EmbyMediaSourceOtherVideoScanner extends MediaSourceOtherVideoScann
searchService,
mediaSourceProgressService,
programMinterFactory(),
externalSubtitleDownloader,
);
}
@ -94,4 +100,11 @@ export class EmbyMediaSourceOtherVideoScanner extends MediaSourceOtherVideoScann
protected getExternalKey(video: EmbyOtherVideo): string {
return video.externalId;
}
protected getSubtitles(
context: ScanContext<EmbyApiClient>,
request: GetSubtitlesRequest,
): Promise<QueryResult<string>> {
return EmbyScanUtil.getSubtitles(context, request);
}
}

View file

@ -4,8 +4,10 @@ import { IProgramDB } from '../../db/interfaces/IProgramDB.ts';
import { MediaSourceDB } from '../../db/mediaSourceDB.ts';
import { MediaSourceType } from '../../db/schema/base.ts';
import { MediaSourceWithRelations } from '../../db/schema/derivedTypes.ts';
import { QueryResult } from '../../external/BaseApiClient.ts';
import { JellyfinApiClient } from '../../external/jellyfin/JellyfinApiClient.ts';
import { MediaSourceApiFactory } from '../../external/MediaSourceApiFactory.ts';
import { ExternalSubtitleDownloader } from '../../stream/ExternalSubtitleDownloader.ts';
import { WrappedError } from '../../types/errors.ts';
import { KEYS } from '../../types/inject.ts';
import { JellyfinT } from '../../types/internal.ts';
@ -13,9 +15,10 @@ import { JellyfinMusicVideo } from '../../types/Media.ts';
import { Result } from '../../types/result.ts';
import { Logger } from '../../util/logging/LoggerFactory.ts';
import { MeilisearchService } from '../MeilisearchService.ts';
import { JellyfinScanUtil } from './JellyfinScanUtil.ts';
import { MediaSourceMusicVideoScanner } from './MediaSourceMusicVideoScanner.ts';
import { MediaSourceProgressService } from './MediaSourceProgressService.ts';
import { ScanContext } from './MediaSourceScanner.ts';
import { GetSubtitlesRequest, ScanContext } from './MediaSourceScanner.ts';
@injectable()
export class JellyfinMediaSourceMusicVideoScanner extends MediaSourceMusicVideoScanner<
@ -37,6 +40,8 @@ export class JellyfinMediaSourceMusicVideoScanner extends MediaSourceMusicVideoS
mediaSourceProgressService: MediaSourceProgressService,
@inject(KEYS.ProgramDaoMinterFactory)
programMinterFactory: interfaces.AutoFactory<ProgramDaoMinter>,
@inject(ExternalSubtitleDownloader)
externalSubtitleDownloader: ExternalSubtitleDownloader,
) {
super(
logger,
@ -45,6 +50,7 @@ export class JellyfinMediaSourceMusicVideoScanner extends MediaSourceMusicVideoS
searchService,
mediaSourceProgressService,
programMinterFactory(),
externalSubtitleDownloader,
);
}
@ -101,4 +107,11 @@ export class JellyfinMediaSourceMusicVideoScanner extends MediaSourceMusicVideoS
protected getExternalKey(video: JellyfinMusicVideo): string {
return video.externalId;
}
protected getSubtitles(
context: ScanContext<JellyfinApiClient>,
request: GetSubtitlesRequest,
): Promise<QueryResult<string>> {
return JellyfinScanUtil.getSubtitles(context, request);
}
}

View file

@ -6,6 +6,7 @@ import type { MediaSourceDB } from '../../db/mediaSourceDB.ts';
import type { RemoteMediaSourceType } from '../../db/schema/MediaSource.ts';
import { ProgramType } from '../../db/schema/Program.ts';
import type { MediaSourceApiClient } from '../../external/MediaSourceApiClient.ts';
import type { ExternalSubtitleDownloader } from '../../stream/ExternalSubtitleDownloader.ts';
import type { HasMediaSourceInfo } from '../../types/Media.ts';
import { Result } from '../../types/result.ts';
import type { Logger } from '../../util/logging/LoggerFactory.ts';
@ -34,8 +35,9 @@ export abstract class MediaSourceMusicVideoScanner<
private searchService: MeilisearchService,
private mediaSourceProgressService: MediaSourceProgressService,
protected programMinter: ProgramDaoMinter,
externalSubtitleDownloader: ExternalSubtitleDownloader,
) {
super(logger, mediaSourceDB);
super(logger, mediaSourceDB, externalSubtitleDownloader);
}
protected async scanInternal(

View file

@ -230,9 +230,9 @@ export class SubtitleExtractorTask extends Task2<
const filePath = getSubtitleCacheFilePath(
{
externalKey: program.program.externalKey,
externalSourceId: tag(program.program.externalSourceId),
externalSourceType: program.program.externalSourceType,
externalKey: program.program.externalId,
externalSourceId: tag(program.program.mediaSourceId),
externalSourceType: program.program.sourceType,
id: program.uniqueId,
},
{ streamIndex: subtitle.index, codec: subtitle.codec },