Skip to content

Commit

Permalink
Add configuration page
Browse files Browse the repository at this point in the history
  • Loading branch information
te9c committed May 23, 2024
1 parent 37439f7 commit 94919ec
Show file tree
Hide file tree
Showing 5 changed files with 187 additions and 19 deletions.
58 changes: 42 additions & 16 deletions Jellyfin.Plugin.Shikimori/AnimeMangaBaseExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,19 @@ namespace Jellyfin.Plugin.Shikimori
{
public static class AnimeMangaBaseExtensions
{
private static string? GetPreferedTitle(SearchTitlePreferenceType type, AnimeMangaBase anime)
{
return type switch
{
SearchTitlePreferenceType.Romaji => anime.Name,
SearchTitlePreferenceType.Russian => anime.Russian,
_ => null,
};
}
public static RemoteSearchResult ToSearchResult(this AnimeMangaBase anime)
{
var result = new RemoteSearchResult();
result.Name = ShikimoriPlugin.Instance?.Configuration.SearchTitlePreference == SearchTitlePreferenceType.Romaji ? anime.Name : anime.Russian;
result.Name = GetPreferedTitle(ShikimoriPlugin.Instance!.Configuration.SearchTitlePreference, anime);
result.ProductionYear = anime.AiredOn?.DateTime.Year;
result.PremiereDate = anime.AiredOn?.DateTime;
result.ProviderIds = new Dictionary<string, string>() { { ShikimoriPlugin.ProviderId, anime.Id.ToString() } };
Expand All @@ -40,34 +49,51 @@ public static class AnimeIdExtensions
_ => null
};
}

private static string? GetPreferedTitle(TitlePreferenceType type, AnimeID anime)
{
// TODO: Fallback languages?
return type switch
{
TitlePreferenceType.Japanese => anime.Japanese.FirstOrDefault(),
TitlePreferenceType.Romaji => anime.Name,
TitlePreferenceType.Russian => anime.Russian,
_ => null
};
}

private static string? GetPreferedGenreTitle(GenreTitleLanguagePreferenceType type, Genre genre)
{
return type switch
{
GenreTitleLanguagePreferenceType.English => genre.Name,
GenreTitleLanguagePreferenceType.Russian => genre.Russian,
_ => null
};
}
public static Series ToSeries(this AnimeID anime)
{
var result = new Series
{
Name = anime.Russian,
OriginalTitle = anime.Japanese.FirstOrDefault(),
Name = GetPreferedTitle(ShikimoriPlugin.Instance!.Configuration.TitlePreference, anime),
OriginalTitle = GetPreferedTitle(ShikimoriPlugin.Instance!.Configuration.OriginalTitlePreference, anime),
Overview = anime.DescriptionHtml,
ProductionYear = anime.AiredOn?.Year,
PremiereDate = anime.AiredOn?.DateTime,
EndDate = anime.ReleasedOn?.DateTime,
Genres = anime.Genres.Select(i => i.Russian).ToArray(),
Genres = anime.Genres.Select(i => GetPreferedGenreTitle(ShikimoriPlugin.Instance!.Configuration.GenreTitleLanguagePreference, i)).ToArray(),
CommunityRating = float.Parse(anime.Score),
OfficialRating = FormatRating(anime.Rating),
Studios = anime.Studios.Select(i => { return i.Name;}).ToArray(),
Status = anime.Status switch
{
"released" => SeriesStatus.Ended,
"ongoing" => SeriesStatus.Continuing,
"anons" => SeriesStatus.Unreleased,
_ => null,
},
ProviderIds = new Dictionary<string, string> {{ShikimoriPlugin.ProviderName, anime.Id.ToString()}},
};
if (anime.Status == "released")
{
result.Status = SeriesStatus.Ended;
}
else if (anime.Status == "ongoing")
{
result.Status = SeriesStatus.Continuing;
}
else if (anime.Status == "anons")
{
result.Status = SeriesStatus.Unreleased;
}

return result;
}
Expand Down
21 changes: 20 additions & 1 deletion Jellyfin.Plugin.Shikimori/Configuration/PluginConfiguration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,33 @@

namespace Jellyfin.Plugin.Shikimori.Configuration
{
public enum TitlePreferenceType
{
Romaji,
Russian,
Japanese
}

public enum SearchTitlePreferenceType
{
Romaji,
Russian
}

public enum GenreTitleLanguagePreferenceType
{
English,
Russian
}
public class PluginConfiguration : BasePluginConfiguration
{
public PluginConfiguration()
{
SearchLimit = 10;
SearchTitlePreference = SearchTitlePreferenceType.Russian;
TitlePreference = TitlePreferenceType.Russian;
OriginalTitlePreference = TitlePreferenceType.Romaji;
GenreTitleLanguagePreference = GenreTitleLanguagePreferenceType.English;
}
private int _searchLimit;
public int SearchLimit
Expand All @@ -23,6 +39,9 @@ public int SearchLimit
set => _searchLimit = (value >= 1 && value <= 50) ? value : _searchLimit;
}

public SearchTitlePreferenceType SearchTitlePreference { get; set; }
public SearchTitlePreferenceType SearchTitlePreference { get; set; }
public TitlePreferenceType TitlePreference { get; set; }
public TitlePreferenceType OriginalTitlePreference { get; set; }
public GenreTitleLanguagePreferenceType GenreTitleLanguagePreference { get; set; }
}
}
106 changes: 106 additions & 0 deletions Jellyfin.Plugin.Shikimori/Configuration/config.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Shikimori</title>
</head>
<body>
<div id="shikimoriConfigPage" data-role="page" class="page type-interior pluginConfigurationPage"
data-require="emby-input,emby-button,emby-select,emby-checkbox">
<div data-role="content">
<div class="content-primary">
<form id="shikimoriConfigForm">
<div class="inputContainer">
<label class="inputLabel inputLabelUnfocused" for="searchLimit">Search limit</label>
<input id="searchLimit" name="searchLimit" type="number" is="emby-input" min="0"/>
<div class="fieldDescription">Must be a number in range [1;50]</div>
</div>

