|
|
|
@ -1,4 +1,5 @@ |
|
|
|
using ErsatzTV.Core.Domain; |
|
|
|
using ErsatzTV.Core.Domain; |
|
|
|
|
|
|
|
using ErsatzTV.Core.Extensions; |
|
|
|
using ErsatzTV.Core.Interfaces.Jellyfin; |
|
|
|
using ErsatzTV.Core.Interfaces.Jellyfin; |
|
|
|
using ErsatzTV.Core.Interfaces.Metadata; |
|
|
|
using ErsatzTV.Core.Interfaces.Metadata; |
|
|
|
using ErsatzTV.Core.Interfaces.Repositories; |
|
|
|
using ErsatzTV.Core.Interfaces.Repositories; |
|
|
|
@ -17,6 +18,7 @@ public class JellyfinMovieLibraryScanner : IJellyfinMovieLibraryScanner |
|
|
|
private readonly ILocalStatisticsProvider _localStatisticsProvider; |
|
|
|
private readonly ILocalStatisticsProvider _localStatisticsProvider; |
|
|
|
private readonly ILogger<JellyfinMovieLibraryScanner> _logger; |
|
|
|
private readonly ILogger<JellyfinMovieLibraryScanner> _logger; |
|
|
|
private readonly IMediaSourceRepository _mediaSourceRepository; |
|
|
|
private readonly IMediaSourceRepository _mediaSourceRepository; |
|
|
|
|
|
|
|
private readonly IMetadataRepository _metadataRepository; |
|
|
|
private readonly IMediator _mediator; |
|
|
|
private readonly IMediator _mediator; |
|
|
|
private readonly IMovieRepository _movieRepository; |
|
|
|
private readonly IMovieRepository _movieRepository; |
|
|
|
private readonly IJellyfinPathReplacementService _pathReplacementService; |
|
|
|
private readonly IJellyfinPathReplacementService _pathReplacementService; |
|
|
|
@ -31,6 +33,7 @@ public class JellyfinMovieLibraryScanner : IJellyfinMovieLibraryScanner |
|
|
|
ISearchRepository searchRepository, |
|
|
|
ISearchRepository searchRepository, |
|
|
|
IJellyfinPathReplacementService pathReplacementService, |
|
|
|
IJellyfinPathReplacementService pathReplacementService, |
|
|
|
IMediaSourceRepository mediaSourceRepository, |
|
|
|
IMediaSourceRepository mediaSourceRepository, |
|
|
|
|
|
|
|
IMetadataRepository metadataRepository, |
|
|
|
ILocalFileSystem localFileSystem, |
|
|
|
ILocalFileSystem localFileSystem, |
|
|
|
ILocalStatisticsProvider localStatisticsProvider, |
|
|
|
ILocalStatisticsProvider localStatisticsProvider, |
|
|
|
ILogger<JellyfinMovieLibraryScanner> logger) |
|
|
|
ILogger<JellyfinMovieLibraryScanner> logger) |
|
|
|
@ -42,6 +45,7 @@ public class JellyfinMovieLibraryScanner : IJellyfinMovieLibraryScanner |
|
|
|
_searchRepository = searchRepository; |
|
|
|
_searchRepository = searchRepository; |
|
|
|
_pathReplacementService = pathReplacementService; |
|
|
|
_pathReplacementService = pathReplacementService; |
|
|
|
_mediaSourceRepository = mediaSourceRepository; |
|
|
|
_mediaSourceRepository = mediaSourceRepository; |
|
|
|
|
|
|
|
_metadataRepository = metadataRepository; |
|
|
|
_localFileSystem = localFileSystem; |
|
|
|
_localFileSystem = localFileSystem; |
|
|
|
_localStatisticsProvider = localStatisticsProvider; |
|
|
|
_localStatisticsProvider = localStatisticsProvider; |
|
|
|
_logger = logger; |
|
|
|
_logger = logger; |
|
|
|
@ -178,6 +182,11 @@ public class JellyfinMovieLibraryScanner : IJellyfinMovieLibraryScanner |
|
|
|
ffprobePath, |
|
|
|
ffprobePath, |
|
|
|
incomingMovie, |
|
|
|
incomingMovie, |
|
|
|
localPath); |
|
|
|
localPath); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (refreshResult.Map(t => t).IfLeft(false)) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
refreshResult = await UpdateSubtitles(incomingMovie); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
await refreshResult.Match( |
|
|
|
await refreshResult.Match( |
|
|
|
async _ => |
|
|
|
async _ => |
|
|
|
@ -229,4 +238,45 @@ public class JellyfinMovieLibraryScanner : IJellyfinMovieLibraryScanner |
|
|
|
_searchIndex.Commit(); |
|
|
|
_searchIndex.Commit(); |
|
|
|
return Unit.Default; |
|
|
|
return Unit.Default; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private async Task<Either<BaseError, bool>> UpdateSubtitles(JellyfinMovie movie) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
try |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
foreach (MovieMetadata metadata in movie.MovieMetadata) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
MediaVersion version = movie.GetHeadVersion(); |
|
|
|
|
|
|
|
var subtitleStreams = version.Streams |
|
|
|
|
|
|
|
.Filter(s => s.MediaStreamKind == MediaStreamKind.Subtitle) |
|
|
|
|
|
|
|
.ToList(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var subtitles = new List<Subtitle>(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
foreach (MediaStream stream in subtitleStreams) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
var subtitle = new Subtitle |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
Codec = stream.Codec, |
|
|
|
|
|
|
|
Default = stream.Default, |
|
|
|
|
|
|
|
Forced = stream.Forced, |
|
|
|
|
|
|
|
Language = stream.Language, |
|
|
|
|
|
|
|
StreamIndex = stream.Index, |
|
|
|
|
|
|
|
SubtitleKind = SubtitleKind.Embedded, |
|
|
|
|
|
|
|
DateAdded = DateTime.UtcNow, |
|
|
|
|
|
|
|
DateUpdated = DateTime.UtcNow |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
subtitles.Add(subtitle); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return await _metadataRepository.UpdateSubtitles(metadata, subtitles); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
catch (Exception ex) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
return BaseError.New(ex.ToString()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|