diff --git a/Jellyfin.Plugin.MetaShark/Api/DoubanApi.cs b/Jellyfin.Plugin.MetaShark/Api/DoubanApi.cs index 3af1d91..692d58c 100644 --- a/Jellyfin.Plugin.MetaShark/Api/DoubanApi.cs +++ b/Jellyfin.Plugin.MetaShark/Api/DoubanApi.cs @@ -68,6 +68,7 @@ namespace Jellyfin.Plugin.MetaShark.Api // 匹配除了换行符之外所有空白 Regex regOverviewSpace = new Regex(@"\n[^\S\n]+", RegexOptions.Compiled); Regex regPhotoId = new Regex(@"/photo/(\d+?)/", RegexOptions.Compiled); + Regex regLoginName = new Regex(@"]*?db-usr-profile[^>]*?>[\w\W]*?

([^>]*?)<", RegexOptions.Compiled); // 默认200毫秒请求1次 private TimeLimiter _defaultTimeConstraint = TimeLimiter.GetFromMaxCountByInterval(1, TimeSpan.FromMilliseconds(200)); @@ -802,6 +803,27 @@ namespace Jellyfin.Plugin.MetaShark.Api return true; } + public async Task GetLoginInfoAsync(CancellationToken cancellationToken) + { + var loginInfo = new DoubanLoginInfo(); + try + { + var url = "https://www.douban.com/mine/"; + var response = await httpClient.GetAsync(url, cancellationToken).ConfigureAwait(false); + var requestUrl = response.RequestMessage?.RequestUri?.ToString(); + var body = await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false); + var loginName = this.Match(body, regLoginName).Trim(); + loginInfo.Name = loginName; + loginInfo.IsLogined = !(requestUrl == null || requestUrl.Contains("accounts.douban.com") || requestUrl.Contains("login") || requestUrl.Contains("sec.douban.com")); + } + catch (Exception ex) + { + this._logger.LogError(ex, "GetLoginInfoAsync error."); + } + + return loginInfo; + } + protected async Task LimitRequestFrequently() { if (IsEnableAvoidRiskControl()) diff --git a/Jellyfin.Plugin.MetaShark/Configuration/configPage.html b/Jellyfin.Plugin.MetaShark/Configuration/configPage.html index 9403941..0aebf19 100644 --- a/Jellyfin.Plugin.MetaShark/Configuration/configPage.html +++ b/Jellyfin.Plugin.MetaShark/Configuration/configPage.html @@ -28,8 +28,8 @@
+ id="login_msg" + style="margin-left: 8px; display: none;">
可为空,填写可搜索到需登录访问的影片,使用(www.douban.com)分号“;”分隔格式cookie.
@@ -253,16 +253,16 @@ function checkDoubanLogin() { let cookie = document.querySelector('#DoubanCookies').value if (!cookie || !$.trim(cookie)) { - $('#login_invalid').hide(); + $('#login_msg').hide(); return; } $.getJSON("/plugin/metashark/douban/checklogin", function (resp) { if (resp && resp.code != 1) { - $('#login_invalid').show(); + $('#login_msg').css("color", "red").text('(已失效)').show(); } else { - $('#login_invalid').hide(); + $('#login_msg').css("color", "").text('(已生效)').show(); } }) } diff --git a/Jellyfin.Plugin.MetaShark/Controllers/ApiController.cs b/Jellyfin.Plugin.MetaShark/Controllers/ApiController.cs index c3c9848..bfe5c47 100644 --- a/Jellyfin.Plugin.MetaShark/Controllers/ApiController.cs +++ b/Jellyfin.Plugin.MetaShark/Controllers/ApiController.cs @@ -77,10 +77,11 @@ namespace Jellyfin.Plugin.MetaShark.Controllers [HttpGet] public async Task CheckDoubanLogin() { - var isLogin = await _doubanApi.CheckLoginAsync(CancellationToken.None); - return new ApiResult(isLogin ? 1 : 0, isLogin ? "logined" : "not login"); + var loginInfo = await this._doubanApi.GetLoginInfoAsync(CancellationToken.None).ConfigureAwait(false); + return new ApiResult(loginInfo.IsLogined ? 1 : 0, loginInfo.Name); } + private HttpClient GetHttpClient() { var client = _httpClientFactory.CreateClient(NamedClient.Default); diff --git a/Jellyfin.Plugin.MetaShark/Model/DoubanLoginInfo.cs b/Jellyfin.Plugin.MetaShark/Model/DoubanLoginInfo.cs new file mode 100644 index 0000000..5b7de09 --- /dev/null +++ b/Jellyfin.Plugin.MetaShark/Model/DoubanLoginInfo.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text.Json.Serialization; + +namespace Jellyfin.Plugin.MetaShark.Model +{ + public class DoubanLoginInfo + { + public string Name { get; set; } + public bool IsLogined { get; set; } + } +} \ No newline at end of file