<div class="selectContainer">
<label class="selectLabel" for="searchTitlePreference">Search Title Preference</label>
<select is="emby-select" id="searchTitlePreference" name="searchTitlePreference"
class="emby-select-withcolor emby-select">
<option id="optLanguageRomaji" value="romaji">Romaji</option>
<option id="optLanguageRussian" value="russian">Russian</option>
</select>
</div>
<div class="selectContainer">
<label class="selectLabel" for="titlePreference">Title Preference</label>
<select is="emby-select" id="titlePreference" name="titlePreference"
class="emby-select-withcolor emby-select">
<option id="optLanguageRomaji" value="romaji">Romaji</option>
<option id="optLanguageRussian" value="russian">Russian</option>
<option id="optLanguageJapanese" value="japanese">Japanese</option>
</select>
</div>
<div class="selectContainer">
<label class="selectLabel" for="originalTitlePreference">Original Title Preference</label>
<select is="emby-select" id="originalTitlePreference" name="originalTitlePreference"
class="emby-select-withcolor emby-select">
<option id="optLanguageRomaji" value="romaji">Romaji</option>
<option id="optLanguageRussian" value="russian">Russian</option>
<option id="optLanguageJapanese" value="japanese">Japanese</option>
</select>
</div>
<div class="selectContainer">
<label class="selectLabel" for="genreTitleLanguagePreference">Genre Language Preference</label>
<select is="emby-select" id="genreTitleLanguagePreference" name="genreTitleLanguagePreference"
class="emby-select-withcolor emby-select">
<option id="optLanguageEnglish" value="english">English</option>
<option id="optLanguageRussian" value="russian">Russian</option>
</select>
</div>
<div>
<button is="emby-button" type="submit" class="raised button-submit block emby-button">
<span>Save</span>
</button>
</div>
</form>
</div>
</div>
<script type="text/javascript">
var shikimoriConfig = {
pluginUniqueId: '7edb2a28-5b8a-4fe8-ae11-d941315eb862',

loadConfiguration: function () {
Dashboard.showLoadingMsg();

ApiClient.getPluginConfiguration(shikimoriConfg.pluginUniqueId).then(function (config) {
document.getElementById('searchLimit').value = config.SearchLimit;
document.getElementById('searchTitlePreference').value = config.SearchTitlePreference;
document.getElementById('titlePreference').value = config.TitlePreference;
document.getElementById('originalTitlePreference').value = config.OriginalTitlePreference;
document.getElementById('genreTitleLanguagePreference').value = config.GenreTitleLanguagePreference;

Dashboard.hideLoadingMsg();
})
},

saveConfiguration: function () {
Dashboard.showLoadingMsg();
ApiClient.getPluginConfiguration(shikimoriConfig.pluginUniqueId).then(function (config) {
config.SearchLimit = document.getElementById('searchLimit').value;
config.SearchTitlePreference = document.getElementById('searchTitlePreference').value;
config.TitlePreference = document.getElementById('titlePreference').value;
config.OriginalTitlePreference = document.getElementById('originalTitlePreference').value;
config.GenreTitleLanguagePreference = document.getElementById('genreTitleLanguagePreference').value;

ApiClient.updatePluginConfiguration(shikimoriConfig.pluginUniqueId, config).then(function (result) {
Dashboard.processPluginConfigurationUpdateResult(result);
})
})
}
}

