2020-02-09 02:35:16 +00:00
|
|
|
using System;
|
2015-07-26 14:22:20 +00:00
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.Linq;
|
2018-03-10 08:05:56 +00:00
|
|
|
using AutoMapper;
|
|
|
|
using Jackett.Common.Indexers;
|
|
|
|
using Jackett.Common.Models;
|
|
|
|
using Jackett.Common.Services.Interfaces;
|
2015-07-26 14:22:20 +00:00
|
|
|
|
2018-03-10 08:05:56 +00:00
|
|
|
namespace Jackett.Common.Services
|
2015-07-26 14:22:20 +00:00
|
|
|
{
|
|
|
|
|
|
|
|
public class CacheService : ICacheService
|
|
|
|
{
|
|
|
|
private readonly List<TrackerCache> cache = new List<TrackerCache>();
|
2015-08-07 21:40:45 +00:00
|
|
|
private readonly int MAX_RESULTS_PER_TRACKER = 1000;
|
2019-04-14 01:59:48 +00:00
|
|
|
private readonly TimeSpan AGE_LIMIT = new TimeSpan(0, 1, 0, 0);
|
2015-07-26 14:22:20 +00:00
|
|
|
|
2015-08-07 21:40:45 +00:00
|
|
|
public void CacheRssResults(IIndexer indexer, IEnumerable<ReleaseInfo> releases)
|
2015-07-26 14:22:20 +00:00
|
|
|
{
|
|
|
|
lock (cache)
|
|
|
|
{
|
2020-05-11 19:59:28 +00:00
|
|
|
var trackerCache = cache.FirstOrDefault(c => c.TrackerId == indexer.Id);
|
2015-07-26 14:22:20 +00:00
|
|
|
if (trackerCache == null)
|
|
|
|
{
|
2020-03-26 22:15:28 +00:00
|
|
|
trackerCache = new TrackerCache
|
|
|
|
{
|
2020-05-11 19:59:28 +00:00
|
|
|
TrackerId = indexer.Id,
|
2020-03-26 22:15:28 +00:00
|
|
|
TrackerName = indexer.DisplayName
|
|
|
|
};
|
2015-07-26 14:22:20 +00:00
|
|
|
cache.Add(trackerCache);
|
|
|
|
}
|
|
|
|
|
2020-02-09 02:35:16 +00:00
|
|
|
foreach (var release in releases.OrderByDescending(i => i.PublishDate))
|
2015-07-26 14:22:20 +00:00
|
|
|
{
|
2020-03-26 22:15:28 +00:00
|
|
|
var existingItem = trackerCache.Results.FirstOrDefault(i => i.Result.Guid == release.Guid);
|
2015-07-26 14:22:20 +00:00
|
|
|
if (existingItem == null)
|
|
|
|
{
|
2020-03-26 22:15:28 +00:00
|
|
|
existingItem = new CachedResult
|
|
|
|
{
|
|
|
|
Created = DateTime.Now
|
|
|
|
};
|
2015-07-26 14:22:20 +00:00
|
|
|
trackerCache.Results.Add(existingItem);
|
|
|
|
}
|
|
|
|
|
2020-03-27 08:35:26 +00:00
|
|
|
existingItem.Result = release;
|
2015-07-26 14:22:20 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Prune cache
|
2020-02-09 02:35:16 +00:00
|
|
|
foreach (var tracker in cache)
|
2015-07-26 14:22:20 +00:00
|
|
|
{
|
2019-04-14 01:59:48 +00:00
|
|
|
tracker.Results = tracker.Results.Where(x => x.Created > DateTime.Now.Subtract(AGE_LIMIT)).OrderByDescending(i => i.Created).Take(MAX_RESULTS_PER_TRACKER).ToList();
|
2015-07-26 14:22:20 +00:00
|
|
|
}
|
2015-08-07 21:40:45 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public int GetNewItemCount(IIndexer indexer, IEnumerable<ReleaseInfo> releases)
|
|
|
|
{
|
|
|
|
lock (cache)
|
|
|
|
{
|
2020-02-10 22:16:19 +00:00
|
|
|
var newItemCount = 0;
|
2020-05-11 19:59:28 +00:00
|
|
|
var trackerCache = cache.FirstOrDefault(c => c.TrackerId == indexer.Id);
|
2015-08-07 21:40:45 +00:00
|
|
|
if (trackerCache != null)
|
|
|
|
{
|
|
|
|
foreach (var release in releases)
|
|
|
|
{
|
2020-03-26 22:15:28 +00:00
|
|
|
if (trackerCache.Results.Count(i => i.Result.Guid == release.Guid) == 0)
|
2015-08-07 21:40:45 +00:00
|
|
|
{
|
|
|
|
newItemCount++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-02-09 02:35:16 +00:00
|
|
|
else
|
|
|
|
{
|
2015-08-07 21:40:45 +00:00
|
|
|
newItemCount++;
|
|
|
|
}
|
2015-08-06 19:07:58 +00:00
|
|
|
|
|
|
|
return newItemCount;
|
2015-07-26 14:22:20 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-08-13 21:51:49 +00:00
|
|
|
public List<TrackerCacheResult> GetCachedResults()
|
2015-07-26 14:22:20 +00:00
|
|
|
{
|
|
|
|
lock (cache)
|
|
|
|
{
|
|
|
|
var results = new List<TrackerCacheResult>();
|
|
|
|
|
2020-02-09 02:35:16 +00:00
|
|
|
foreach (var tracker in cache)
|
2015-07-26 14:22:20 +00:00
|
|
|
{
|
2020-02-09 02:35:16 +00:00
|
|
|
foreach (var release in tracker.Results.OrderByDescending(i => i.Result.PublishDate).Take(300))
|
2015-07-26 14:22:20 +00:00
|
|
|
{
|
|
|
|
var item = Mapper.Map<TrackerCacheResult>(release.Result);
|
|
|
|
item.FirstSeen = release.Created;
|
2015-08-05 22:00:09 +00:00
|
|
|
item.Tracker = tracker.TrackerName;
|
2015-08-13 21:51:49 +00:00
|
|
|
item.TrackerId = tracker.TrackerId;
|
2015-07-26 14:22:20 +00:00
|
|
|
item.Peers = item.Peers - item.Seeders; // Use peers as leechers
|
|
|
|
results.Add(item);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-02-09 02:35:16 +00:00
|
|
|
return results.Take(3000).OrderByDescending(i => i.PublishDate).ToList();
|
2015-07-26 14:22:20 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|