You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
5.2 KiB
140 lines
5.2 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using NzbDrone.Core.Indexers;
|
|
using NzbDrone.Core.Parser;
|
|
using NzbDrone.Core.Parser.Model;
|
|
using Prowlarr.Http.REST;
|
|
|
|
namespace Prowlarr.Api.V1.Search
|
|
{
|
|
public class ReleaseResource : RestResource
|
|
{
|
|
public string Guid { get; set; }
|
|
public int Age { get; set; }
|
|
public double AgeHours { get; set; }
|
|
public double AgeMinutes { get; set; }
|
|
public long Size { get; set; }
|
|
public int? Files { get; set; }
|
|
public int? Grabs { get; set; }
|
|
public int IndexerId { get; set; }
|
|
public string Indexer { get; set; }
|
|
public string SubGroup { get; set; }
|
|
public string ReleaseHash { get; set; }
|
|
public string Title { get; set; }
|
|
public string SortTitle { get; set; }
|
|
public bool Approved { get; set; }
|
|
public int ImdbId { get; set; }
|
|
public DateTime PublishDate { get; set; }
|
|
public string CommentUrl { get; set; }
|
|
public string DownloadUrl { get; set; }
|
|
public string InfoUrl { get; set; }
|
|
public string PosterUrl { get; set; }
|
|
public IEnumerable<string> IndexerFlags { get; set; }
|
|
public ICollection<IndexerCategory> Categories { get; set; }
|
|
|
|
public string MagnetUrl { get; set; }
|
|
public string InfoHash { get; set; }
|
|
public int? Seeders { get; set; }
|
|
public int? Leechers { get; set; }
|
|
public double? DownloadVolumeFactor { get; set; }
|
|
public double? UploadVolumeFactor { get; set; }
|
|
public DownloadProtocol Protocol { get; set; }
|
|
|
|
public string FileName
|
|
{
|
|
get
|
|
{
|
|
var extension = Protocol switch
|
|
{
|
|
DownloadProtocol.Torrent => ".torrent",
|
|
DownloadProtocol.Usenet => ".nzb",
|
|
_ => string.Empty
|
|
};
|
|
|
|
return $"{Title}{extension}";
|
|
}
|
|
}
|
|
}
|
|
|
|
public static class ReleaseResourceMapper
|
|
{
|
|
public static ReleaseResource ToResource(this ReleaseInfo model)
|
|
{
|
|
var releaseInfo = model;
|
|
var torrentInfo = model as TorrentInfo ?? new TorrentInfo();
|
|
var indexerFlags = torrentInfo.IndexerFlags.Select(f => f.Name);
|
|
|
|
// TODO: Clean this mess up. don't mix data from multiple classes, use sub-resources instead? (Got a huge Deja Vu, didn't we talk about this already once?)
|
|
return new ReleaseResource
|
|
{
|
|
Guid = releaseInfo.Guid,
|
|
|
|
//QualityWeight
|
|
Age = releaseInfo.Age,
|
|
AgeHours = releaseInfo.AgeHours,
|
|
AgeMinutes = releaseInfo.AgeMinutes,
|
|
Size = releaseInfo.Size ?? 0,
|
|
Files = releaseInfo.Files,
|
|
Grabs = releaseInfo.Grabs,
|
|
IndexerId = releaseInfo.IndexerId,
|
|
Indexer = releaseInfo.Indexer,
|
|
Title = releaseInfo.Title,
|
|
SortTitle = releaseInfo.Title.NormalizeTitle(),
|
|
ImdbId = releaseInfo.ImdbId,
|
|
PublishDate = releaseInfo.PublishDate,
|
|
CommentUrl = releaseInfo.CommentUrl,
|
|
DownloadUrl = releaseInfo.DownloadUrl,
|
|
InfoUrl = releaseInfo.InfoUrl,
|
|
PosterUrl = releaseInfo.PosterUrl,
|
|
Categories = releaseInfo.Categories,
|
|
|
|
//ReleaseWeight
|
|
MagnetUrl = torrentInfo.MagnetUrl,
|
|
InfoHash = torrentInfo.InfoHash,
|
|
Seeders = torrentInfo.Seeders,
|
|
Leechers = (torrentInfo.Peers.HasValue && torrentInfo.Seeders.HasValue) ? (torrentInfo.Peers.Value - torrentInfo.Seeders.Value) : (int?)null,
|
|
DownloadVolumeFactor = torrentInfo.DownloadVolumeFactor,
|
|
UploadVolumeFactor = torrentInfo.UploadVolumeFactor,
|
|
Protocol = releaseInfo.DownloadProtocol,
|
|
IndexerFlags = indexerFlags
|
|
};
|
|
}
|
|
|
|
public static ReleaseInfo ToModel(this ReleaseResource resource)
|
|
{
|
|
ReleaseInfo model;
|
|
|
|
if (resource.Protocol == DownloadProtocol.Torrent)
|
|
{
|
|
model = new TorrentInfo
|
|
{
|
|
MagnetUrl = resource.MagnetUrl,
|
|
InfoHash = resource.InfoHash,
|
|
Seeders = resource.Seeders,
|
|
Peers = (resource.Seeders.HasValue && resource.Leechers.HasValue) ? (resource.Seeders + resource.Leechers) : null
|
|
};
|
|
}
|
|
else
|
|
{
|
|
model = new ReleaseInfo();
|
|
}
|
|
|
|
model.Guid = resource.Guid;
|
|
model.Title = resource.Title;
|
|
model.Size = resource.Size;
|
|
model.DownloadUrl = resource.DownloadUrl;
|
|
model.InfoUrl = resource.InfoUrl;
|
|
model.PosterUrl = resource.PosterUrl;
|
|
model.CommentUrl = resource.CommentUrl;
|
|
model.IndexerId = resource.IndexerId;
|
|
model.Indexer = resource.Indexer;
|
|
model.DownloadProtocol = resource.Protocol;
|
|
model.ImdbId = resource.ImdbId;
|
|
model.PublishDate = resource.PublishDate.ToUniversalTime();
|
|
|
|
return model;
|
|
}
|
|
}
|
|
}
|