document.getElementById('shikimoriConfigPage').addEventListener('pageshow', function () {
shikimoriConfig.loadConfiguration();
});

document.getElementById('shikimoriConfigPage').addEventListener('submit', function (e) {
e.preventDefault();
shikimoriConfig.saveConfiguration();
});
</script>
</div>
</body>
</html>
5 changes: 5 additions & 0 deletions Jellyfin.Plugin.Shikimori/Jellyfin.Plugin.Shikimori.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,9 @@
<PackageReference Include="ShikimoriSharp" Version="1.3.4" />
</ItemGroup>

<ItemGroup>
<None Remove="Configuration\config.html" />
<EmbeddedResource Include="Configuration\config.html" />
</ItemGroup>

</Project>
16 changes: 14 additions & 2 deletions Jellyfin.Plugin.Shikimori/ShikimoriPlugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@
using MediaBrowser.Common.Plugins;
using Jellyfin.Plugin.Shikimori.Configuration;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Model.Plugins;
using MediaBrowser.Model.Serialization;

namespace Jellyfin.Plugin.Shikimori
{
public class ShikimoriPlugin : BasePlugin<PluginConfiguration>
public class ShikimoriPlugin : BasePlugin<PluginConfiguration>, IHasWebPages
{
public IHttpClientFactory HttpClientFactory { get; init; }
public ShikimoriPlugin(
Expand All @@ -24,8 +25,19 @@ public ShikimoriPlugin(
public const string ShikimoriBaseUrl = "https://shikimori.one";

public override string Name => "Shikimori";
public override Guid Id => Guid.Parse("7EDB2A28-5B8A-4FE8-AE11-D941315EB862");
public override Guid Id => Guid.Parse("7edb2a28-5b8a-4fe8-ae11-d941315eb862");

public static ShikimoriPlugin? Instance { get; private set; }
public IEnumerable<PluginPageInfo> GetPages()
{
return new[]
{
new PluginPageInfo
{
Name = Name,
EmbeddedResourcePath = $"{GetType().Namespace}.Configuration.config.html"
}
};
}
}
}

0 comments on commit 94919ec

Please sign in to comment.