Browse Source

sync chapter markers from plex (#1166)

pull/1168/head
Jason Dove 3 years ago committed by GitHub
parent
commit
900e9e75f3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 4
      ErsatzTV.Core/Scheduling/PlayoutModeSchedulerBase.cs
  2. 2
      ErsatzTV.Infrastructure/Plex/IPlexServerApi.cs
  3. 18
      ErsatzTV.Infrastructure/Plex/Models/PlexChapterResponse.cs
  4. 3
      ErsatzTV.Infrastructure/Plex/Models/PlexMetadataResponse.cs
  5. 10
      ErsatzTV.Infrastructure/Plex/PlexServerApiClient.cs
  6. 5
      ErsatzTV.Scanner/Core/Metadata/MediaServerMovieLibraryScanner.cs
  7. 5
      ErsatzTV.Scanner/Core/Metadata/MediaServerTelevisionLibraryScanner.cs

4
ErsatzTV.Core/Scheduling/PlayoutModeSchedulerBase.cs

@ -178,7 +178,7 @@ public abstract class PlayoutModeSchedulerBase<T> : IPlayoutModeScheduler<T> whe @@ -178,7 +178,7 @@ public abstract class PlayoutModeSchedulerBase<T> : IPlayoutModeScheduler<T> whe
protected static List<MediaChapter> ChaptersForMediaItem(MediaItem mediaItem)
{
MediaVersion version = mediaItem.GetHeadVersion();
return version.Chapters;
return Optional(version.Chapters).Flatten().OrderBy(c => c.StartTime).ToList();
}
protected void LogScheduledItem(
@ -533,7 +533,7 @@ public abstract class PlayoutModeSchedulerBase<T> : IPlayoutModeScheduler<T> whe @@ -533,7 +533,7 @@ public abstract class PlayoutModeSchedulerBase<T> : IPlayoutModeScheduler<T> whe
remainingToFill,
FillerKind.MidRoll,
padFiller.AllowWatermarks));
TimeSpan average = effectiveChapters.Count == 0
TimeSpan average = effectiveChapters.Count <= 1
? remainingToFill
: remainingToFill / (effectiveChapters.Count - 1);
TimeSpan filled = TimeSpan.Zero;

2
ErsatzTV.Infrastructure/Plex/IPlexServerApi.cs

@ -36,7 +36,7 @@ public interface IPlexServerApi @@ -36,7 +36,7 @@ public interface IPlexServerApi
[Query] [AliasAs("X-Plex-Token")]
string token);
[Get("/library/metadata/{key}")]
[Get("/library/metadata/{key}?includeChapters=1")]
[Headers("Accept: text/xml")]
public Task<PlexXmlVideoMetadataResponseContainer>
GetVideoMetadata(

18
ErsatzTV.Infrastructure/Plex/Models/PlexChapterResponse.cs

@ -0,0 +1,18 @@ @@ -0,0 +1,18 @@
using System.Xml.Serialization;
namespace ErsatzTV.Infrastructure.Plex.Models;
public class PlexChapterResponse
{
[XmlAttribute("id")]
public int Id { get; set; }
[XmlAttribute("index")]
public int Index { get; set; }
[XmlAttribute("startTimeOffset")]
public long StartTimeOffset { get; set; }
[XmlAttribute("endTimeOffset")]
public long EndTimeOffset { get; set; }
}

3
ErsatzTV.Infrastructure/Plex/Models/PlexMetadataResponse.cs

@ -75,4 +75,7 @@ public class PlexMetadataResponse @@ -75,4 +75,7 @@ public class PlexMetadataResponse
[XmlElement("Collection")]
public List<PlexCollectionResponse> Collection { get; set; }
[XmlElement("Chapter")]
public List<PlexChapterResponse> Chapters { get; set; }
}

10
ErsatzTV.Infrastructure/Plex/PlexServerApiClient.cs

