Animarr/src/Animarr/Source/Nyaa.php

134 lines
4.4 KiB
PHP
Executable file

<?php
namespace Animarr\Source;
use Animarr\Database;
use Animarr\Downloader;
use Animarr\Extractor\SceneExtractor;
use Animarr\Release\Release;
class Nyaa implements Source{
const CATEGORY_ANIME_RAW = "1_11";
const CATEGORY_ANIME_ENGLISH = "1_37";
const CATEGORY_ANIME_NON_ENGLISH = "1_38";
const FILTER_ALL = 0;
const FILTER_REMAKES = 1;
const FILTER_TRUSTED_ONLY = 2;
const FILTER_APLUS_ONLY = 3;
private $category;
private $filter;
private $uploader = -1;
private $extractor;
public function __construct(SceneExtractor $extractor, $category = self::CATEGORY_ANIME_ENGLISH, $filter = self::FILTER_ALL){
$this->category = $category;
$this->filter = $filter;
$this->extractor = $extractor;
}
public function canSearch(){
return true;
}
public function getName(){
return "Nyaa";
}
/**
* @param $query
* @param int $maxResults
* @return Release[]
*/
public function find($query, $maxResults = -1, $extraQuery = ""){
$url = Database::getConfigKey("tracker.nyaa.rss.baseurl", "https://www.nyaa.se/?page=rss");
if($query !== null){
$url .= "&term=". urlencode($query);
}
$url .= "&cats={$this->category}";
$url .= "&filter={$this->filter}";
if($this->uploader !== -1){
$url .= "&uploader={$this->uploader}";
}
$results = [];
$offset = 1;
do{
$lastCount = count($results);
//Downloader::log("Fetch $url . \"&offset={$offset}\"", "NYAA");
$feed = file_get_contents($url . "&offset={$offset}");
if($feed == ""){
break;
}
$xml = new \SimpleXMLElement($feed);
foreach($xml->channel->item as $item){
$title = (string) $item->title;
$release = $this->extractor->extractInformation($title);
if($release !== null){
$release->setInfoLink((string) $item->guid);
$release->setDownloadLink((string) $item->link);
$release->setUploadDate(\DateTime::createFromFormat(\DateTime::RSS, (string) $item->pubDate)->getTimestamp());
if(preg_match("/^(?P<seeds>[0-9]+) seeder\\(s\\), (?P<leechs>[0-9]+) leecher\\(s\\), (?P<downloads>[0-9]+) download\\(s\\) \\- (?P<size>[0-9\\.]+ [TGMK]iB)(?P<extra>.*)$/", (string) $item->description, $matches) > 0){
$release->setSeeds((int) $matches["seeds"]);
foreach(explode("-", $matches["extra"]) as $w){
$w = trim($w);
if($w === "Trusted"){
$release->setTrusted(true);
}
if($w === "A+"){
$release->setBest(true);
}
}
}
if($release->getSource() === Release::SOURCE_UNKNOWN){
if(isset(Database::getConfigKey("tracker.nyaa.unknown.source", [])[$release->getGroup()])){
$release->setSource(constant(Release::class . "::SOURCE_" . Database::getConfigKey("tracker.nyaa.unknown.source", [])[$release->getGroup()]));
}else{
$release->setSource(constant(Release::class . "::SOURCE_" . Database::getConfigKey("tracker.nyaa.unknown.source.default", "TV")));
}
}
if($release->getQuality() === Release::QUALITY_UNKNOWN){
if(isset(Database::getConfigKey("tracker.nyaa.unknown.quality", [])[$release->getGroup()])){
$release->setQuality(constant(Release::class . "::QUALITY_" . Database::getConfigKey("tracker.nyaa.unknown.quality", [])[$release->getGroup()]));
}else{
$release->setQuality(constant(Release::class . "::QUALITY_" . Database::getConfigKey("tracker.nyaa.unknown.quality.default", "720")));
}
}
if($release->getVideoCodec() === Release::VIDEO_CODEC_UNKNOWN){
if(isset(Database::getConfigKey("tracker.nyaa.unknown.videoCodec", [])[$release->getGroup()])){
$release->setVideoCodec(constant(Release::class . "::VIDEO_CODEC_" . Database::getConfigKey("tracker.nyaa.unknown.videoCodec", [])[$release->getGroup()]));
}else{
$release->setVideoCodec(constant(Release::class . "::VIDEO_CODEC_" . Database::getConfigKey("tracker.nyaa.unknown.videoCodec.default", "H264")));
}
}
$results[$release->getId()] = $release;
}
}
++$offset;
}while(($maxResults === -1 or count($results) < $maxResults) and $lastCount !== count($results));
return $results;
}
public function setUploader($uploader){
$this->uploader = ($uploader === null ? -1 : $uploader);
}
}