Skip to content

Commit

Permalink
Add trailers, theme videos genres and tweak the events used
Browse files Browse the repository at this point in the history
  • Loading branch information
revam committed Sep 14, 2021
1 parent 7bae4c7 commit d703ffd
Show file tree
Hide file tree
Showing 11 changed files with 296 additions and 150 deletions.
4 changes: 4 additions & 0 deletions Shokofin/API/Info/GroupInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ public class GroupInfo

public Group Shoko;

public string[] Tags;

public string[] Genres;

public SeriesInfo GetSeriesInfoBySeasonNumber(int seasonNumber) {
if (seasonNumber == 0)
return null;
Expand Down
4 changes: 4 additions & 0 deletions Shokofin/API/Info/SeriesInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ public class SeriesInfo

public Series.TvDB TvDB;

public string[] Tags;

public string[] Genres;

/// <summary>
/// All episodes (of all type) that belong to this series.
///
Expand Down
2 changes: 1 addition & 1 deletion Shokofin/API/ShokoAPI.cs
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ public static async Task<IEnumerable<Series>> GetSeriesPathEndsWith(string dirna

public static async Task<IEnumerable<Tag>> GetSeriesTags(string id, int filter = 0)
{
var responseStream = await CallApi($"/api/v3/Series/{id}/Tags/{filter}");
var responseStream = await CallApi($"/api/v3/Series/{id}/Tags/{filter}?excludeDescriptions=true");
return responseStream != null ? await JsonSerializer.DeserializeAsync<IEnumerable<Tag>>(responseStream) : null;
}

Expand Down
34 changes: 30 additions & 4 deletions Shokofin/API/ShokoAPIManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
using Shokofin.Utils;

using ILibraryManager = MediaBrowser.Controller.Library.ILibraryManager;
using CultureInfo = System.Globalization.CultureInfo;

namespace Shokofin.API
{
Expand Down Expand Up @@ -146,9 +147,9 @@ public async Task<IEnumerable<PersonInfo>> GetPeople(string seriesId)
#endregion
#region Tags

public async Task<string[]> GetTags(string seriesId)
private async Task<string[]> GetTags(string seriesId)
{
return (await ShokoAPI.GetSeriesTags(seriesId, GetTagFilter()))?.Select(tag => tag.Name).ToArray() ?? new string[0];
return (await ShokoAPI.GetSeriesTags(seriesId, GetTagFilter()))?.Select(SelectTagName).ToArray() ?? new string[0];
}

/// <summary>
Expand All @@ -158,7 +159,7 @@ public async Task<string[]> GetTags(string seriesId)
private int GetTagFilter()
{
var config = Plugin.Instance.Configuration;
var filter = 0;
var filter = 128; // We exclude genres by default

if (config.HideAniDbTags) filter = 1;
if (config.HideArtStyleTags) filter |= (filter << 1);
Expand All @@ -169,6 +170,20 @@ private int GetTagFilter()
return filter;
}

#endregion
#region Genres

public async Task<string[]> GetGenresForSeries(string seriesId)
{
// The following magic number is the filter value to allow only genres in the returned list.
return (await ShokoAPI.GetSeriesTags(seriesId, -2147483520))?.Select(SelectTagName).ToArray() ?? new string[0];
}

private string SelectTagName(Tag tag)
{
return CultureInfo.InvariantCulture.TextInfo.ToTitleCase(tag.Name);
}

#endregion
#region File Info

Expand Down Expand Up @@ -327,14 +342,19 @@ public bool TryGetEpisodePathForId(string episodeId, out string path)
case EpisodeType.Trailer:
return ExtraType.Trailer;
case EpisodeType.Special: {
var title = Text.GetTitleByLanguages(episode.Titles, "en") ?? "";
var title = Text.GetTitleByLanguages(episode.Titles, "en");
if (string.IsNullOrEmpty(title))
return null;
// Interview
if (title.Contains("interview", System.StringComparison.OrdinalIgnoreCase))
return ExtraType.Interview;
// Cinema intro/outro
if (title.StartsWith("cinema ", System.StringComparison.OrdinalIgnoreCase) &&
(title.Contains("intro", System.StringComparison.OrdinalIgnoreCase) || title.Contains("outro", System.StringComparison.OrdinalIgnoreCase)))
return ExtraType.Clip;
// Music videos
if (title.Contains("music video", System.StringComparison.OrdinalIgnoreCase))
return ExtraType.Clip;
return null;
}
default:
Expand Down Expand Up @@ -470,6 +490,8 @@ private async Task<SeriesInfo> CreateSeriesInfo(Series series, string seriesId =

var aniDb = await ShokoAPI.GetSeriesAniDB(seriesId);
var tvDbId = series.IDs.TvDB?.FirstOrDefault();
var tags = await GetTags(seriesId);
var genres = await GetGenresForSeries(seriesId);
Dictionary<string, EpisodeInfo> specialsAnchorDictionary = new Dictionary<string, EpisodeInfo>();
var specialsList = new List<EpisodeInfo>();
var episodesList = new List<EpisodeInfo>();
Expand Down Expand Up @@ -513,6 +535,8 @@ private async Task<SeriesInfo> CreateSeriesInfo(Series series, string seriesId =
AniDB = aniDb,
TvDBId = tvDbId != 0 ? tvDbId.ToString() : null,
TvDB = tvDbId != 0 ? (await ShokoAPI.GetSeriesTvDB(seriesId)).FirstOrDefault() : null,
Tags = tags,
Genres = genres,
RawEpisodeList = allEpisodesList,
EpisodeList = episodesList,
ExtrasList = extrasList,
Expand Down Expand Up @@ -669,6 +693,8 @@ private async Task<GroupInfo> CreateGroupInfo(Group group, string groupId, Order
groupInfo = new GroupInfo {
Id = groupId,
Shoko = group,
Tags = seriesList.SelectMany(s => s.Tags).Distinct().ToArray(),
Genres = seriesList.SelectMany(s => s.Genres).Distinct().ToArray(),
SeriesList = seriesList,
DefaultSeries = seriesList[foundIndex],
DefaultSeriesIndex = foundIndex,
Expand Down
14 changes: 11 additions & 3 deletions Shokofin/Configuration/configPage.html
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,11 @@ <h3>Synopsis Options</h3>
<div class="selectContainer">
<label class="selectLabel" for="DescriptionSource">Synopsis source</label>
<select is="emby-select" id="DescriptionSource" name="DescriptionSource" class="emby-select-withcolor emby-select">
<option value="Default">Use default source</option>
<option value="AllowOthers">Prefer TvDB/TMDB if available, otherwise use AniDb</option>
<option value="OnlyAniDb">Only use AniDb</option>
<option value="Default">Use default for Series Grouping</option>
<option value="OnlyAniDb">Only use AniDB</option>
<option value="PreferAniDb">Prefer AniDB if available, otherwise use TvDB/TMDB</option>
<option value="OnlyOther">Only use TvDB/TMDB</option>
<option value="PreferOther">Prefer TvDB/TMDB if available, otherwise use AniDB</option>
</select>
</div>
<label class="checkboxContainer">
Expand Down Expand Up @@ -109,6 +111,10 @@ <h3>Library Options</h3>
<input is="emby-checkbox" type="checkbox" id="AddMissingMetadata" />
<span>Add metadata for missing seasons/episodes</span>
</label>
<label class="checkboxContainer">
<input is="emby-checkbox" type="checkbox" id="AddExtraVideos" />
<span>Add trailers, theme videos, and other extras</span>
</label>
<div class="selectContainer">
<label class="selectLabel" for="BoxSetGrouping">Box-set grouping</label>
<select is="emby-select" id="BoxSetGrouping" name="BoxSetGrouping" class="emby-select-withcolor emby-select">
Expand Down Expand Up @@ -201,6 +207,7 @@ <h3>Tag Options</h3>
document.querySelector('#MarkSpecialsWhenGrouped').checked = config.MarkSpecialsWhenGrouped;
document.querySelector('#DisplaySpecialsInSeason').checked = config.DisplaySpecialsInSeason;
document.querySelector('#AddMissingMetadata').checked = config.AddMissingMetadata;
document.querySelector('#AddExtraVideos').checked = config.AddExtraVideos;
document.querySelector('#FilterOnLibraryTypes').checked = config.FilterOnLibraryTypes;
document.querySelector('#AddAniDBId').checked = config.AddAniDBId;
document.querySelector('#PreferAniDbPoster').checked = config.PreferAniDbPoster;
Expand Down Expand Up @@ -279,6 +286,7 @@ <h3>Tag Options</h3>
config.MarkSpecialsWhenGrouped = document.querySelector('#MarkSpecialsWhenGrouped').checked;
config.DisplaySpecialsInSeason = document.querySelector('#DisplaySpecialsInSeason').checked;
config.AddMissingMetadata = document.querySelector('#AddMissingMetadata').checked;
config.AddExtraVideos = document.querySelector('#AddExtraVideos').checked;
config.FilterOnLibraryTypes = document.querySelector('#FilterOnLibraryTypes').checked;
config.AddAniDBId = document.querySelector('#AddAniDBId').checked;
config.PreferAniDbPoster = document.querySelector('#PreferAniDbPoster').checked;
Expand Down
6 changes: 2 additions & 4 deletions Shokofin/Providers/BoxSetProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ public async Task<MetadataResult<BoxSet>> GetDefaultMetadata(BoxSetInfo info, Ca
}

var ( displayTitle, alternateTitle ) = Text.GetSeriesTitles(series.AniDB.Titles, series.AniDB.Title, info.MetadataLanguage);
var tags = await ApiManager.GetTags(series.Id);

result.Item = new BoxSet {
Name = displayTitle,
Expand All @@ -72,7 +71,7 @@ public async Task<MetadataResult<BoxSet>> GetDefaultMetadata(BoxSetInfo info, Ca
PremiereDate = series.AniDB.AirDate,
EndDate = series.AniDB.EndDate,
ProductionYear = series.AniDB.AirDate?.Year,
Tags = tags,
Tags = series.Tags,
CommunityRating = series.AniDB.Rating.ToFloat(10),
};
result.Item.SetProviderId("Shoko Series", series.Id);
Expand Down Expand Up @@ -101,7 +100,6 @@ private async Task<MetadataResult<BoxSet>> GetShokoGroupedMetadata(BoxSetInfo in
Logger.LogWarning("Group did not contain multiple movies! Skipping path {Path} (Series={SeriesId},Group={GroupId})", info.Path, group.Id, series.Id);
return result;
}
var tags = await ApiManager.GetTags(series.Id);
var ( displayTitle, alternateTitle ) = Text.GetSeriesTitles(series.AniDB.Titles, series.Shoko.Name, info.MetadataLanguage);

result.Item = new BoxSet {
Expand All @@ -111,7 +109,7 @@ private async Task<MetadataResult<BoxSet>> GetShokoGroupedMetadata(BoxSetInfo in
PremiereDate = series.AniDB.AirDate,
EndDate = series.AniDB.EndDate,
ProductionYear = series.AniDB.AirDate?.Year,
Tags = tags,
Tags = group.Tags,
CommunityRating = (float)((series.AniDB.Rating.Value * 10) / series.AniDB.Rating.MaxValue)
};
result.Item.SetProviderId("Shoko Series", series.Id);
Expand Down
Loading

0 comments on commit d703ffd

Please sign in to comment.