Optimize identity
This commit is contained in:
parent
33d921f1a9
commit
398953b73f
|
@ -37,6 +37,10 @@ namespace Jellyfin.Plugin.MetaShark.Test
|
||||||
parseResult = NameParser.Parse(fileName);
|
parseResult = NameParser.Parse(fileName);
|
||||||
Console.WriteLine(parseResult.ToJson());
|
Console.WriteLine(parseResult.ToJson());
|
||||||
|
|
||||||
|
fileName = "罗马假日.Roman.Holiday.1953.WEB-DL.1080p.x265.AAC.2Audios.GREENOTEA";
|
||||||
|
parseResult = NameParser.Parse(fileName);
|
||||||
|
Console.WriteLine(parseResult.ToJson());
|
||||||
|
|
||||||
// 只英文
|
// 只英文
|
||||||
fileName = "New.World.2013.BluRay.1080p.x265.10bit.MNHD-FRDS";
|
fileName = "New.World.2013.BluRay.1080p.x265.10bit.MNHD-FRDS";
|
||||||
parseResult = NameParser.Parse(fileName);
|
parseResult = NameParser.Parse(fileName);
|
||||||
|
|
|
@ -162,12 +162,14 @@ namespace Jellyfin.Plugin.MetaShark.Api
|
||||||
|
|
||||||
|
|
||||||
EnsureLoadDoubanCookie();
|
EnsureLoadDoubanCookie();
|
||||||
|
// LimitRequestFrequently(2000);
|
||||||
|
|
||||||
keyword = HttpUtility.UrlEncode(keyword);
|
var encodedKeyword = HttpUtility.UrlEncode(keyword);
|
||||||
var url = $"https://www.douban.com/search?cat=1002&q={keyword}";
|
var url = $"https://www.douban.com/search?cat=1002&q={encodedKeyword}";
|
||||||
var response = await httpClient.GetAsync(url, cancellationToken).ConfigureAwait(false);
|
var response = await httpClient.GetAsync(url, cancellationToken).ConfigureAwait(false);
|
||||||
if (!response.IsSuccessStatusCode)
|
if (!response.IsSuccessStatusCode)
|
||||||
{
|
{
|
||||||
|
this._logger.LogWarning("douban搜索请求失败. keyword: {0} statusCode: {1}", keyword, response.StatusCode);
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -208,6 +210,11 @@ namespace Jellyfin.Plugin.MetaShark.Api
|
||||||
list.Add(movie);
|
list.Add(movie);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (list.Count <= 0)
|
||||||
|
{
|
||||||
|
this._logger.LogWarning("douban搜索不到内容,这消息大量出现时,可能触发了爬虫风控。。。keyword: {0}", keyword);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
_memoryCache.Set<List<DoubanSubject>>(cacheKey, list, expiredOption);
|
_memoryCache.Set<List<DoubanSubject>>(cacheKey, list, expiredOption);
|
||||||
return list;
|
return list;
|
||||||
|
@ -229,6 +236,7 @@ namespace Jellyfin.Plugin.MetaShark.Api
|
||||||
}
|
}
|
||||||
|
|
||||||
EnsureLoadDoubanCookie();
|
EnsureLoadDoubanCookie();
|
||||||
|
// LimitRequestFrequently();
|
||||||
|
|
||||||
var url = $"https://movie.douban.com/subject/{sid}/";
|
var url = $"https://movie.douban.com/subject/{sid}/";
|
||||||
var response = await httpClient.GetAsync(url, cancellationToken).ConfigureAwait(false);
|
var response = await httpClient.GetAsync(url, cancellationToken).ConfigureAwait(false);
|
||||||
|
@ -339,6 +347,7 @@ namespace Jellyfin.Plugin.MetaShark.Api
|
||||||
}
|
}
|
||||||
|
|
||||||
EnsureLoadDoubanCookie();
|
EnsureLoadDoubanCookie();
|
||||||
|
// LimitRequestFrequently();
|
||||||
|
|
||||||
var list = new List<DoubanCelebrity>();
|
var list = new List<DoubanCelebrity>();
|
||||||
var url = $"https://movie.douban.com/subject/{sid}/celebrities";
|
var url = $"https://movie.douban.com/subject/{sid}/celebrities";
|
||||||
|
@ -482,7 +491,9 @@ namespace Jellyfin.Plugin.MetaShark.Api
|
||||||
return searchResult;
|
return searchResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
EnsureLoadDoubanCookie();
|
EnsureLoadDoubanCookie();
|
||||||
|
// LimitRequestFrequently();
|
||||||
|
|
||||||
|
|
||||||
keyword = HttpUtility.UrlEncode(keyword);
|
keyword = HttpUtility.UrlEncode(keyword);
|
||||||
|
@ -536,6 +547,7 @@ namespace Jellyfin.Plugin.MetaShark.Api
|
||||||
}
|
}
|
||||||
|
|
||||||
EnsureLoadDoubanCookie();
|
EnsureLoadDoubanCookie();
|
||||||
|
// LimitRequestFrequently();
|
||||||
|
|
||||||
var list = new List<DoubanPhoto>();
|
var list = new List<DoubanPhoto>();
|
||||||
var url = $"https://movie.douban.com/subject/{sid}/photos?type=W&start=0&sortby=size&size=a&subtype=a";
|
var url = $"https://movie.douban.com/subject/{sid}/photos?type=W&start=0&sortby=size&size=a&subtype=a";
|
||||||
|
@ -587,20 +599,24 @@ namespace Jellyfin.Plugin.MetaShark.Api
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
protected void LimitRequestFrequently()
|
protected void LimitRequestFrequently(int interval = 1000)
|
||||||
{
|
{
|
||||||
|
var diff = 0;
|
||||||
lock (_lock)
|
lock (_lock)
|
||||||
{
|
{
|
||||||
var ts = DateTime.Now - lastRequestTime;
|
var ts = DateTime.Now - lastRequestTime;
|
||||||
var diff = (int)(200 - ts.TotalMilliseconds);
|
diff = (int)(interval - ts.TotalMilliseconds);
|
||||||
if (diff > 0)
|
if (diff > 0)
|
||||||
{
|
{
|
||||||
|
this._logger.LogInformation("请求太频繁,等待{0}毫秒后继续执行...", diff);
|
||||||
Thread.Sleep(diff);
|
Thread.Sleep(diff);
|
||||||
}
|
}
|
||||||
|
|
||||||
lastRequestTime = DateTime.Now;
|
lastRequestTime = DateTime.Now;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private string? GetText(IElement el, string css)
|
private string? GetText(IElement el, string css)
|
||||||
{
|
{
|
||||||
var node = el.QuerySelector(css);
|
var node = el.QuerySelector(css);
|
||||||
|
|
|
@ -10,10 +10,10 @@ namespace Jellyfin.Plugin.MetaShark.Core
|
||||||
{
|
{
|
||||||
public static class NameParser
|
public static class NameParser
|
||||||
{
|
{
|
||||||
private static readonly Regex yearReg = new Regex(@"[12][890][78901234][0-9]", RegexOptions.Compiled);
|
private static readonly Regex yearReg = new Regex(@"[12][890][0-9][0-9]", RegexOptions.Compiled);
|
||||||
private static readonly Regex seasonSuffixReg = new Regex(@"[ .]S\d{1,2}$", RegexOptions.Compiled);
|
private static readonly Regex seasonSuffixReg = new Regex(@"[ .]S\d{1,2}$", RegexOptions.Compiled);
|
||||||
|
|
||||||
private static readonly Regex unusedReg = new Regex(@"\[.+?\]", RegexOptions.Compiled);
|
private static readonly Regex unusedReg = new Regex(@"\[.+?\]|\(.+?\)", RegexOptions.Compiled);
|
||||||
|
|
||||||
public static ParseNameResult Parse(string fileName, bool isTvSeries = false)
|
public static ParseNameResult Parse(string fileName, bool isTvSeries = false)
|
||||||
{
|
{
|
||||||
|
@ -86,7 +86,7 @@ namespace Jellyfin.Plugin.MetaShark.Core
|
||||||
// 电视剧名称后紧跟季信息时,会附加到名称中,需要去掉
|
// 电视剧名称后紧跟季信息时,会附加到名称中,需要去掉
|
||||||
name = seasonSuffixReg.Replace(name, string.Empty);
|
name = seasonSuffixReg.Replace(name, string.Empty);
|
||||||
|
|
||||||
// 删除多余的[]信息
|
// 删除多余的[]/()附加信息
|
||||||
name = unusedReg.Replace(name, string.Empty);
|
name = unusedReg.Replace(name, string.Empty);
|
||||||
|
|
||||||
return name.Replace(".", " ").Trim();
|
return name.Replace(".", " ").Trim();
|
||||||
|
|
|
@ -72,13 +72,13 @@ namespace Jellyfin.Plugin.MetaShark.Providers
|
||||||
{
|
{
|
||||||
// ParseName is required here.
|
// ParseName is required here.
|
||||||
// Caller provides the filename with extension stripped and NOT the parsed filename
|
// Caller provides the filename with extension stripped and NOT the parsed filename
|
||||||
var fileName = info.Name;
|
var fileName = GetNotParsedName(info);
|
||||||
var parseResult = NameParser.Parse(fileName);
|
var parseResult = NameParser.Parse(fileName);
|
||||||
var searchName = !string.IsNullOrEmpty(parseResult.ChineseName) ? parseResult.ChineseName : parseResult.Name;
|
var searchName = !string.IsNullOrEmpty(parseResult.ChineseName) ? parseResult.ChineseName : parseResult.Name;
|
||||||
info.Year = parseResult.Year; // 默认parser对anime年份会解析出错,以anitomy为准
|
info.Year = parseResult.Year; // 默认parser对anime年份会解析出错,以anitomy为准
|
||||||
|
|
||||||
|
|
||||||
this.Log($"GuessByDouban of [name]: {info.Name} [year]: {info.Year} [search name]: {searchName}");
|
this.Log($"GuessByDouban of [name]: {info.Name} [file_name]: {fileName} [year]: {info.Year} [search name]: {searchName}");
|
||||||
var result = await this._doubanApi.SearchAsync(searchName, cancellationToken).ConfigureAwait(false);
|
var result = await this._doubanApi.SearchAsync(searchName, cancellationToken).ConfigureAwait(false);
|
||||||
var jw = new JaroWinkler();
|
var jw = new JaroWinkler();
|
||||||
foreach (var item in result)
|
foreach (var item in result)
|
||||||
|
@ -173,12 +173,13 @@ namespace Jellyfin.Plugin.MetaShark.Providers
|
||||||
{
|
{
|
||||||
// ParseName is required here.
|
// ParseName is required here.
|
||||||
// Caller provides the filename with extension stripped and NOT the parsed filename
|
// Caller provides the filename with extension stripped and NOT the parsed filename
|
||||||
var fileName = info.Name;
|
var fileName = GetNotParsedName(info);
|
||||||
var parseResult = NameParser.Parse(fileName);
|
var parseResult = NameParser.Parse(fileName);
|
||||||
var searchName = !string.IsNullOrEmpty(parseResult.ChineseName) ? parseResult.ChineseName : parseResult.Name;
|
var searchName = !string.IsNullOrEmpty(parseResult.ChineseName) ? parseResult.ChineseName : parseResult.Name;
|
||||||
info.Year = parseResult.Year; // 默认parser对anime年份会解析出错,以anitomy为准
|
info.Year = parseResult.Year; // 默认parser对anime年份会解析出错,以anitomy为准
|
||||||
|
|
||||||
this.Log($"GuestByTmdb of [name]: {info.Name} [year]: {info.Year} [search name]: {searchName}");
|
|
||||||
|
this.Log($"GuestByTmdb of [name]: {info.Name} [file_name]: {fileName} [year]: {info.Year} [search name]: {searchName}");
|
||||||
var jw = new JaroWinkler();
|
var jw = new JaroWinkler();
|
||||||
|
|
||||||
switch (info)
|
switch (info)
|
||||||
|
@ -384,5 +385,16 @@ namespace Jellyfin.Plugin.MetaShark.Providers
|
||||||
|
|
||||||
return language;
|
return language;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected string GetNotParsedName(ItemLookupInfo info)
|
||||||
|
{
|
||||||
|
var directoryName = Path.GetFileName(Path.GetDirectoryName(info.Path));
|
||||||
|
if (directoryName != null && directoryName.StartsWith(info.Name))
|
||||||
|
{
|
||||||
|
return directoryName;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Path.GetFileNameWithoutExtension(info.Path) ?? info.Name;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -97,10 +97,10 @@ namespace Jellyfin.Plugin.MetaShark.Providers
|
||||||
{
|
{
|
||||||
// 自动扫描搜索匹配元数据
|
// 自动扫描搜索匹配元数据
|
||||||
sid = await this.GuessByDoubanAsync(info, cancellationToken).ConfigureAwait(false);
|
sid = await this.GuessByDoubanAsync(info, cancellationToken).ConfigureAwait(false);
|
||||||
if (string.IsNullOrEmpty(sid))
|
// if (string.IsNullOrEmpty(sid))
|
||||||
{
|
// {
|
||||||
tmdbId = await this.GuestByTmdbAsync(info, cancellationToken).ConfigureAwait(false);
|
// tmdbId = await this.GuestByTmdbAsync(info, cancellationToken).ConfigureAwait(false);
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
if (metaSource != MetaSource.Tmdb && !string.IsNullOrEmpty(sid))
|
if (metaSource != MetaSource.Tmdb && !string.IsNullOrEmpty(sid))
|
||||||
|
|
|
@ -90,10 +90,10 @@ namespace Jellyfin.Plugin.MetaShark.Providers
|
||||||
{
|
{
|
||||||
// 自动扫描搜索匹配元数据
|
// 自动扫描搜索匹配元数据
|
||||||
sid = await this.GuessByDoubanAsync(info, cancellationToken).ConfigureAwait(false);
|
sid = await this.GuessByDoubanAsync(info, cancellationToken).ConfigureAwait(false);
|
||||||
if (string.IsNullOrEmpty(sid))
|
// if (string.IsNullOrEmpty(sid))
|
||||||
{
|
// {
|
||||||
tmdbId = await this.GuestByTmdbAsync(info, cancellationToken).ConfigureAwait(false);
|
// tmdbId = await this.GuestByTmdbAsync(info, cancellationToken).ConfigureAwait(false);
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
if (metaSource != MetaSource.Tmdb && !string.IsNullOrEmpty(sid))
|
if (metaSource != MetaSource.Tmdb && !string.IsNullOrEmpty(sid))
|
||||||
|
|
|
@ -32,6 +32,7 @@ jellyfin电影元数据插件,影片信息只要从豆瓣获取,并由TheMov
|
||||||
3. 识别时默认不返回TheMovieDb结果,有需要可以到插件配置中打开
|
3. 识别时默认不返回TheMovieDb结果,有需要可以到插件配置中打开
|
||||||
4. 假如网络原因访问TheMovieDb比较慢,可以到插件配置中关闭从TheMovieDb获取数据(关闭后不会再获取剧集信息)
|
4. 假如网络原因访问TheMovieDb比较慢,可以到插件配置中关闭从TheMovieDb获取数据(关闭后不会再获取剧集信息)
|
||||||
|
|
||||||
|
> 🚨建议一次不要刮削太多电影,要不然会触发豆瓣风控,导致被封IP(封IP需要等6小时左右才能恢复访问)
|
||||||
|
|
||||||
## How to build
|
## How to build
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue