mirror of
https://github.com/Ombi-app/Ombi.git
synced 2025-08-19 04:49:33 -07:00
Improved the Emby API #2230 Thanks Luke!
This commit is contained in:
parent
d8fdc75cfb
commit
62b0c4d450
6 changed files with 25 additions and 48 deletions
|
@ -1,6 +1,7 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.EntityFrameworkCore.Internal;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using Ombi.Api.Emby.Models;
|
using Ombi.Api.Emby.Models;
|
||||||
using Ombi.Api.Emby.Models.Media.Tv;
|
using Ombi.Api.Emby.Models.Media.Tv;
|
||||||
|
@ -100,7 +101,7 @@ namespace Ombi.Api.Emby
|
||||||
|
|
||||||
public async Task<EmbyItemContainer<EmbyMovie>> GetAllMovies(string apiKey, string userId, string baseUri)
|
public async Task<EmbyItemContainer<EmbyMovie>> GetAllMovies(string apiKey, string userId, string baseUri)
|
||||||
{
|
{
|
||||||
return await GetAll<EmbyMovie>("Movie", apiKey, userId, baseUri);
|
return await GetAll<EmbyMovie>("Movie", apiKey, userId, baseUri, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<EmbyItemContainer<EmbyEpisodes>> GetAllEpisodes(string apiKey, string userId, string baseUri)
|
public async Task<EmbyItemContainer<EmbyEpisodes>> GetAllEpisodes(string apiKey, string userId, string baseUri)
|
||||||
|
@ -129,20 +130,22 @@ namespace Ombi.Api.Emby
|
||||||
private async Task<T> GetInformation<T>(string mediaId, string apiKey, string userId, string baseUrl)
|
private async Task<T> GetInformation<T>(string mediaId, string apiKey, string userId, string baseUrl)
|
||||||
{
|
{
|
||||||
var request = new Request($"emby/users/{userId}/items/{mediaId}", baseUrl, HttpMethod.Get);
|
var request = new Request($"emby/users/{userId}/items/{mediaId}", baseUrl, HttpMethod.Get);
|
||||||
|
|
||||||
AddHeaders(request, apiKey);
|
AddHeaders(request, apiKey);
|
||||||
var response = await Api.RequestContent(request);
|
var response = await Api.RequestContent(request);
|
||||||
|
|
||||||
return JsonConvert.DeserializeObject<T>(response);
|
return JsonConvert.DeserializeObject<T>(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task<EmbyItemContainer<T>> GetAll<T>(string type, string apiKey, string userId, string baseUri, bool includeOverview = false)
|
||||||
|
|
||||||
private async Task<EmbyItemContainer<T>> GetAll<T>(string type, string apiKey, string userId, string baseUri)
|
|
||||||
{
|
{
|
||||||
var request = new Request($"emby/users/{userId}/items", baseUri, HttpMethod.Get);
|
var request = new Request($"emby/users/{userId}/items", baseUri, HttpMethod.Get);
|
||||||
|
|
||||||
request.AddQueryString("Recursive", true.ToString());
|
request.AddQueryString("Recursive", true.ToString());
|
||||||
request.AddQueryString("IncludeItemTypes", type);
|
request.AddQueryString("IncludeItemTypes", type);
|
||||||
|
request.AddQueryString("Fields", includeOverview ? "ProviderIds,Overview" : "ProviderIds");
|
||||||
|
|
||||||
|
request.AddQueryString("VirtualItem","False");
|
||||||
|
|
||||||
AddHeaders(request, apiKey);
|
AddHeaders(request, apiKey);
|
||||||
|
|
||||||
|
|
|
@ -28,5 +28,7 @@ namespace Ombi.Api.Emby.Models.Movie
|
||||||
public string MediaType { get; set; }
|
public string MediaType { get; set; }
|
||||||
public bool HasSubtitles { get; set; }
|
public bool HasSubtitles { get; set; }
|
||||||
public int CriticRating { get; set; }
|
public int CriticRating { get; set; }
|
||||||
|
public string Overview { get; set; }
|
||||||
|
public EmbyProviderids ProviderIds { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -39,5 +39,6 @@ namespace Ombi.Api.Emby.Models.Media.Tv
|
||||||
public string LocationType { get; set; }
|
public string LocationType { get; set; }
|
||||||
public string MediaType { get; set; }
|
public string MediaType { get; set; }
|
||||||
public bool HasSubtitles { get; set; }
|
public bool HasSubtitles { get; set; }
|
||||||
|
public EmbyProviderids ProviderIds { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -26,5 +26,7 @@ namespace Ombi.Api.Emby.Models.Media.Tv
|
||||||
public string[] BackdropImageTags { get; set; }
|
public string[] BackdropImageTags { get; set; }
|
||||||
public string LocationType { get; set; }
|
public string LocationType { get; set; }
|
||||||
public DateTime EndDate { get; set; }
|
public DateTime EndDate { get; set; }
|
||||||
|
|
||||||
|
public EmbyProviderids ProviderIds { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -75,34 +75,15 @@ namespace Ombi.Schedule.Jobs.Emby
|
||||||
var mediaToAdd = new HashSet<EmbyContent>();
|
var mediaToAdd = new HashSet<EmbyContent>();
|
||||||
foreach (var movie in movies.Items)
|
foreach (var movie in movies.Items)
|
||||||
{
|
{
|
||||||
if (movie.Type.Equals("boxset", StringComparison.CurrentCultureIgnoreCase))
|
// Regular movie
|
||||||
{
|
await ProcessMovies(movie, mediaToAdd);
|
||||||
var movieInfo =
|
|
||||||
await _api.GetCollection(movie.Id, server.ApiKey, server.AdministratorId, server.FullUri);
|
|
||||||
foreach (var item in movieInfo.Items)
|
|
||||||
{
|
|
||||||
var info = await _api.GetMovieInformation(item.Id, server.ApiKey,
|
|
||||||
server.AdministratorId, server.FullUri);
|
|
||||||
await ProcessMovies(info, mediaToAdd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Regular movie
|
|
||||||
var movieInfo = await _api.GetMovieInformation(movie.Id, server.ApiKey,
|
|
||||||
server.AdministratorId, server.FullUri);
|
|
||||||
|
|
||||||
await ProcessMovies(movieInfo, mediaToAdd);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// TV Time
|
// TV Time
|
||||||
var tv = await _api.GetAllShows(server.ApiKey, server.AdministratorId, server.FullUri);
|
var tv = await _api.GetAllShows(server.ApiKey, server.AdministratorId, server.FullUri);
|
||||||
|
|
||||||
foreach (var tvShow in tv.Items)
|
foreach (var tvShow in tv.Items)
|
||||||
{
|
{
|
||||||
var tvInfo = await _api.GetSeriesInformation(tvShow.Id, server.ApiKey, server.AdministratorId,
|
if (string.IsNullOrEmpty(tvShow.ProviderIds?.Tvdb))
|
||||||
server.FullUri);
|
|
||||||
if (string.IsNullOrEmpty(tvInfo.ProviderIds?.Tvdb))
|
|
||||||
{
|
{
|
||||||
Log.Error("Provider Id on tv {0} is null", tvShow.Name);
|
Log.Error("Provider Id on tv {0} is null", tvShow.Name);
|
||||||
continue;
|
continue;
|
||||||
|
@ -112,10 +93,10 @@ namespace Ombi.Schedule.Jobs.Emby
|
||||||
if (existingTv == null)
|
if (existingTv == null)
|
||||||
mediaToAdd.Add(new EmbyContent
|
mediaToAdd.Add(new EmbyContent
|
||||||
{
|
{
|
||||||
TvDbId = tvInfo.ProviderIds?.Tvdb,
|
TvDbId = tvShow.ProviderIds?.Tvdb,
|
||||||
ImdbId = tvInfo.ProviderIds?.Imdb,
|
ImdbId = tvShow.ProviderIds?.Imdb,
|
||||||
TheMovieDbId = tvInfo.ProviderIds?.Tmdb,
|
TheMovieDbId = tvShow.ProviderIds?.Tmdb,
|
||||||
Title = tvInfo.Name,
|
Title = tvShow.Name,
|
||||||
Type = EmbyMediaType.Series,
|
Type = EmbyMediaType.Series,
|
||||||
EmbyId = tvShow.Id,
|
EmbyId = tvShow.Id,
|
||||||
Url = EmbyHelper.GetEmbyMediaUrl(tvShow.Id),
|
Url = EmbyHelper.GetEmbyMediaUrl(tvShow.Id),
|
||||||
|
@ -127,7 +108,7 @@ namespace Ombi.Schedule.Jobs.Emby
|
||||||
await _repo.AddRange(mediaToAdd);
|
await _repo.AddRange(mediaToAdd);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task ProcessMovies(MovieInformation movieInfo, ICollection<EmbyContent> content)
|
private async Task ProcessMovies(EmbyMovie movieInfo, ICollection<EmbyContent> content)
|
||||||
{
|
{
|
||||||
// Check if it exists
|
// Check if it exists
|
||||||
var existingMovie = await _repo.GetByEmbyId(movieInfo.Id);
|
var existingMovie = await _repo.GetByEmbyId(movieInfo.Id);
|
||||||
|
|
|
@ -78,21 +78,9 @@ namespace Ombi.Schedule.Jobs.Emby
|
||||||
|
|
||||||
foreach (var ep in allEpisodes.Items)
|
foreach (var ep in allEpisodes.Items)
|
||||||
{
|
{
|
||||||
if (ep.LocationType.Equals("Virtual", StringComparison.CurrentCultureIgnoreCase))
|
|
||||||
{
|
|
||||||
// This means that we don't actully have the file, it's just Emby being nice and showing future stuff
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
var epInfo = await _api.GetEpisodeInformation(ep.Id, server.ApiKey, server.AdministratorId, server.FullUri);
|
|
||||||
//if (epInfo?.ProviderIds?.Tvdb == null)
|
|
||||||
//{
|
|
||||||
// continue;
|
|
||||||
//}
|
|
||||||
|
|
||||||
// Let's make sure we have the parent request, stop those pesky forign key errors,
|
// Let's make sure we have the parent request, stop those pesky forign key errors,
|
||||||
// Damn me having data integrity
|
// Damn me having data integrity
|
||||||
var parent = await _repo.GetByEmbyId(epInfo.SeriesId);
|
var parent = await _repo.GetByEmbyId(ep.SeriesId);
|
||||||
if (parent == null)
|
if (parent == null)
|
||||||
{
|
{
|
||||||
_logger.LogInformation("The episode {0} does not relate to a series, so we cannot save this", ep.Name);
|
_logger.LogInformation("The episode {0} does not relate to a series, so we cannot save this", ep.Name);
|
||||||
|
@ -109,9 +97,9 @@ namespace Ombi.Schedule.Jobs.Emby
|
||||||
EpisodeNumber = ep.IndexNumber,
|
EpisodeNumber = ep.IndexNumber,
|
||||||
SeasonNumber = ep.ParentIndexNumber,
|
SeasonNumber = ep.ParentIndexNumber,
|
||||||
ParentId = ep.SeriesId,
|
ParentId = ep.SeriesId,
|
||||||
TvDbId = epInfo.ProviderIds.Tvdb,
|
TvDbId = ep.ProviderIds.Tvdb,
|
||||||
TheMovieDbId = epInfo.ProviderIds.Tmdb,
|
TheMovieDbId = ep.ProviderIds.Tmdb,
|
||||||
ImdbId = epInfo.ProviderIds.Imdb,
|
ImdbId = ep.ProviderIds.Imdb,
|
||||||
Title = ep.Name,
|
Title = ep.Name,
|
||||||
AddedAt = DateTime.UtcNow
|
AddedAt = DateTime.UtcNow
|
||||||
});
|
});
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue