186 lines
6.9 KiB
PHP
186 lines
6.9 KiB
PHP
<?php
|
||
|
||
namespace Animarr\Source;
|
||
|
||
use Animarr\Database;
|
||
use Animarr\Downloader;
|
||
use Animarr\Extractor\SceneExtractor;
|
||
use Animarr\Release\Release;
|
||
use Animarr\Torrent\Torrent;
|
||
use Animarr\Request;
|
||
|
||
class WebFeed implements Source{
|
||
|
||
private $extractor;
|
||
private $url;
|
||
private $name;
|
||
|
||
public function __construct(SceneExtractor $extractor, $url, $name){
|
||
$this->extractor = $extractor;
|
||
$this->url = $url;
|
||
$this->name = $name;
|
||
}
|
||
|
||
public function canSearch(){
|
||
return false;
|
||
}
|
||
|
||
public function getName(){
|
||
return "WebFeed " . $this->name;
|
||
}
|
||
|
||
/**
|
||
* @param $query
|
||
* @param int $maxResults
|
||
* @return Release[]
|
||
*/
|
||
public function find($query, $maxResults = -1, $extraQuery = ""){
|
||
$url = $this->url;
|
||
|
||
$results = [];
|
||
|
||
$offset = 1;
|
||
|
||
do{
|
||
$lastCount = count($results);
|
||
$feed = Request::getURL($url . (Database::getConfigKey("tracker.webfeed.{$this->name}.pagination", true) ? (strpos($url, "?") !== false ? "&" : "?") . "paged=" . $offset : ""));
|
||
|
||
if($feed == ""){
|
||
Downloader::log("Error getting feed!", "WebFeed");
|
||
return $results;
|
||
}
|
||
$xml = new \SimpleXMLElement($feed);
|
||
foreach($xml->channel->item as $item){
|
||
$originalTitle = (string) $item->title;
|
||
$title = str_replace(["–", "(TV)", "(BD)", "(DVD)"], ["-", "", "", ""], $originalTitle);
|
||
$contents = (string) $item->asXML();
|
||
$releases = [];
|
||
|
||
if(preg_match_all("/href=[\"'](magnet:[^\"']+)[\"']/", $contents, $matches) > 0){
|
||
foreach($matches[1] as $magnet){
|
||
$magnet = html_entity_decode($magnet);
|
||
$props = Torrent::getMagnetProperties($magnet);
|
||
|
||
$torrent = Torrent::fromURL($magnet, Database::getConfigKey("torrent.cache.folder", null));
|
||
if(isset($props["dn"])){
|
||
$r = ["magnet" => $magnet, "hasTorrent" => $torrent !== null, "release" => $props["dn"]];
|
||
}else{
|
||
$r = ["magnet" => $magnet, "hasTorrent" => $torrent !== null];
|
||
if($torrent !== null){
|
||
$files = $torrent->getFiles();
|
||
$r["release"] = $files[0]["path"][0];
|
||
}
|
||
}
|
||
|
||
$releases[] = $r;
|
||
}
|
||
}
|
||
|
||
if(preg_match_all("#href=[\"'](http[^\"']+)[\"']#", $contents, $matches) > 0){
|
||
foreach($matches[1] as $tUrl){
|
||
$tUrl = html_entity_decode($tUrl);
|
||
if(!Torrent::isTorrentDownloadPath($tUrl)){
|
||
continue;
|
||
}
|
||
|
||
$torrent = Torrent::fromURL($tUrl, Database::getConfigKey("torrent.cache.folder", null));
|
||
|
||
if($torrent !== null){
|
||
$files = $torrent->getFiles();
|
||
if(count($files) > 0){
|
||
$releases[] = ["torrent" => $tUrl, "release" => $files[0]["path"][0], "hasTorrent" => true];
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
$tUrl = trim($item->link);
|
||
if(Torrent::isTorrentDownloadPath($tUrl)){
|
||
$torrent = Torrent::fromURL($tUrl, Database::getConfigKey("torrent.cache.folder", null));
|
||
|
||
if($torrent !== null){
|
||
$files = $torrent->getFiles();
|
||
if(count($files) > 0){
|
||
$releases[] = ["torrent" => $tUrl, "release" => $files[0]["path"][0], "hasTorrent" => true];
|
||
}
|
||
}
|
||
}
|
||
|
||
foreach($releases as $info){
|
||
if(!isset($info["release"])){
|
||
if(isset($info["magnet"]) and !$info["hasTorrent"] and Database::getConfigKey("magnet.unknownRelease.wait", false)){
|
||
Torrent::queueMagnetTorrent($info["magnet"], Database::getConfigKey("torrent.cache.folder", null));
|
||
continue;
|
||
}
|
||
|
||
if(Database::getConfigKey("tracker.webfeed.{$this->name}.modifyTitle", true)){
|
||
$group = Database::getConfigKey("tracker.webfeed.{$this->name}.unknown.group", $this->name);
|
||
$releaseTitle = "[$group] $title";
|
||
}else{
|
||
$releaseTitle = $title;
|
||
}
|
||
}else{
|
||
$releaseTitle = $info["release"];
|
||
}
|
||
|
||
$release = $this->extractor->extractInformation($releaseTitle);
|
||
|
||
if($release !== null){
|
||
$release->setInfoLink(trim($item->link));
|
||
$release->setDownloadLink(isset($info["magnet"]) ? $info["magnet"] : $info["torrent"]);
|
||
if(isset($item->pubDate)){
|
||
$release->setUploadDate(\DateTime::createFromFormat(\DateTime::RSS, (string) $item->pubDate)->getTimestamp());
|
||
}
|
||
|
||
$release->setSeeds(Database::getConfigKey("filter.minseeds", 3));
|
||
if(isset(Database::getConfigKey("tracker.webfeed.{$this->name}.trusted", [])[$release->getGroup()])){
|
||
$release->setTrusted(Database::getConfigKey("tracker.webfeed.{$this->name}.trusted", [])[$release->getGroup()]);
|
||
}
|
||
|
||
if($release->getSource() === Release::SOURCE_UNKNOWN){
|
||
if(strpos($originalTitle, "(TV)") !== false){
|
||
$release->setSource(Release::SOURCE_TV);
|
||
}else if(strpos($originalTitle, "(BD)") !== false){
|
||
$release->setSource(Release::SOURCE_BLURAY);
|
||
}else if(strpos($originalTitle, "(DVD)") !== false){
|
||
$release->setSource(Release::SOURCE_DVD);
|
||
}else if(isset(Database::getConfigKey("tracker.webfeed.{$this->name}.unknown.source", null)[$release->getGroup()])){
|
||
$release->setSource(constant(Release::class . "::SOURCE_" . Database::getConfigKey("tracker.webfeed.{$this->name}.unknown.source", [])[$release->getGroup()]));
|
||
}else{
|
||
$release->setSource(constant(Release::class . "::SOURCE_" . Database::getConfigKey("tracker.webfeed.{$this->name}.unknown.source.default", "WEB")));
|
||
}
|
||
}
|
||
if($release->getQuality() === Release::QUALITY_UNKNOWN){
|
||
if(isset(Database::getConfigKey("tracker.webfeed.{$this->name}.unknown.quality", [])[$release->getGroup()])){
|
||
$release->setQuality(constant(Release::class . "::QUALITY_" . Database::getConfigKey("tracker.webfeed.{$this->name}.unknown.quality", [])[$release->getGroup()]));
|
||
}else{
|
||
$release->setQuality(constant(Release::class . "::QUALITY_" . Database::getConfigKey("tracker.webfeed.{$this->name}.unknown.quality.default", "720")));
|
||
}
|
||
}
|
||
if($release->getVideoCodec() === Release::VIDEO_CODEC_UNKNOWN){
|
||
if(isset(Database::getConfigKey("tracker.webfeed.{$this->name}.unknown.videoCodec", [])[$release->getGroup()])){
|
||
$release->setVideoCodec(constant(Release::class . "::VIDEO_CODEC_" . Database::getConfigKey("tracker.webfeed.{$this->name}.unknown.videoCodec", [])[$release->getGroup()]));
|
||
}else{
|
||
$release->setVideoCodec(constant(Release::class . "::VIDEO_CODEC_" . Database::getConfigKey("tracker.webfeed.{$this->name}.unknown.videoCodec.default", "H264")));
|
||
}
|
||
}
|
||
|
||
if($release instanceof MultiRelease and count($release->getContents()) <= 0 and Database::getConfigKey("magnet.unknownRelease.wait", false)){
|
||
Torrent::queueMagnetTorrent($info["magnet"], Database::getConfigKey("torrent.cache.folder", null));
|
||
continue;
|
||
}
|
||
|
||
$results[$release->getId()] = $release;
|
||
}
|
||
}
|
||
}
|
||
|
||
++$offset;
|
||
}while(Database::getConfigKey("tracker.webfeed.{$this->name}.pagination", true) and ($maxResults == -1 or count($results) < $maxResults) and $lastCount !== count($results));
|
||
|
||
return $results;
|
||
}
|
||
}
|
||
|
||
|