mirror of
https://github.com/zoriya/Kyoo.git
synced 2025-07-08 02:34:16 -04:00
MovieDB: Implement episode get
This commit is contained in:
parent
a43210365d
commit
8152787f47
47
Kyoo.TheMovieDb/Convertors/EpisodeConvertors.cs
Normal file
47
Kyoo.TheMovieDb/Convertors/EpisodeConvertors.cs
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using Kyoo.Models;
|
||||||
|
using TMDbLib.Objects.TvShows;
|
||||||
|
|
||||||
|
namespace Kyoo.TheMovieDb
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// A class containing extensions methods to convert from TMDB's types to Kyoo's types.
|
||||||
|
/// </summary>
|
||||||
|
public static partial class Convertors
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Convert a <see cref="TvEpisode"/> into a <see cref="Episode"/>.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="episode">The episode to convert.</param>
|
||||||
|
/// <param name="showID">The ID of the show inside TheMovieDb.</param>
|
||||||
|
/// <param name="provider">The provider representing TheMovieDb.</param>
|
||||||
|
/// <returns>The converted episode as a <see cref="Episode"/>.</returns>
|
||||||
|
public static Episode ToEpisode(this TvEpisode episode, int showID, Provider provider)
|
||||||
|
{
|
||||||
|
return new()
|
||||||
|
{
|
||||||
|
SeasonNumber = episode.SeasonNumber,
|
||||||
|
EpisodeNumber = episode.EpisodeNumber,
|
||||||
|
Title = episode.Name,
|
||||||
|
Overview = episode.Overview,
|
||||||
|
ReleaseDate = episode.AirDate,
|
||||||
|
Images = new Dictionary<int, string>
|
||||||
|
{
|
||||||
|
[Thumbnails.Thumbnail] = episode.StillPath != null
|
||||||
|
? $"https://image.tmdb.org/t/p/original{episode.StillPath}"
|
||||||
|
: null
|
||||||
|
},
|
||||||
|
ExternalIDs = new []
|
||||||
|
{
|
||||||
|
new MetadataID
|
||||||
|
{
|
||||||
|
Provider = provider,
|
||||||
|
Link = $"https://www.themoviedb.org/tv/{showID}" +
|
||||||
|
$"/season/{episode.SeasonNumber}/episode/{episode.EpisodeNumber}",
|
||||||
|
DataID = episode.Id.ToString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
45
Kyoo.TheMovieDb/Convertors/SeasonConvertors.cs
Normal file
45
Kyoo.TheMovieDb/Convertors/SeasonConvertors.cs
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using Kyoo.Models;
|
||||||
|
using TMDbLib.Objects.TvShows;
|
||||||
|
|
||||||
|
namespace Kyoo.TheMovieDb
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// A class containing extensions methods to convert from TMDB's types to Kyoo's types.
|
||||||
|
/// </summary>
|
||||||
|
public static partial class Convertors
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Convert a <see cref="TvSeason"/> into a <see cref="Season"/>.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="season">The season to convert.</param>
|
||||||
|
/// <param name="showID">The ID of the show inside TheMovieDb.</param>
|
||||||
|
/// <param name="provider">The provider representing TheMovieDb.</param>
|
||||||
|
/// <returns>The converted season as a <see cref="Season"/>.</returns>
|
||||||
|
public static Season ToSeason(this TvSeason season, int showID, Provider provider)
|
||||||
|
{
|
||||||
|
return new()
|
||||||
|
{
|
||||||
|
SeasonNumber = season.SeasonNumber,
|
||||||
|
Title = season.Name,
|
||||||
|
Overview = season.Overview,
|
||||||
|
StartDate = season.AirDate,
|
||||||
|
Images = new Dictionary<int, string>
|
||||||
|
{
|
||||||
|
[Thumbnails.Poster] = season.PosterPath != null
|
||||||
|
? $"https://image.tmdb.org/t/p/original{season.PosterPath}"
|
||||||
|
: null
|
||||||
|
},
|
||||||
|
ExternalIDs = new []
|
||||||
|
{
|
||||||
|
new MetadataID
|
||||||
|
{
|
||||||
|
Provider = provider,
|
||||||
|
Link = $"https://www.themoviedb.org/tv/{showID}/season/{season.SeasonNumber}",
|
||||||
|
DataID = season.Id?.ToString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -19,6 +19,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="5.0.0" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Options" Version="5.0.0" />
|
<PackageReference Include="Microsoft.Extensions.Options" Version="5.0.0" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="5.0.0" />
|
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="5.0.0" />
|
||||||
<PackageReference Include="TMDbLib" Version="1.8.1" />
|
<PackageReference Include="TMDbLib" Version="1.8.1" />
|
||||||
|
@ -5,6 +5,7 @@ using System.Threading.Tasks;
|
|||||||
using Kyoo.Controllers;
|
using Kyoo.Controllers;
|
||||||
using Kyoo.Models;
|
using Kyoo.Models;
|
||||||
using Kyoo.TheMovieDb.Models;
|
using Kyoo.TheMovieDb.Models;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using TMDbLib.Client;
|
using TMDbLib.Client;
|
||||||
using TMDbLib.Objects.Movies;
|
using TMDbLib.Objects.Movies;
|
||||||
@ -22,7 +23,11 @@ namespace Kyoo.TheMovieDb
|
|||||||
/// The API key used to authenticate with TheMovieDb API.
|
/// The API key used to authenticate with TheMovieDb API.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private readonly IOptions<TheMovieDbOptions> _apiKey;
|
private readonly IOptions<TheMovieDbOptions> _apiKey;
|
||||||
|
/// <summary>
|
||||||
|
/// The logger to use in ase of issue.
|
||||||
|
/// </summary>
|
||||||
|
private readonly ILogger<TheMovieDbProvider> _logger;
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public Provider Provider => new()
|
public Provider Provider => new()
|
||||||
{
|
{
|
||||||
@ -35,14 +40,16 @@ namespace Kyoo.TheMovieDb
|
|||||||
"blue_short-8e7b30f73a4020692ccca9c88bafe5dcb6f8a62a4c6bc55cd9ba82bb2cd95f6c.svg"
|
"blue_short-8e7b30f73a4020692ccca9c88bafe5dcb6f8a62a4c6bc55cd9ba82bb2cd95f6c.svg"
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Create a new <see cref="TheMovieDbProvider"/> using the given api key.
|
/// Create a new <see cref="TheMovieDbProvider"/> using the given api key.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="apiKey">The api key</param>
|
/// <param name="apiKey">The api key</param>
|
||||||
public TheMovieDbProvider(IOptions<TheMovieDbOptions> apiKey)
|
/// <param name="logger">The logger to use in case of issue.</param>
|
||||||
|
public TheMovieDbProvider(IOptions<TheMovieDbOptions> apiKey, ILogger<TheMovieDbProvider> logger)
|
||||||
{
|
{
|
||||||
_apiKey = apiKey;
|
_apiKey = apiKey;
|
||||||
|
_logger = logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -54,6 +61,8 @@ namespace Kyoo.TheMovieDb
|
|||||||
{
|
{
|
||||||
Collection collection => _GetCollection(collection) as Task<T>,
|
Collection collection => _GetCollection(collection) as Task<T>,
|
||||||
Show show => _GetShow(show) as Task<T>,
|
Show show => _GetShow(show) as Task<T>,
|
||||||
|
Season season => _GetSeason(season) as Task<T>,
|
||||||
|
Episode episode => _GetEpisode(episode) as Task<T>,
|
||||||
_ => null
|
_ => null
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -104,6 +113,45 @@ namespace Kyoo.TheMovieDb
|
|||||||
?.ToShow(Provider);
|
?.ToShow(Provider);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get a season using it's show and it's season number.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="season">The season to retrieve metadata for.</param>
|
||||||
|
/// <returns>A season containing metadata from TheMovieDb</returns>
|
||||||
|
private async Task<Season> _GetSeason(Season season)
|
||||||
|
{
|
||||||
|
if (season.Show == null || !season.Show.TryGetID(Provider.Slug, out int id))
|
||||||
|
{
|
||||||
|
_logger.LogWarning("Metadata for a season was requested but it's show is not loaded. " +
|
||||||
|
"This is unsupported");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
TMDbClient client = new(_apiKey.Value.ApiKey);
|
||||||
|
return (await client.GetTvSeasonAsync(id, season.SeasonNumber))
|
||||||
|
.ToSeason(id, Provider);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get an episode using it's show, it's season number and it's episode number.
|
||||||
|
/// Absolute numbering is not supported.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="episode">The episode to retrieve metadata for.</param>
|
||||||
|
/// <returns>An episode containing metadata from TheMovieDb</returns>
|
||||||
|
private async Task<Episode> _GetEpisode(Episode episode)
|
||||||
|
{
|
||||||
|
if (episode.Show == null || !episode.Show.TryGetID(Provider.Slug, out int id))
|
||||||
|
{
|
||||||
|
_logger.LogWarning("Metadata for a season was requested but it's show is not loaded. " +
|
||||||
|
"This is unsupported");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (episode.SeasonNumber == null || episode.EpisodeNumber == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
TMDbClient client = new(_apiKey.Value.ApiKey);
|
||||||
|
return (await client.GetTvEpisodeAsync(id, episode.SeasonNumber.Value, episode.EpisodeNumber.Value))
|
||||||
|
.ToEpisode(id, Provider);
|
||||||
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public async Task<ICollection<T>> Search<T>(string query)
|
public async Task<ICollection<T>> Search<T>(string query)
|
||||||
@ -113,6 +161,10 @@ namespace Kyoo.TheMovieDb
|
|||||||
return (await _SearchCollections(query) as ICollection<T>)!;
|
return (await _SearchCollections(query) as ICollection<T>)!;
|
||||||
if (typeof(T) == typeof(Show))
|
if (typeof(T) == typeof(Show))
|
||||||
return (await _SearchShows(query) as ICollection<T>)!;
|
return (await _SearchShows(query) as ICollection<T>)!;
|
||||||
|
// if (typeof(T) == typeof(People))
|
||||||
|
// return (await _SearchPeople(query) as ICollection<T>)!;
|
||||||
|
// if (typeof(T) == typeof(Studio))
|
||||||
|
// return (await _SearchStudios(query) as ICollection<T>)!;
|
||||||
return ArraySegment<T>.Empty;
|
return ArraySegment<T>.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -120,7 +172,7 @@ namespace Kyoo.TheMovieDb
|
|||||||
/// Search for a collection using it's name as a query.
|
/// Search for a collection using it's name as a query.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="query">The query to search for</param>
|
/// <param name="query">The query to search for</param>
|
||||||
/// <returns>A collection containing metadata from TheMovieDb</returns>
|
/// <returns>A list of collections containing metadata from TheMovieDb</returns>
|
||||||
private async Task<ICollection<Collection>> _SearchCollections(string query)
|
private async Task<ICollection<Collection>> _SearchCollections(string query)
|
||||||
{
|
{
|
||||||
TMDbClient client = new(_apiKey.Value.ApiKey);
|
TMDbClient client = new(_apiKey.Value.ApiKey);
|
||||||
@ -134,7 +186,7 @@ namespace Kyoo.TheMovieDb
|
|||||||
/// Search for a show using it's name as a query.
|
/// Search for a show using it's name as a query.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="query">The query to search for</param>
|
/// <param name="query">The query to search for</param>
|
||||||
/// <returns>A show containing metadata from TheMovieDb</returns>
|
/// <returns>A list of shows containing metadata from TheMovieDb</returns>
|
||||||
private async Task<ICollection<Show>> _SearchShows(string query)
|
private async Task<ICollection<Show>> _SearchShows(string query)
|
||||||
{
|
{
|
||||||
TMDbClient client = new(_apiKey.Value.ApiKey);
|
TMDbClient client = new(_apiKey.Value.ApiKey);
|
||||||
@ -152,47 +204,5 @@ namespace Kyoo.TheMovieDb
|
|||||||
.Where(x => x != null)
|
.Where(x => x != null)
|
||||||
.ToArray();
|
.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
// public async Task<Season> GetSeason(Show show, int seasonNumber)
|
|
||||||
// {
|
|
||||||
// string id = show?.GetID(Provider.Name);
|
|
||||||
// if (id == null)
|
|
||||||
// return await Task.FromResult<Season>(null);
|
|
||||||
// TMDbClient client = new TMDbClient(APIKey);
|
|
||||||
// TvSeason season = await client.GetTvSeasonAsync(int.Parse(id), seasonNumber);
|
|
||||||
// if (season == null)
|
|
||||||
// return null;
|
|
||||||
// return new Season(show.ID,
|
|
||||||
// seasonNumber,
|
|
||||||
// season.Name,
|
|
||||||
// season.Overview,
|
|
||||||
// season.AirDate?.Year,
|
|
||||||
// season.PosterPath != null ? "https://image.tmdb.org/t/p/original" + season.PosterPath : null,
|
|
||||||
// new[] {new MetadataID(Provider, $"{season.Id}", $"https://www.themoviedb.org/tv/{id}/season/{season.SeasonNumber}")});
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// public async Task<Episode> GetEpisode(Show show, int seasonNumber, int episodeNumber, int absoluteNumber)
|
|
||||||
// {
|
|
||||||
// if (seasonNumber == -1 || episodeNumber == -1)
|
|
||||||
// return await Task.FromResult<Episode>(null);
|
|
||||||
//
|
|
||||||
// string id = show?.GetID(Provider.Name);
|
|
||||||
// if (id == null)
|
|
||||||
// return await Task.FromResult<Episode>(null);
|
|
||||||
// TMDbClient client = new(APIKey);
|
|
||||||
// TvEpisode episode = await client.GetTvEpisodeAsync(int.Parse(id), seasonNumber, episodeNumber);
|
|
||||||
// if (episode == null)
|
|
||||||
// return null;
|
|
||||||
// return new Episode(seasonNumber, episodeNumber, absoluteNumber,
|
|
||||||
// episode.Name,
|
|
||||||
// episode.Overview,
|
|
||||||
// episode.AirDate,
|
|
||||||
// 0,
|
|
||||||
// episode.StillPath != null ? "https://image.tmdb.org/t/p/original" + episode.StillPath : null,
|
|
||||||
// new []
|
|
||||||
// {
|
|
||||||
// new MetadataID(Provider, $"{episode.Id}", $"https://www.themoviedb.org/tv/{id}/season/{episode.SeasonNumber}/episode/{episode.EpisodeNumber}")
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user