@ -567,7 +567,7 @@ public class PlexServerApiClient : IPlexServerApiClient @@ -567,7 +567,7 @@ public class PlexServerApiClient : IPlexServerApiClient
DisplayAspectRatio = media.AspectRatio == 0
? string.Empty
: media.AspectRatio.ToString("0.00###", CultureInfo.InvariantCulture),
Chapters = new List<MediaChapter>() // TODO: `?includeChapters=1`
Chapters = Optional(response.Chapters).Flatten().Map(ProjectToModel).ToList()
};
version.Streams.Add(
@ -943,6 +943,14 @@ public class PlexServerApiClient : IPlexServerApiClient @@ -943,6 +943,14 @@ public class PlexServerApiClient : IPlexServerApiClient
return actor;
}
private static MediaChapter ProjectToModel(PlexChapterResponse chapter) =>
new()
{
ChapterId = chapter.Index,
StartTime = TimeSpan.FromMilliseconds(chapter.StartTimeOffset),
EndTime = TimeSpan.FromMilliseconds(chapter.EndTimeOffset)
};
private Option<string> NormalizeGuid(string guid)
{
if (guid.StartsWith("plex://show") ||

5
ErsatzTV.Scanner/Core/Metadata/MediaServerMovieLibraryScanner.cs

@ -167,6 +167,7 @@ public abstract class MediaServerMovieLibraryScanner<TConnectionParameters, TLib @@ -167,6 +167,7 @@ public abstract class MediaServerMovieLibraryScanner<TConnectionParameters, TLib
library,
existing,
incoming,
deepScan,
ffmpegPath,
ffprobePath,
None))
@ -391,6 +392,7 @@ public abstract class MediaServerMovieLibraryScanner<TConnectionParameters, TLib @@ -391,6 +392,7 @@ public abstract class MediaServerMovieLibraryScanner<TConnectionParameters, TLib
library,
result,
incoming,
deepScan,
string.Empty,
string.Empty,
mediaVersion);
@ -437,13 +439,14 @@ public abstract class MediaServerMovieLibraryScanner<TConnectionParameters, TLib @@ -437,13 +439,14 @@ public abstract class MediaServerMovieLibraryScanner<TConnectionParameters, TLib
TLibrary library,
MediaItemScanResult<TMovie> result,
TMovie incoming,
bool deepScan,
string ffmpegPath,
string ffprobePath,
Option<MediaVersion> maybeMediaVersion)
{
TMovie existing = result.Item;
if (result.IsAdded || MediaServerEtag(existing) != MediaServerEtag(incoming) ||
if (deepScan || result.IsAdded || MediaServerEtag(existing) != MediaServerEtag(incoming) ||
existing.MediaVersions.Head().Streams.Count == 0)
{
if (maybeMediaVersion.IsNone && _localFileSystem.FileExists(result.LocalPath))

5
ErsatzTV.Scanner/Core/Metadata/MediaServerTelevisionLibraryScanner.cs

@ -493,6 +493,7 @@ public abstract class MediaServerTelevisionLibraryScanner<TConnectionParameters, @@ -493,6 +493,7 @@ public abstract class MediaServerTelevisionLibraryScanner<TConnectionParameters,
library,
existing,
incoming,
deepScan,
ffmpegPath,
ffprobePath,
None))
@ -725,6 +726,7 @@ public abstract class MediaServerTelevisionLibraryScanner<TConnectionParameters, @@ -725,6 +726,7 @@ public abstract class MediaServerTelevisionLibraryScanner<TConnectionParameters,
library,
result,
incoming,
deepScan,
string.Empty,
string.Empty,
mediaVersion);
@ -771,13 +773,14 @@ public abstract class MediaServerTelevisionLibraryScanner<TConnectionParameters, @@ -771,13 +773,14 @@ public abstract class MediaServerTelevisionLibraryScanner<TConnectionParameters,
TLibrary library,
MediaItemScanResult<TEpisode> result,
TEpisode incoming,
bool deepScan,
string ffmpegPath,
string ffprobePath,
Option<MediaVersion> maybeMediaVersion)
{
TEpisode existing = result.Item;
if (result.IsAdded || MediaServerEtag(existing) != MediaServerEtag(incoming) ||
if (deepScan || result.IsAdded || MediaServerEtag(existing) != MediaServerEtag(incoming) ||
existing.MediaVersions.Head().Streams.Count == 0)
{
if (maybeMediaVersion.IsNone && _localFileSystem.FileExists(result.LocalPath))

Loading…
Cancel
Save