refactor(nmoonanime): rename MoonAnime module to NMoonAnime

This commit is contained in:
Felix 2026-03-07 17:12:49 +02:00
parent bffdf68bde
commit dbb24205d7
11 changed files with 102 additions and 102 deletions

View File

@ -45,7 +45,7 @@ namespace AnimeON
AnimeON = new OnlinesSettings("AnimeON", "https://animeon.club", streamproxy: false, useproxy: false) AnimeON = new OnlinesSettings("AnimeON", "https://animeon.club", streamproxy: false, useproxy: false)
{ {
displayname = "🇯🇵 AnimeON", displayname = "AnimeON",
displayindex = 0, displayindex = 0,
proxy = new Shared.Models.Base.ProxySettings() proxy = new Shared.Models.Base.ProxySettings()
{ {

View File

@ -1,6 +0,0 @@
{
"enable": true,
"version": 3,
"initspace": "MoonAnime.ModInit",
"online": "MoonAnime.OnlineApi"
}

View File

@ -1,5 +1,5 @@
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using MoonAnime.Models; using NMoonAnime.Models;
using Shared; using Shared;
using Shared.Engine; using Shared.Engine;
using Shared.Models; using Shared.Models;
@ -13,7 +13,7 @@ using System.Text.RegularExpressions;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Web; using System.Web;
namespace MoonAnime.Controllers namespace NMoonAnime.Controllers
{ {
public class Controller : BaseOnlineController public class Controller : BaseOnlineController
{ {
@ -21,47 +21,47 @@ namespace MoonAnime.Controllers
public Controller() : base(ModInit.Settings) public Controller() : base(ModInit.Settings)
{ {
proxyManager = new ProxyManager(ModInit.MoonAnime); proxyManager = new ProxyManager(ModInit.NMoonAnime);
} }
[HttpGet] [HttpGet]
[Route("moonanime")] [Route("nmoonanime")]
public async Task<ActionResult> Index(long id, string imdb_id, long kinopoisk_id, string title, string original_title, string original_language, int year, string source, int serial, string account_email, string mal_id, string t, int s = -1, bool rjson = false, bool checksearch = false) public async Task<ActionResult> Index(long id, string imdb_id, long kinopoisk_id, string title, string original_title, string original_language, int year, string source, int serial, string account_email, string mal_id, string t, int s = -1, bool rjson = false, bool checksearch = false)
{ {
await UpdateService.ConnectAsync(host); await UpdateService.ConnectAsync(host);
var init = await loadKit(ModInit.MoonAnime); var init = await loadKit(ModInit.NMoonAnime);
if (!init.enable) if (!init.enable)
return Forbid(); return Forbid();
var invoke = new MoonAnimeInvoke(init, hybridCache, OnLog, proxyManager); var invoke = new NMoonAnimeInvoke(init, hybridCache, OnLog, proxyManager);
if (checksearch) if (checksearch)
{ {
if (AppInit.conf?.online?.checkOnlineSearch != true) if (AppInit.conf?.online?.checkOnlineSearch != true)
return OnError("moonanime", proxyManager); return OnError("nmoonanime", proxyManager);
var checkResults = await invoke.Search(imdb_id, mal_id, title, original_title, year); var checkResults = await invoke.Search(imdb_id, mal_id, title, original_title, year);
if (checkResults != null && checkResults.Count > 0) if (checkResults != null && checkResults.Count > 0)
return Content("data-json=", "text/plain; charset=utf-8"); return Content("data-json=", "text/plain; charset=utf-8");
return OnError("moonanime", proxyManager); return OnError("nmoonanime", proxyManager);
} }
OnLog($"MoonAnime: title={title}, original_title={original_title}, imdb={imdb_id}, mal_id={mal_id}, serial={serial}, s={s}, t={t}"); OnLog($"NMoonAnime: назва={title}, оригінальнаазва={original_title}, imdb={imdb_id}, mal_id={mal_id}, серіал={serial}, сезон={s}, озвучка={t}");
var seasons = await invoke.Search(imdb_id, mal_id, title, original_title, year); var seasons = await invoke.Search(imdb_id, mal_id, title, original_title, year);
if (seasons == null || seasons.Count == 0) if (seasons == null || seasons.Count == 0)
return OnError("moonanime", proxyManager); return OnError("nmoonanime", proxyManager);
bool isSeries = serial == 1; bool isSeries = serial == 1;
MoonAnimeSeasonContent firstSeasonData = null; NMoonAnimeSeasonContent firstSeasonData = null;
if (serial == -1) if (serial == -1)
{ {
firstSeasonData = await invoke.GetSeasonContent(seasons[0]); firstSeasonData = await invoke.GetSeasonContent(seasons[0]);
if (firstSeasonData == null || firstSeasonData.Voices.Count == 0) if (firstSeasonData == null || firstSeasonData.Voices.Count == 0)
return OnError("moonanime", proxyManager); return OnError("nmoonanime", proxyManager);
isSeries = firstSeasonData.IsSeries; isSeries = firstSeasonData.IsSeries;
} }
@ -74,22 +74,22 @@ namespace MoonAnime.Controllers
return await RenderMovie(invoke, seasons, title, original_title, firstSeasonData, rjson); return await RenderMovie(invoke, seasons, title, original_title, firstSeasonData, rjson);
} }
[HttpGet("moonanime/play")] [HttpGet("nmoonanime/play")]
public async Task<ActionResult> Play(string file, string title = null) public async Task<ActionResult> Play(string file, string title = null)
{ {
await UpdateService.ConnectAsync(host); await UpdateService.ConnectAsync(host);
var init = await loadKit(ModInit.MoonAnime); var init = await loadKit(ModInit.NMoonAnime);
if (!init.enable) if (!init.enable)
return Forbid(); return Forbid();
if (string.IsNullOrWhiteSpace(file)) if (string.IsNullOrWhiteSpace(file))
return OnError("moonanime", proxyManager); return OnError("nmoonanime", proxyManager);
var invoke = new MoonAnimeInvoke(init, hybridCache, OnLog, proxyManager); var invoke = new NMoonAnimeInvoke(init, hybridCache, OnLog, proxyManager);
var streams = invoke.ParseStreams(file); var streams = invoke.ParseStreams(file);
if (streams == null || streams.Count == 0) if (streams == null || streams.Count == 0)
return OnError("moonanime", proxyManager); return OnError("nmoonanime", proxyManager);
if (streams.Count == 1) if (streams.Count == 1)
{ {
@ -106,7 +106,7 @@ namespace MoonAnime.Controllers
} }
if (!streamQuality.Any()) if (!streamQuality.Any())
return OnError("moonanime", proxyManager); return OnError("nmoonanime", proxyManager);
var first = streamQuality.Firts(); var first = streamQuality.Firts();
string json = VideoTpl.ToJson("play", first.link, title ?? string.Empty, streamquality: streamQuality); string json = VideoTpl.ToJson("play", first.link, title ?? string.Empty, streamquality: streamQuality);
@ -114,8 +114,8 @@ namespace MoonAnime.Controllers
} }
private async Task<ActionResult> RenderSerial( private async Task<ActionResult> RenderSerial(
MoonAnimeInvoke invoke, NMoonAnimeInvoke invoke,
List<MoonAnimeSeasonRef> seasons, List<NMoonAnimeSeasonRef> seasons,
string imdbId, string imdbId,
long kinopoiskId, long kinopoiskId,
string title, string title,
@ -132,7 +132,7 @@ namespace MoonAnime.Controllers
.ToList(); .ToList();
if (orderedSeasons.Count == 0) if (orderedSeasons.Count == 0)
return OnError("moonanime", proxyManager); return OnError("nmoonanime", proxyManager);
if (selectedSeason == -1) if (selectedSeason == -1)
{ {
@ -153,14 +153,14 @@ namespace MoonAnime.Controllers
var currentSeason = orderedSeasons.FirstOrDefault(s => s.SeasonNumber == selectedSeason) ?? orderedSeasons[0]; var currentSeason = orderedSeasons.FirstOrDefault(s => s.SeasonNumber == selectedSeason) ?? orderedSeasons[0];
var seasonData = await invoke.GetSeasonContent(currentSeason); var seasonData = await invoke.GetSeasonContent(currentSeason);
if (seasonData == null) if (seasonData == null)
return OnError("moonanime", proxyManager); return OnError("nmoonanime", proxyManager);
var voices = seasonData.Voices var voices = seasonData.Voices
.Where(v => v != null && v.Episodes != null && v.Episodes.Count > 0) .Where(v => v != null && v.Episodes != null && v.Episodes.Count > 0)
.ToList(); .ToList();
if (voices.Count == 0) if (voices.Count == 0)
return OnError("moonanime", proxyManager); return OnError("nmoonanime", proxyManager);
int activeVoiceIndex = ParseVoiceIndex(selectedVoice, voices.Count); int activeVoiceIndex = ParseVoiceIndex(selectedVoice, voices.Count);
var voiceTpl = new VoiceTpl(voices.Count); var voiceTpl = new VoiceTpl(voices.Count);
@ -179,20 +179,20 @@ namespace MoonAnime.Controllers
.ToList(); .ToList();
if (episodes.Count == 0) if (episodes.Count == 0)
return OnError("moonanime", proxyManager); return OnError("nmoonanime", proxyManager);
string displayTitle = !string.IsNullOrWhiteSpace(title) string displayTitle = !string.IsNullOrWhiteSpace(title)
? title ? title
: !string.IsNullOrWhiteSpace(originalTitle) : !string.IsNullOrWhiteSpace(originalTitle)
? originalTitle ? originalTitle
: "MoonAnime"; : "NMoonAnime";
var episodeTpl = new EpisodeTpl(episodes.Count); var episodeTpl = new EpisodeTpl(episodes.Count);
foreach (var episode in episodes) foreach (var episode in episodes)
{ {
int episodeNumber = episode.Number <= 0 ? 1 : episode.Number; int episodeNumber = episode.Number <= 0 ? 1 : episode.Number;
string episodeName = string.IsNullOrWhiteSpace(episode.Name) ? $"Епізод {episodeNumber}" : episode.Name; string episodeName = string.IsNullOrWhiteSpace(episode.Name) ? $"Епізод {episodeNumber}" : episode.Name;
string callUrl = $"{host}/moonanime/play?file={HttpUtility.UrlEncode(episode.File)}&title={HttpUtility.UrlEncode(displayTitle)}"; string callUrl = $"{host}/nmoonanime/play?file={HttpUtility.UrlEncode(episode.File)}&title={HttpUtility.UrlEncode(displayTitle)}";
episodeTpl.Append(episodeName, displayTitle, currentSeason.SeasonNumber.ToString(), episodeNumber.ToString(), accsArgs(callUrl), "call"); episodeTpl.Append(episodeName, displayTitle, currentSeason.SeasonNumber.ToString(), episodeNumber.ToString(), accsArgs(callUrl), "call");
} }
@ -204,11 +204,11 @@ namespace MoonAnime.Controllers
} }
private async Task<ActionResult> RenderMovie( private async Task<ActionResult> RenderMovie(
MoonAnimeInvoke invoke, NMoonAnimeInvoke invoke,
List<MoonAnimeSeasonRef> seasons, List<NMoonAnimeSeasonRef> seasons,
string title, string title,
string originalTitle, string originalTitle,
MoonAnimeSeasonContent firstSeasonData, NMoonAnimeSeasonContent firstSeasonData,
bool rjson) bool rjson)
{ {
var currentSeason = seasons var currentSeason = seasons
@ -217,20 +217,20 @@ namespace MoonAnime.Controllers
.FirstOrDefault(); .FirstOrDefault();
if (currentSeason == null) if (currentSeason == null)
return OnError("moonanime", proxyManager); return OnError("nmoonanime", proxyManager);
MoonAnimeSeasonContent seasonData = firstSeasonData; NMoonAnimeSeasonContent seasonData = firstSeasonData;
if (seasonData == null || !string.Equals(seasonData.Url, currentSeason.Url, StringComparison.OrdinalIgnoreCase)) if (seasonData == null || !string.Equals(seasonData.Url, currentSeason.Url, StringComparison.OrdinalIgnoreCase))
seasonData = await invoke.GetSeasonContent(currentSeason); seasonData = await invoke.GetSeasonContent(currentSeason);
if (seasonData == null || seasonData.Voices.Count == 0) if (seasonData == null || seasonData.Voices.Count == 0)
return OnError("moonanime", proxyManager); return OnError("nmoonanime", proxyManager);
string displayTitle = !string.IsNullOrWhiteSpace(title) string displayTitle = !string.IsNullOrWhiteSpace(title)
? title ? title
: !string.IsNullOrWhiteSpace(originalTitle) : !string.IsNullOrWhiteSpace(originalTitle)
? originalTitle ? originalTitle
: "MoonAnime"; : "NMoonAnime";
var movieTpl = new MovieTpl(displayTitle, originalTitle); var movieTpl = new MovieTpl(displayTitle, originalTitle);
int fallbackIndex = 1; int fallbackIndex = 1;
@ -248,13 +248,13 @@ namespace MoonAnime.Controllers
continue; continue;
string voiceName = string.IsNullOrWhiteSpace(voice.Name) ? $"Озвучка {fallbackIndex}" : voice.Name; string voiceName = string.IsNullOrWhiteSpace(voice.Name) ? $"Озвучка {fallbackIndex}" : voice.Name;
string callUrl = $"{host}/moonanime/play?file={HttpUtility.UrlEncode(file)}&title={HttpUtility.UrlEncode(displayTitle)}"; string callUrl = $"{host}/nmoonanime/play?file={HttpUtility.UrlEncode(file)}&title={HttpUtility.UrlEncode(displayTitle)}";
movieTpl.Append(voiceName, accsArgs(callUrl), "call"); movieTpl.Append(voiceName, accsArgs(callUrl), "call");
fallbackIndex++; fallbackIndex++;
} }
if (movieTpl.IsEmpty) if (movieTpl.IsEmpty)
return OnError("moonanime", proxyManager); return OnError("nmoonanime", proxyManager);
return rjson return rjson
? Content(movieTpl.ToJson(), "application/json; charset=utf-8") ? Content(movieTpl.ToJson(), "application/json; charset=utf-8")
@ -264,7 +264,7 @@ namespace MoonAnime.Controllers
private string BuildIndexUrl(string imdbId, long kinopoiskId, string title, string originalTitle, int year, int serial, string malId, int season, string voice) private string BuildIndexUrl(string imdbId, long kinopoiskId, string title, string originalTitle, int year, int serial, string malId, int season, string voice)
{ {
var url = new StringBuilder(); var url = new StringBuilder();
url.Append($"{host}/moonanime?imdb_id={HttpUtility.UrlEncode(imdbId)}"); url.Append($"{host}/nmoonanime?imdb_id={HttpUtility.UrlEncode(imdbId)}");
url.Append($"&kinopoisk_id={kinopoiskId}"); url.Append($"&kinopoisk_id={kinopoiskId}");
url.Append($"&title={HttpUtility.UrlEncode(title)}"); url.Append($"&title={HttpUtility.UrlEncode(title)}");
url.Append($"&original_title={HttpUtility.UrlEncode(originalTitle)}"); url.Append($"&original_title={HttpUtility.UrlEncode(originalTitle)}");

View File

@ -14,20 +14,20 @@ using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace MoonAnime namespace NMoonAnime
{ {
public class ModInit public class ModInit
{ {
public static double Version => 1.0; public static double Version => 1.0;
public static OnlinesSettings MoonAnime; public static OnlinesSettings NMoonAnime;
public static bool ApnHostProvided; public static bool ApnHostProvided;
public static OnlinesSettings Settings public static OnlinesSettings Settings
{ {
get => MoonAnime; get => NMoonAnime;
set => MoonAnime = value; set => NMoonAnime = value;
} }
/// <summary> /// <summary>
@ -35,9 +35,9 @@ namespace MoonAnime
/// </summary> /// </summary>
public static void loaded(InitspaceModel initspace) public static void loaded(InitspaceModel initspace)
{ {
MoonAnime = new OnlinesSettings("MoonAnime", "https://moonanime.art", "https://apx.lme.isroot.in", streamproxy: false, useproxy: false) NMoonAnime = new OnlinesSettings("NMoonAnime", "https://moonanime.art", "https://apx.lme.isroot.in", streamproxy: false, useproxy: false)
{ {
displayname = "MoonAnime", displayname = "🌙 NMoonAnime",
displayindex = 0, displayindex = 0,
proxy = new Shared.Models.Base.ProxySettings() proxy = new Shared.Models.Base.ProxySettings()
{ {
@ -48,27 +48,27 @@ namespace MoonAnime
} }
}; };
var conf = ModuleInvoke.Conf("MoonAnime", MoonAnime) ?? JObject.FromObject(MoonAnime); var conf = ModuleInvoke.Conf("NMoonAnime", NMoonAnime) ?? JObject.FromObject(NMoonAnime);
bool hasApn = ApnHelper.TryGetInitConf(conf, out bool apnEnabled, out string apnHost); bool hasApn = ApnHelper.TryGetInitConf(conf, out bool apnEnabled, out string apnHost);
conf.Remove("apn"); conf.Remove("apn");
conf.Remove("apn_host"); conf.Remove("apn_host");
MoonAnime = conf.ToObject<OnlinesSettings>(); NMoonAnime = conf.ToObject<OnlinesSettings>();
if (hasApn) if (hasApn)
ApnHelper.ApplyInitConf(apnEnabled, apnHost, MoonAnime); ApnHelper.ApplyInitConf(apnEnabled, apnHost, NMoonAnime);
ApnHostProvided = hasApn && apnEnabled && !string.IsNullOrWhiteSpace(apnHost); ApnHostProvided = hasApn && apnEnabled && !string.IsNullOrWhiteSpace(apnHost);
if (hasApn && apnEnabled) if (hasApn && apnEnabled)
{ {
MoonAnime.streamproxy = false; NMoonAnime.streamproxy = false;
} }
else if (MoonAnime.streamproxy) else if (NMoonAnime.streamproxy)
{ {
MoonAnime.apnstream = false; NMoonAnime.apnstream = false;
MoonAnime.apn = null; NMoonAnime.apn = null;
} }
AppInit.conf.online.with_search.Add("moonanime"); AppInit.conf.online.with_search.Add("nmoonanime");
} }
} }

View File

@ -1,15 +1,15 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
namespace MoonAnime.Models namespace NMoonAnime.Models
{ {
public class MoonAnimeSearchResponse public class NMoonAnimeSearchResponse
{ {
[JsonPropertyName("seasons")] [JsonPropertyName("seasons")]
public List<MoonAnimeSeasonRef> Seasons { get; set; } = new(); public List<NMoonAnimeSeasonRef> Seasons { get; set; } = new();
} }
public class MoonAnimeSeasonRef public class NMoonAnimeSeasonRef
{ {
[JsonPropertyName("season_number")] [JsonPropertyName("season_number")]
public int SeasonNumber { get; set; } public int SeasonNumber { get; set; }
@ -18,7 +18,7 @@ namespace MoonAnime.Models
public string Url { get; set; } public string Url { get; set; }
} }
public class MoonAnimeSeasonContent public class NMoonAnimeSeasonContent
{ {
public int SeasonNumber { get; set; } public int SeasonNumber { get; set; }
@ -26,19 +26,19 @@ namespace MoonAnime.Models
public bool IsSeries { get; set; } public bool IsSeries { get; set; }
public List<MoonAnimeVoiceContent> Voices { get; set; } = new(); public List<NMoonAnimeVoiceContent> Voices { get; set; } = new();
} }
public class MoonAnimeVoiceContent public class NMoonAnimeVoiceContent
{ {
public string Name { get; set; } public string Name { get; set; }
public string MovieFile { get; set; } public string MovieFile { get; set; }
public List<MoonAnimeEpisodeContent> Episodes { get; set; } = new(); public List<NMoonAnimeEpisodeContent> Episodes { get; set; } = new();
} }
public class MoonAnimeEpisodeContent public class NMoonAnimeEpisodeContent
{ {
public string Name { get; set; } public string Name { get; set; }
@ -47,7 +47,7 @@ namespace MoonAnime.Models
public string File { get; set; } public string File { get; set; }
} }
public class MoonAnimeStreamVariant public class NMoonAnimeStreamVariant
{ {
public string Url { get; set; } public string Url { get; set; }

View File

@ -1,4 +1,4 @@
using MoonAnime.Models; using NMoonAnime.Models;
using Shared; using Shared;
using Shared.Engine; using Shared.Engine;
using Shared.Models; using Shared.Models;
@ -12,9 +12,9 @@ using System.Text.RegularExpressions;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Web; using System.Web;
namespace MoonAnime namespace NMoonAnime
{ {
public class MoonAnimeInvoke public class NMoonAnimeInvoke
{ {
private readonly OnlinesSettings _init; private readonly OnlinesSettings _init;
private readonly IHybridCache _hybridCache; private readonly IHybridCache _hybridCache;
@ -25,7 +25,7 @@ namespace MoonAnime
PropertyNameCaseInsensitive = true PropertyNameCaseInsensitive = true
}; };
public MoonAnimeInvoke(OnlinesSettings init, IHybridCache hybridCache, Action<string> onLog, ProxyManager proxyManager) public NMoonAnimeInvoke(OnlinesSettings init, IHybridCache hybridCache, Action<string> onLog, ProxyManager proxyManager)
{ {
_init = init; _init = init;
_hybridCache = hybridCache; _hybridCache = hybridCache;
@ -33,10 +33,10 @@ namespace MoonAnime
_proxyManager = proxyManager; _proxyManager = proxyManager;
} }
public async Task<List<MoonAnimeSeasonRef>> Search(string imdbId, string malId, string title, string originalTitle, int year) public async Task<List<NMoonAnimeSeasonRef>> Search(string imdbId, string malId, string title, string originalTitle, int year)
{ {
string memKey = $"MoonAnime:search:{imdbId}:{malId}:{title}:{originalTitle}:{year}"; string memKey = $"NMoonAnime:search:{imdbId}:{malId}:{title}:{originalTitle}:{year}";
if (_hybridCache.TryGetValue(memKey, out List<MoonAnimeSeasonRef> cached)) if (_hybridCache.TryGetValue(memKey, out List<NMoonAnimeSeasonRef> cached))
return cached; return cached;
try try
@ -53,15 +53,15 @@ namespace MoonAnime
if (string.IsNullOrWhiteSpace(searchUrl)) if (string.IsNullOrWhiteSpace(searchUrl))
continue; continue;
_onLog($"MoonAnime: пошук через {searchUrl}"); _onLog($"NMoonAnime: пошук через {searchUrl}");
string json = await Http.Get(_init.cors(searchUrl), headers: DefaultHeaders(), proxy: _proxyManager.Get()); string json = await Http.Get(_init.cors(searchUrl), headers: DefaultHeaders(), proxy: _proxyManager.Get());
if (string.IsNullOrWhiteSpace(json)) if (string.IsNullOrWhiteSpace(json))
continue; continue;
var response = JsonSerializer.Deserialize<MoonAnimeSearchResponse>(json, _jsonOptions); var response = JsonSerializer.Deserialize<NMoonAnimeSearchResponse>(json, _jsonOptions);
var seasons = response?.Seasons? var seasons = response?.Seasons?
.Where(s => s != null && !string.IsNullOrWhiteSpace(s.Url)) .Where(s => s != null && !string.IsNullOrWhiteSpace(s.Url))
.Select(s => new MoonAnimeSeasonRef .Select(s => new NMoonAnimeSeasonRef
{ {
SeasonNumber = s.SeasonNumber <= 0 ? 1 : s.SeasonNumber, SeasonNumber = s.SeasonNumber <= 0 ? 1 : s.SeasonNumber,
Url = s.Url.Trim() Url = s.Url.Trim()
@ -80,24 +80,24 @@ namespace MoonAnime
} }
catch (Exception ex) catch (Exception ex)
{ {
_onLog($"MoonAnime: помилка пошуку - {ex.Message}"); _onLog($"NMoonAnime: помилка пошуку - {ex.Message}");
} }
return new List<MoonAnimeSeasonRef>(); return new List<NMoonAnimeSeasonRef>();
} }
public async Task<MoonAnimeSeasonContent> GetSeasonContent(MoonAnimeSeasonRef season) public async Task<NMoonAnimeSeasonContent> GetSeasonContent(NMoonAnimeSeasonRef season)
{ {
if (season == null || string.IsNullOrWhiteSpace(season.Url)) if (season == null || string.IsNullOrWhiteSpace(season.Url))
return null; return null;
string memKey = $"MoonAnime:season:{season.Url}"; string memKey = $"NMoonAnime:season:{season.Url}";
if (_hybridCache.TryGetValue(memKey, out MoonAnimeSeasonContent cached)) if (_hybridCache.TryGetValue(memKey, out NMoonAnimeSeasonContent cached))
return cached; return cached;
try try
{ {
_onLog($"MoonAnime: завантаження сезону {season.Url}"); _onLog($"NMoonAnime: завантаження сезону {season.Url}");
string html = await Http.Get(_init.cors(season.Url), headers: DefaultHeaders(), proxy: _proxyManager.Get()); string html = await Http.Get(_init.cors(season.Url), headers: DefaultHeaders(), proxy: _proxyManager.Get());
if (string.IsNullOrWhiteSpace(html)) if (string.IsNullOrWhiteSpace(html))
return null; return null;
@ -110,14 +110,14 @@ namespace MoonAnime
} }
catch (Exception ex) catch (Exception ex)
{ {
_onLog($"MoonAnime: помилка читання сезону - {ex.Message}"); _onLog($"NMoonAnime: помилка читання сезону - {ex.Message}");
return null; return null;
} }
} }
public List<MoonAnimeStreamVariant> ParseStreams(string rawFile) public List<NMoonAnimeStreamVariant> ParseStreams(string rawFile)
{ {
var streams = new List<MoonAnimeStreamVariant>(); var streams = new List<NMoonAnimeStreamVariant>();
if (string.IsNullOrWhiteSpace(rawFile)) if (string.IsNullOrWhiteSpace(rawFile))
return streams; return streams;
@ -131,7 +131,7 @@ namespace MoonAnime
if (string.IsNullOrWhiteSpace(url)) if (string.IsNullOrWhiteSpace(url))
continue; continue;
streams.Add(new MoonAnimeStreamVariant streams.Add(new NMoonAnimeStreamVariant
{ {
Url = url, Url = url,
Quality = quality Quality = quality
@ -148,7 +148,7 @@ namespace MoonAnime
if (string.IsNullOrWhiteSpace(url)) if (string.IsNullOrWhiteSpace(url))
continue; continue;
streams.Add(new MoonAnimeStreamVariant streams.Add(new NMoonAnimeStreamVariant
{ {
Url = url, Url = url,
Quality = quality Quality = quality
@ -167,7 +167,7 @@ namespace MoonAnime
{ {
for (int i = 0; i < plainLinks.Count; i++) for (int i = 0; i < plainLinks.Count; i++)
{ {
streams.Add(new MoonAnimeStreamVariant streams.Add(new NMoonAnimeStreamVariant
{ {
Url = plainLinks[i], Url = plainLinks[i],
Quality = $"auto-{i + 1}" Quality = $"auto-{i + 1}"
@ -178,7 +178,7 @@ namespace MoonAnime
if (streams.Count == 0 && value.StartsWith("http", StringComparison.OrdinalIgnoreCase)) if (streams.Count == 0 && value.StartsWith("http", StringComparison.OrdinalIgnoreCase))
{ {
streams.Add(new MoonAnimeStreamVariant streams.Add(new NMoonAnimeStreamVariant
{ {
Url = value, Url = value,
Quality = "auto" Quality = "auto"
@ -187,7 +187,7 @@ namespace MoonAnime
return streams return streams
.Where(s => s != null && !string.IsNullOrWhiteSpace(s.Url)) .Where(s => s != null && !string.IsNullOrWhiteSpace(s.Url))
.Select(s => new MoonAnimeStreamVariant .Select(s => new NMoonAnimeStreamVariant
{ {
Url = s.Url.Trim(), Url = s.Url.Trim(),
Quality = NormalizeQuality(s.Quality) Quality = NormalizeQuality(s.Quality)
@ -223,9 +223,9 @@ namespace MoonAnime
return $"{_init.apihost.TrimEnd('/')}{endpoint}?{query}"; return $"{_init.apihost.TrimEnd('/')}{endpoint}?{query}";
} }
private MoonAnimeSeasonContent ParseSeasonPage(string html, int seasonNumber, string seasonUrl) private NMoonAnimeSeasonContent ParseSeasonPage(string html, int seasonNumber, string seasonUrl)
{ {
var content = new MoonAnimeSeasonContent var content = new NMoonAnimeSeasonContent
{ {
SeasonNumber = seasonNumber <= 0 ? 1 : seasonNumber, SeasonNumber = seasonNumber <= 0 ? 1 : seasonNumber,
Url = seasonUrl, Url = seasonUrl,
@ -246,7 +246,7 @@ namespace MoonAnime
if (entry.ValueKind != JsonValueKind.Object) if (entry.ValueKind != JsonValueKind.Object)
continue; continue;
var voice = new MoonAnimeVoiceContent var voice = new NMoonAnimeVoiceContent
{ {
Name = NormalizeVoiceName(GetStringProperty(entry, "title"), voiceIndex) Name = NormalizeVoiceName(GetStringProperty(entry, "title"), voiceIndex)
}; };
@ -266,7 +266,7 @@ namespace MoonAnime
string episodeTitle = GetStringProperty(episodeEntry, "title"); string episodeTitle = GetStringProperty(episodeEntry, "title");
int episodeNumber = ParseEpisodeNumber(episodeTitle, episodeIndex); int episodeNumber = ParseEpisodeNumber(episodeTitle, episodeIndex);
voice.Episodes.Add(new MoonAnimeEpisodeContent voice.Episodes.Add(new NMoonAnimeEpisodeContent
{ {
Name = string.IsNullOrWhiteSpace(episodeTitle) ? $"Епізод {episodeNumber}" : WebUtility.HtmlDecode(episodeTitle), Name = string.IsNullOrWhiteSpace(episodeTitle) ? $"Епізод {episodeNumber}" : WebUtility.HtmlDecode(episodeTitle),
Number = episodeNumber, Number = episodeNumber,

View File

@ -5,7 +5,7 @@ using Shared.Models.Base;
using Shared.Models.Module; using Shared.Models.Module;
using System.Collections.Generic; using System.Collections.Generic;
namespace MoonAnime namespace NMoonAnime
{ {
public class OnlineApi public class OnlineApi
{ {
@ -24,7 +24,7 @@ namespace MoonAnime
{ {
var online = new List<(string name, string url, string plugin, int index)>(); var online = new List<(string name, string url, string plugin, int index)>();
var init = ModInit.MoonAnime; var init = ModInit.NMoonAnime;
bool hasLang = !string.IsNullOrEmpty(original_language); bool hasLang = !string.IsNullOrEmpty(original_language);
bool isAnime = hasLang && (original_language == "ja" || original_language == "zh"); bool isAnime = hasLang && (original_language == "ja" || original_language == "zh");
@ -33,9 +33,9 @@ namespace MoonAnime
{ {
string url = init.overridehost; string url = init.overridehost;
if (string.IsNullOrEmpty(url) || UpdateService.IsDisconnected()) if (string.IsNullOrEmpty(url) || UpdateService.IsDisconnected())
url = $"{host}/moonanime"; url = $"{host}/nmoonanime";
online.Add((init.displayname, url, "moonanime", init.displayindex)); online.Add((init.displayname, url, "nmoonanime", init.displayindex));
} }
return online; return online;

6
NMoonAnime/manifest.json Normal file
View File

@ -0,0 +1,6 @@
{
"enable": true,
"version": 3,
"initspace": "NMoonAnime.ModInit",
"online": "NMoonAnime.OnlineApi"
}

View File

@ -13,7 +13,7 @@
- [x] BambooUA - [x] BambooUA
- [x] Unimay - [x] Unimay
- [x] Mikai - [x] Mikai
- [x] MoonAnime - [x] NMoonAnime
## Installation ## Installation
@ -42,7 +42,7 @@ Create or update the module/repository.yaml file
- AnimeON - AnimeON
- Unimay - Unimay
- Mikai - Mikai
- MoonAnime - NMoonAnime
- Uaflix - Uaflix
- Bamboo - Bamboo
- Makhno - Makhno
@ -163,7 +163,7 @@ Sources with APN support:
- Mikai - Mikai
- Makhno - Makhno
- KlonFUN - KlonFUN
- MoonAnime - NMoonAnime
## Source/player availability check script ## Source/player availability check script