using Jellyfin.Plugin.MetaShark.Core; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Logging; using System; using System.Linq; using System.Net.Http; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; namespace Jellyfin.Plugin.MetaShark.Api { public class ImdbApi : IDisposable { private readonly ILogger _logger; private readonly IMemoryCache _memoryCache; private readonly HttpClient httpClient; Regex regId = new Regex(@"/(tt\d+)", RegexOptions.Compiled); Regex regPersonId = new Regex(@"/(nm\d+)", RegexOptions.Compiled); public ImdbApi(ILoggerFactory loggerFactory) { _logger = loggerFactory.CreateLogger(); _memoryCache = new MemoryCache(new MemoryCacheOptions()); var handler = new HttpClientHandler() { AllowAutoRedirect = false }; httpClient = new HttpClient(handler); httpClient.Timeout = TimeSpan.FromSeconds(5); } /// /// 通过imdb获取信息(会返回最新的imdb id) /// public async Task CheckNewIDAsync(string id, CancellationToken cancellationToken) { var cacheKey = $"CheckNewImdbID_{id}"; var expiredOption = new MemoryCacheEntryOptions() { AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(30) }; if (this._memoryCache.TryGetValue(cacheKey, out var item)) { return item; } try { var url = $"https://www.imdb.com/title/{id}/"; var resp = await this.httpClient.GetAsync(url, cancellationToken).ConfigureAwait(false); if (resp.Headers.TryGetValues("Location", out var values)) { var location = values.First(); var newId = location.GetMatchGroup(this.regId); if (!string.IsNullOrEmpty(newId)) { item = newId; } } this._memoryCache.Set(cacheKey, item, expiredOption); return item; } catch (Exception ex) { this._logger.LogError(ex, "CheckNewImdbID error. id: {0}", id); this._memoryCache.Set(cacheKey, null, expiredOption); return null; } return null; } /// /// 通过imdb获取信息(会返回最新的imdb id) /// public async Task CheckPersonNewIDAsync(string id, CancellationToken cancellationToken) { var cacheKey = $"CheckPersonNewImdbID_{id}"; var expiredOption = new MemoryCacheEntryOptions() { AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(30) }; if (this._memoryCache.TryGetValue(cacheKey, out var item)) { return item; } try { var url = $"https://www.imdb.com/name/{id}/"; var resp = await this.httpClient.GetAsync(url, cancellationToken).ConfigureAwait(false); if (resp.Headers.TryGetValues("Location", out var values)) { var location = values.First(); var newId = location.GetMatchGroup(this.regPersonId); if (!string.IsNullOrEmpty(newId)) { item = newId; } } this._memoryCache.Set(cacheKey, item, expiredOption); return item; } catch (Exception ex) { this._logger.LogError(ex, "CheckPersonNewImdbID error. id: {0}", id); this._memoryCache.Set(cacheKey, null, expiredOption); return null; } } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (disposing) { _memoryCache.Dispose(); } } private bool IsEnable() { return Plugin.Instance?.Configuration.EnableTmdb ?? true; } } }