Skip to content

Commit

Permalink
Merge pull request #7 from revam/add-movie-provider
Browse files Browse the repository at this point in the history
Add movie and box-set providers, fix episode titles and fix image provider
  • Loading branch information
harshithmohan committed Sep 30, 2020
2 parents 9aa9d47 + 5ea9478 commit 14b4387
Show file tree
Hide file tree
Showing 8 changed files with 448 additions and 163 deletions.
12 changes: 6 additions & 6 deletions Shokofin/Configuration/PluginConfiguration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,17 +38,17 @@ public class PluginConfiguration : BasePluginConfiguration

public bool SynopsisCleanMultiEmptyLines { get; set; }

public enum DisplayTitleType {
public enum DisplayLanguageType {
Default,
Localized,
MetadataPreferred,
Origin,
}

public bool TitleUseAlternate { get; set; }

public DisplayTitleType TitleMainType { get; set; }
public DisplayLanguageType TitleMainType { get; set; }

public DisplayTitleType TitleAlternateType { get; set; }
public DisplayLanguageType TitleAlternateType { get; set; }

public PluginConfiguration()
{
Expand All @@ -70,8 +70,8 @@ public PluginConfiguration()
SynopsisRemoveSummary = true;
SynopsisCleanMultiEmptyLines = true;
TitleUseAlternate = true;
TitleMainType = DisplayTitleType.Default;
TitleAlternateType = DisplayTitleType.Origin;
TitleMainType = DisplayLanguageType.Default;
TitleAlternateType = DisplayLanguageType.Origin;
}
}
}
4 changes: 2 additions & 2 deletions Shokofin/Configuration/configPage.html
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
<label class="selectLabel" for="TitleMainType">Main Title Language</label>
<select is="emby-select" id="TitleMainType" name="TitleMainType" class="emby-select-withcolor emby-select">
<option value="Default">Default</option>
<option value="Localized">Use preferred metadata language</option>
<option value="MetadataPreferred">Preferred metadata language</option>
<option value="Origin">Language in country of origin</option>
</select>
<div class="fieldDescription">Titles will fallback to Default if not found for the target language.</div>
Expand All @@ -40,7 +40,7 @@
<label class="selectLabel" for="TitleAlternateType">Alternate Title Language</label>
<select is="emby-select" id="TitleAlternateType" name="TitleAlternateType" class="emby-select-withcolor emby-select">
<option value="Default">Default</option>
<option value="Localized">Use preferred metadata language</option>
<option value="MetadataPreferred">Preferred metadata language</option>
<option value="Origin">Language in country of origin</option>
</select>
<div class="fieldDescription">Titles will fallback to Default if not found for the target language.</div>
Expand Down
120 changes: 120 additions & 0 deletions Shokofin/Providers/BoxSetProvider.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Providers;
using Microsoft.Extensions.Logging;
using Shokofin.API;

