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)
{
displayname = "🇯🇵 AnimeON",
displayname = "AnimeON",
displayindex = 0,
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 MoonAnime.Models;
using NMoonAnime.Models;
using Shared;
using Shared.Engine;
using Shared.Models;
@ -13,7 +13,7 @@ using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Web;
namespace MoonAnime.Controllers
namespace NMoonAnime.Controllers
{
public class Controller : BaseOnlineController
{
@ -21,47 +21,47 @@ namespace MoonAnime.Controllers
public Controller() : base(ModInit.Settings)
{
proxyManager = new ProxyManager(ModInit.MoonAnime);
proxyManager = new ProxyManager(ModInit.NMoonAnime);
}
[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)
{
await UpdateService.ConnectAsync(host);
var init = await loadKit(ModInit.MoonAnime);
var init = await loadKit(ModInit.NMoonAnime);
if (!init.enable)
return Forbid();
var invoke = new MoonAnimeInvoke(init, hybridCache, OnLog, proxyManager);
var invoke = new NMoonAnimeInvoke(init, hybridCache, OnLog, proxyManager);
if (checksearch)
{
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);
if (checkResults != null && checkResults.Count > 0)
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);
if (seasons == null || seasons.Count == 0)
return OnError("moonanime", proxyManager);
return OnError("nmoonanime", proxyManager);
bool isSeries = serial == 1;
MoonAnimeSeasonContent firstSeasonData = null;
NMoonAnimeSeasonContent firstSeasonData = null;
if (serial == -1)
{
firstSeasonData = await invoke.GetSeasonContent(seasons[0]);
if (firstSeasonData == null || firstSeasonData.Voices.Count == 0)
return OnError("moonanime", proxyManager);
return OnError("nmoonanime", proxyManager);
isSeries = firstSeasonData.IsSeries;
}
@ -74,22 +74,22 @@ namespace MoonAnime.Controllers
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)
{
await UpdateService.ConnectAsync(host);
var init = await loadKit(ModInit.MoonAnime);
var init = await loadKit(ModInit.NMoonAnime);
if (!init.enable)
return Forbid();
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);
if (streams == null || streams.Count == 0)
return OnError("moonanime", proxyManager);
return OnError("nmoonanime", proxyManager);
if (streams.Count == 1)
{
@ -106,7 +106,7 @@ namespace MoonAnime.Controllers
}
if (!streamQuality.Any())
return OnError("moonanime", proxyManager);
return OnError("nmoonanime", proxyManager);
var first = streamQuality.Firts();
string json = VideoTpl.ToJson("play", first.link, title ?? string.Empty, streamquality: streamQuality);
@ -114,8 +114,8 @@ namespace MoonAnime.Controllers
}
private async Task<ActionResult> RenderSerial(
MoonAnimeInvoke invoke,
List<MoonAnimeSeasonRef> seasons,
NMoonAnimeInvoke invoke,
List<NMoonAnimeSeasonRef> seasons,
string imdbId,
long kinopoiskId,
string title,
@ -132,7 +132,7 @@ namespace MoonAnime.Controllers
.ToList();
if (orderedSeasons.Count == 0)
return OnError("moonanime", proxyManager);
return OnError("nmoonanime", proxyManager);
if (selectedSeason == -1)
{
@ -153,14 +153,14 @@ namespace MoonAnime.Controllers
var currentSeason = orderedSeasons.FirstOrDefault(s => s.SeasonNumber == selectedSeason) ?? orderedSeasons[0];
var seasonData = await invoke.GetSeasonContent(currentSeason);
if (seasonData == null)
return OnError("moonanime", proxyManager);
return OnError("nmoonanime", proxyManager);
var voices = seasonData.Voices
.Where(v => v != null && v.Episodes != null && v.Episodes.Count > 0)
.ToList();
if (voices.Count == 0)
return OnError("moonanime", proxyManager);
return OnError("nmoonanime", proxyManager);
int activeVoiceIndex = ParseVoiceIndex(selectedVoice, voices.Count);
var voiceTpl = new VoiceTpl(voices.Count);
@ -179,20 +179,20 @@ namespace MoonAnime.Controllers
.ToList();
if (episodes.Count == 0)
return OnError("moonanime", proxyManager);
return OnError("nmoonanime", proxyManager);
string displayTitle = !string.IsNullOrWhiteSpace(title)
? title
: !string.IsNullOrWhiteSpace(originalTitle)
? originalTitle
: "MoonAnime";
: "NMoonAnime";
var episodeTpl = new EpisodeTpl(episodes.Count);
foreach (var episode in episodes)
{
int episodeNumber = episode.Number <= 0 ? 1 : episode.Number;
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");
}
@ -204,11 +204,11 @@ namespace MoonAnime.Controllers
}
private async Task<ActionResult> RenderMovie(
MoonAnimeInvoke invoke,
List<MoonAnimeSeasonRef> seasons,
NMoonAnimeInvoke invoke,
List<NMoonAnimeSeasonRef> seasons,
string title,
string originalTitle,
MoonAnimeSeasonContent firstSeasonData,
NMoonAnimeSeasonContent firstSeasonData,
bool rjson)
{
var currentSeason = seasons
@ -217,20 +217,20 @@ namespace MoonAnime.Controllers
.FirstOrDefault();
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))
seasonData = await invoke.GetSeasonContent(currentSeason);
if (seasonData == null || seasonData.Voices.Count == 0)
return OnError("moonanime", proxyManager);
return OnError("nmoonanime", proxyManager);
string displayTitle = !string.IsNullOrWhiteSpace(title)
? title
: !string.IsNullOrWhiteSpace(originalTitle)
? originalTitle
: "MoonAnime";
: "NMoonAnime";
var movieTpl = new MovieTpl(displayTitle, originalTitle);
int fallbackIndex = 1;
@ -248,13 +248,13 @@ namespace MoonAnime.Controllers
continue;
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");
fallbackIndex++;
}
if (movieTpl.IsEmpty)
return OnError("moonanime", proxyManager);
return OnError("nmoonanime", proxyManager);
return rjson
? 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)
{
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($"&title={HttpUtility.UrlEncode(title)}");
url.Append($"&original_title={HttpUtility.UrlEncode(originalTitle)}");

View File

@ -14,20 +14,20 @@ using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace MoonAnime
namespace NMoonAnime
{
public class ModInit
{
public static double Version => 1.0;
public static OnlinesSettings MoonAnime;
public static OnlinesSettings NMoonAnime;
public static bool ApnHostProvided;
public static OnlinesSettings Settings
{
get => MoonAnime;
set => MoonAnime = value;
get => NMoonAnime;
set => NMoonAnime = value;
}
/// <summary>
@ -35,9 +35,9 @@ namespace MoonAnime
/// </summary>
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,
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);
conf.Remove("apn");
conf.Remove("apn_host");
MoonAnime = conf.ToObject<OnlinesSettings>();
NMoonAnime = conf.ToObject<OnlinesSettings>();
if (hasApn)
ApnHelper.ApplyInitConf(apnEnabled, apnHost, MoonAnime);
ApnHelper.ApplyInitConf(apnEnabled, apnHost, NMoonAnime);
ApnHostProvided = hasApn && apnEnabled && !string.IsNullOrWhiteSpace(apnHost);
if (hasApn && apnEnabled)
{
MoonAnime.streamproxy = false;
NMoonAnime.streamproxy = false;
}
else if (MoonAnime.streamproxy)
else if (NMoonAnime.streamproxy)
{
MoonAnime.apnstream = false;
MoonAnime.apn = null;
NMoonAnime.apnstream = false;
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.Text.Json.Serialization;
namespace MoonAnime.Models
namespace NMoonAnime.Models
{
public class MoonAnimeSearchResponse
public class NMoonAnimeSearchResponse
{
[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")]
public int SeasonNumber { get; set; }
@ -18,7 +18,7 @@ namespace MoonAnime.Models
public string Url { get; set; }
}
public class MoonAnimeSeasonContent
public class NMoonAnimeSeasonContent
{
public int SeasonNumber { get; set; }
@ -26,19 +26,19 @@ namespace MoonAnime.Models
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 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; }
@ -47,7 +47,7 @@ namespace MoonAnime.Models
public string File { get; set; }
}
public class MoonAnimeStreamVariant
public class NMoonAnimeStreamVariant
{
public string Url { get; set; }

View File

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

View File

@ -5,7 +5,7 @@ using Shared.Models.Base;
using Shared.Models.Module;
using System.Collections.Generic;
namespace MoonAnime
namespace NMoonAnime
{
public class OnlineApi
{
@ -24,7 +24,7 @@ namespace MoonAnime
{
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 isAnime = hasLang && (original_language == "ja" || original_language == "zh");
@ -33,9 +33,9 @@ namespace MoonAnime
{
string url = init.overridehost;
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;

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