Browse Source

fix plex scanner crash (#1192)

pull/1193/head
Jason Dove 3 years ago committed by GitHub
parent
commit
40e79a3a14
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 21
      ErsatzTV.Infrastructure/Data/Repositories/PlexTelevisionRepository.cs
  2. 15
      ErsatzTV.Infrastructure/Plex/PlexServerApiClient.cs

21
ErsatzTV.Infrastructure/Data/Repositories/PlexTelevisionRepository.cs

@ -254,7 +254,11 @@ public class PlexTelevisionRepository : IPlexTelevisionRepository
// deepScan isn't needed here since we create our own plex etags // deepScan isn't needed here since we create our own plex etags
if (plexEpisode.Etag != item.Etag) if (plexEpisode.Etag != item.Etag)
{ {
await UpdateEpisodePath(dbContext, plexEpisode, item); foreach (BaseError error in await UpdateEpisodePath(dbContext, plexEpisode, item))
{
return error;
}
result.IsUpdated = true; result.IsUpdated = true;
} }
@ -465,7 +469,12 @@ public class PlexTelevisionRepository : IPlexTelevisionRepository
} }
} }
private async Task UpdateEpisodePath(TvContext dbContext, PlexEpisode existing, PlexEpisode incoming) private async Task<Option<BaseError>> UpdateEpisodePath(
TvContext dbContext,
PlexEpisode existing,
PlexEpisode incoming)
{
try
{ {
// library path is used for search indexing later // library path is used for search indexing later
incoming.LibraryPath = existing.LibraryPath; incoming.LibraryPath = existing.LibraryPath;
@ -493,9 +502,15 @@ public class PlexTelevisionRepository : IPlexTelevisionRepository
file.Path = incomingFile.Path; file.Path = incomingFile.Path;
await dbContext.Connection.ExecuteAsync( await dbContext.Connection.ExecuteAsync(
@"UPDATE MediaFile SET Path = @Path WHERE Id = @Id", @"UPDATE MediaFile SET Path = @Path WHERE Id = @Id",
new { file.Path, file.Id }); new { file.Path, file.Id });
return Option<BaseError>.None;
}
catch (Exception)
{
return BaseError.New("Failed to update episode path");
}
} }
} }

15
ErsatzTV.Infrastructure/Plex/PlexServerApiClient.cs

@ -180,7 +180,7 @@ public class PlexServerApiClient : IPlexServerApiClient
{ {
return xmlService.GetSeasonChildren(seasonMetadataKey, skip, pageSize, token.AuthToken) return xmlService.GetSeasonChildren(seasonMetadataKey, skip, pageSize, token.AuthToken)
.Map(r => r.Metadata.Filter(m => m.Media.Count > 0 && m.Media[0].Part.Count > 0)) .Map(r => r.Metadata.Filter(m => m.Media.Count > 0 && m.Media[0].Part.Count > 0))
.Map(list => list.Map(metadata => ProjectToEpisode(metadata, library.MediaSourceId))); .Map(list => list.Bind(metadata => ProjectToEpisodes(metadata, library.MediaSourceId)));
} }
return GetPagedLibraryContents(connection, CountItems, GetItems); return GetPagedLibraryContents(connection, CountItems, GetItems);
@ -814,9 +814,13 @@ public class PlexServerApiClient : IPlexServerApiClient
return season; return season;
} }
private PlexEpisode ProjectToEpisode(PlexXmlMetadataResponse response, int mediaSourceId) private IEnumerable<PlexEpisode> ProjectToEpisodes(PlexXmlMetadataResponse response, int mediaSourceId)
{
var result = new List<PlexEpisode>();
// TODO: actually use all media records
foreach (PlexMediaResponse<PlexXmlPartResponse> media in response.Media.HeadOrNone())
{ {
PlexMediaResponse<PlexXmlPartResponse> media = response.Media.Head();
PlexXmlPartResponse part = media.Part.Head(); PlexXmlPartResponse part = media.Part.Head();
DateTime dateAdded = DateTimeOffset.FromUnixTimeSeconds(response.AddedAt).DateTime; DateTime dateAdded = DateTimeOffset.FromUnixTimeSeconds(response.AddedAt).DateTime;
DateTime lastWriteTime = DateTimeOffset.FromUnixTimeSeconds(response.UpdatedAt).DateTime; DateTime lastWriteTime = DateTimeOffset.FromUnixTimeSeconds(response.UpdatedAt).DateTime;
@ -852,7 +856,10 @@ public class PlexServerApiClient : IPlexServerApiClient
TraktListItems = new List<TraktListItem>() TraktListItems = new List<TraktListItem>()
}; };
return episode; result.Add(episode);
}
return result;
} }
private EpisodeMetadata ProjectToEpisodeMetadata(PlexMetadataResponse response, int mediaSourceId) private EpisodeMetadata ProjectToEpisodeMetadata(PlexMetadataResponse response, int mediaSourceId)

Loading…
Cancel
Save