namespace Shokofin.Providers
{
public class BoxSetProvider : IHasOrder, IRemoteMetadataProvider<BoxSet, BoxSetInfo>
{
public string Name => "Shoko";
public int Order => 1;
private readonly IHttpClientFactory _httpClientFactory;
private readonly ILogger<BoxSetProvider> _logger;

public BoxSetProvider(IHttpClientFactory httpClientFactory, ILogger<BoxSetProvider> logger)
{
_logger = logger;
_httpClientFactory = httpClientFactory;
}

public async Task<MetadataResult<BoxSet>> GetMetadata(BoxSetInfo info, CancellationToken cancellationToken)
{
try
{
var result = new MetadataResult<BoxSet>();

var dirname = Path.DirectorySeparatorChar + info.Path.Split(Path.DirectorySeparatorChar).Last();

_logger.LogInformation($"Shoko Scanner... Getting series ID ({dirname})");

var apiResponse = await ShokoAPI.GetSeriesPathEndsWith(dirname);
var seriesIDs = apiResponse.FirstOrDefault()?.IDs;
var seriesId = seriesIDs?.ID.ToString();

if (string.IsNullOrEmpty(seriesId))
{
_logger.LogInformation("Shoko Scanner... BoxSet not found!");
return result;
}
_logger.LogInformation($"Shoko Scanner... Getting series metadata ({dirname} - {seriesId})");

var aniDbInfo = await ShokoAPI.GetSeriesAniDb(seriesId);
if (aniDbInfo.SeriesType != "0" /* Movie */)
{
_logger.LogInformation("Shoko Scanner... series was not a movie! Skipping.");
return result;
}

var seriesInfo = await ShokoAPI.GetSeries(seriesId);
if (seriesInfo.Sizes.Total.Episodes <= 1)
{
_logger.LogInformation("Shoko Scanner... series did not contain multiple movies! Skipping.");
return result;
}
var tags = await ShokoAPI.GetSeriesTags(seriesId, Helper.GetTagFilter());

var ( displayTitle, alternateTitle ) = Helper.GetSeriesTitles(aniDbInfo.Titles, aniDbInfo.Title, Plugin.Instance.Configuration.TitleMainType, Plugin.Instance.Configuration.TitleAlternateType, info.MetadataLanguage);
result.Item = new BoxSet
{
Name = displayTitle,
OriginalTitle = alternateTitle,
Overview = Helper.SummarySanitizer(aniDbInfo.Description),
PremiereDate = aniDbInfo.AirDate,
EndDate = aniDbInfo.EndDate,
ProductionYear = aniDbInfo.AirDate?.Year,
Tags = tags?.Select(tag => tag.Name).ToArray() ?? new string[0],
CommunityRating = (float)((aniDbInfo.Rating.Value * 10) / aniDbInfo.Rating.MaxValue)
};
result.Item.SetProviderId("Shoko Series", seriesId);
result.HasMetadata = true;

return result;
}
catch (Exception e)
{
_logger.LogError(e.StackTrace);
return new MetadataResult<BoxSet>();
}
}

public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(BoxSetInfo searchInfo, CancellationToken cancellationToken)
{
_logger.LogInformation($"Shoko Scanner... Searching BoxSet ({searchInfo.Name})");
var searchResults = await ShokoAPI.SeriesSearch(searchInfo.Name);
var results = new List<RemoteSearchResult>();

foreach (var series in searchResults)
{
var imageUrl = Helper.GetImageUrl(series.Images.Posters.FirstOrDefault());
_logger.LogInformation(imageUrl);
var parsedBoxSet = new RemoteSearchResult
{
Name = series.Name,
SearchProviderName = Name,
ImageUrl = imageUrl
};
parsedBoxSet.SetProviderId("Shoko", series.IDs.ID.ToString());
results.Add(parsedBoxSet);
}

return results;
}


public Task<HttpResponseMessage> GetImageResponse(string url, CancellationToken cancellationToken)
{
return _httpClientFactory.CreateClient().GetAsync(url, cancellationToken);
}
}
}
3 changes: 2 additions & 1 deletion Shokofin/Providers/EpisodeProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,9 @@ public async Task<MetadataResult<Episode>> GetMetadata(EpisodeInfo info, Cancell
_logger.LogInformation($"Shoko Scanner... Getting episode metadata ({filename} - {episodeId})");

var seriesInfo = await ShokoAPI.GetSeriesAniDb(seriesId);
var episode = await ShokoAPI.GetEpisode(episodeId);
var episodeInfo = await ShokoAPI.GetEpisodeAniDb(episodeId);
var ( displayTitle, alternateTitle ) = Helper.GetEpisodeTitles(seriesInfo.Titles, episodeInfo.Titles, Plugin.Instance.Configuration.TitleMainType, Plugin.Instance.Configuration.TitleAlternateType, info.MetadataLanguage);
var ( displayTitle, alternateTitle ) = Helper.GetEpisodeTitles(seriesInfo.Titles, episodeInfo.Titles, episode.Name, Plugin.Instance.Configuration.TitleMainType, Plugin.Instance.Configuration.TitleAlternateType, info.MetadataLanguage);

result.Item = new Episode
{
Expand Down
Loading

0 comments on commit 14b4387

Please sign in to comment.