add jellyfin media source (#185)

* wip

* start to add jellyfin tables to db

* code cleanup

* finish adding jellyfin media source

* sync jellyfin libraries

* display list of jellyfin libraries

* toggle jellyfin library sync

* edit jellyfin path replacements

* noop jellyfin scanners

* get jellyfin admin user id on startup

* implement jellyfin disconnect

* add jellyfin libraries to list; start to query jellyfin library items

* code cleanup

* start to project jellyfin movies

* save new jellyfin movies to db

* basic jellyfin movie update

* load jellyfin actor artwork

* load jellyfin movie poster and fan art

* more jellyfin artwork fixes, sync audio streams

* jellyfin playback sort of works

* skip jellyfin movies that are inaccessible

* use ffprobe for jellyfin movie statistics

* code cleanup

* store jellyfin operating system

* more jellyfin movie updates

* update jellyfin movie poster and fan art

* add jellyfin tv types

* sync jellyfin shows

* sync jellyfin seasons

* sync jellyfin episodes

* remove missing jellyfin television items

* delete empty jellyfin seasons and shows

* fix jellyfin updates

* fix indexing jellyfin movie and show languages
This commit is contained in:
Jason Dove
2021-05-15 13:14:17 -05:00
committed by GitHub
parent 27e0a70d93
commit 4d86250630
132 changed files with 17318 additions and 106 deletions
@@ -0,0 +1,7 @@
namespace ErsatzTV.Infrastructure.Jellyfin.Models
{
public class JellyfinImageTagsResponse
{
public string Primary { get; set; }
}
}
@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
namespace ErsatzTV.Infrastructure.Jellyfin.Models
{
public class JellyfinLibraryItemResponse
{
public string Name { get; set; }
public string Id { get; set; }
public string Etag { get; set; }
public string Path { get; set; }
public DateTimeOffset DateCreated { get; set; }
public long RunTimeTicks { get; set; }
public List<string> Genres { get; set; }
public List<string> Tags { get; set; }
public int ProductionYear { get; set; }
public string PremiereDate { get; set; }
public List<JellyfinMediaStreamResponse> MediaStreams { get; set; }
public string LocationType { get; set; }
public string Overview { get; set; }
public List<string> Taglines { get; set; }
public List<JellyfinStudioResponse> Studios { get; set; }
public List<JellyfinPersonResponse> People { get; set; }
public JellyfinImageTagsResponse ImageTags { get; set; }
public List<string> BackdropImageTags { get; set; }
public int? IndexNumber { get; set; }
}
}
@@ -0,0 +1,9 @@
using System.Collections.Generic;
namespace ErsatzTV.Infrastructure.Jellyfin.Models
{
public class JellyfinLibraryItemsResponse
{
public List<JellyfinLibraryItemResponse> Items { get; set; }
}
}
@@ -0,0 +1,9 @@
namespace ErsatzTV.Infrastructure.Jellyfin.Models
{
public class JellyfinLibraryResponse
{
public string Name { get; set; }
public string CollectionType { get; set; }
public string ItemId { get; set; }
}
}
@@ -0,0 +1,18 @@
namespace ErsatzTV.Infrastructure.Jellyfin.Models
{
public class JellyfinMediaStreamResponse
{
public string Type { get; set; }
public string Codec { get; set; }
public string Language { get; set; }
public bool? IsInterlaced { get; set; }
public int? Height { get; set; }
public int? Width { get; set; }
public int Index { get; set; }
public bool IsDefault { get; set; }
public bool IsForced { get; set; }
public string Profile { get; set; }
public string AspectRatio { get; set; }
public int? Channels { get; set; }
}
}
@@ -0,0 +1,11 @@
namespace ErsatzTV.Infrastructure.Jellyfin.Models
{
public class JellyfinPersonResponse
{
public string Name { get; set; }
public string Id { get; set; }
public string Role { get; set; }
public string Type { get; set; }
public string PrimaryImageTag { get; set; }
}
}
@@ -0,0 +1,8 @@
namespace ErsatzTV.Infrastructure.Jellyfin.Models
{
public class JellyfinStudioResponse
{
public string Id { get; set; }
public string Name { get; set; }
}
}
@@ -0,0 +1,8 @@
namespace ErsatzTV.Infrastructure.Jellyfin.Models
{
public class JellyfinSystemInformationResponse
{
public string ServerName { get; set; }
public string OperatingSystem { get; set; }
}
}
@@ -0,0 +1,7 @@
namespace ErsatzTV.Infrastructure.Jellyfin.Models
{
public class JellyfinUserPolicyResponse
{
public bool IsAdministrator { get; set; }
}
}
@@ -0,0 +1,9 @@
namespace ErsatzTV.Infrastructure.Jellyfin.Models
{
public class JellyfinUserResponse
{
public string Name { get; set; }
public string Id { get; set; }
public JellyfinUserPolicyResponse Policy { get; set; }
}
}