Animarr/src/Animarr/Source/AnimeBytes.php

225 lines
6.7 KiB
PHP

<?php
namespace Animarr\Source;
use Animarr\Database;
use Animarr\Downloader;
use Animarr\Extractor\AnimeBytesExtractor;
use Animarr\Release\Release;
use Animarr\Request;
class AnimeBytes implements Source{
const CATEGORY_RAW = "raw";
const CATEGORY_SOFTSUBS = "softsubs";
const CATEGORY_HARDSUBS = "hardsubs";
const CATEGORY_SUBS = [self::CATEGORY_SOFTSUBS, self::CATEGORY_HARDSUBS];
const CATEGORY_ALL = [self::CATEGORY_RAW, self::CATEGORY_SOFTSUBS, self::CATEGORY_HARDSUBS];
private $category;
private $uploader = null;
private $loggedIn;
private $extractor;
private $username;
private $passkey;
public function __construct(AnimeBytesExtractor $extractor, $category = self::CATEGORY_SUBS){
$this->category = !is_array($category) ? [$category] : $category;
$this->extractor = $extractor;
$this->username = Database::getConfigKey("tracker.animebytes.auth.username", null);
$this->passkey = trim(file_get_contents(Database::getConfigKey("tracker.animebytes.auth.passkeyFile", null)));
$this->loggedIn = ($this->username != null and $this->passkey != null);
}
public function canSearch(){
return true;
}
public function getName(){
return "AnimeBytes";
}
/**
* @param $query
* @param int $maxResults
* @return Release[]
*/
public function find($query, $maxResults = -1, $extraQuery = ""){
if(!$this->loggedIn){
return [];
}
$url = Database::getConfigKey("tracker.animebytes.scrapeUrl", "https://animebytes.tv/scrape.php");
$params = [
"username" => $this->username,
"torrent_pass" => $this->passkey,
"type" => "anime",
"filter_cat[1]" => "1",
"searchstr" => "",
"actions" => "advanced",
"search_type" => "title",
"year" => "",
"year2" => "",
"tags" => "-lolicon",
"tags_type" => "1",
"sort" => "time_added",
"way" => "desc",
"hentai" => "0",
"showhidden" => "0",
"anime[tv_series]" => "1",
"anime[bd_special]" => "1",
"anime[dvd_special]" => "1",
//"anime[tv_special]" => "1",
"anime[ova]" => "1",
"anime[ona]" => "1",
"releasegroup" => "",
"epcount" => "",
"epcount2" => "",
"artbooktitle" => "",
"containers[avi]" => "1",
"containers[mkv]" => "1",
"containers[mp4]" => "1",
"containers[ogm]" => "1",
"containers[wmv]" => "1",
"containers[mpg]" => "1",
"containers[mpeg]" => "1",
];
foreach($this->category as $category){
$params["animetrans[$category]"] = "1";
}
if($this->uploader !== null){
$params["releasegroup"] = $this->uploader;
}
if($query !== null){
$params["sort"] = "relevance";
$params["way"] = "desc";
$params["searchstr"] = $query;
}
$results = [];
$feed = Request::getURL($url . "?" . http_build_query($params));
if($feed == ""){
return $results;
}
$json = json_decode($feed, true);
if(isset($json["error"])){
Downloader::log("[ERROR] " . $json["error"], $this->getName());
return $results;
}
if(!isset($json["Groups"])){
return $results;
}
foreach($json["Groups"] as $item){
$title = $item["SeriesName"];
$aid = "";
$rating = null;//$item["Rating"] //not implemented on AB;
$votes = $item["Votes"];
foreach($item["Links"] as $link){
if(preg_match("#anidb\\.net/a([0-9]+)$#", $link, $matches) > 0){
$aid = intval($matches[1]);
}
}
foreach($item["Torrents"] as $torrent){
$downloadInfo = $torrent["Property"];
$downloadInfoLink = "https://animebytes.tv/torrents.php?id=". $item["ID"] ."&torrentid=" . $torrent["ID"];
$downloadLink = $torrent["Link"];
$releaseInfo = [
//"group" => $item,
"title" => $title,
"aid" => $aid,
"info" => $downloadInfo,
"edition" => isset($torrent["EditionData"]["EditionTitle"]) ? $torrent["EditionData"]["EditionTitle"] : null,
];
$release = $this->extractor->extractInformation(http_build_query($releaseInfo), $this->category);
if($release === null){
continue;
}
$release->setInfoLink($downloadInfoLink);
$release->setDownloadLink($downloadLink);
$release->setUploadDate(\DateTime::createFromFormat("Y-m-d H:i:s", $torrent["UploadTime"], new \DateTimeZone("UTC"))->getTimestamp());
$release->setSeeds((int) $torrent["Seeders"]);
$release->setProperty("animebytes:rating", $rating);
$release->setProperty("animebytes:votes", $votes);
if(isset(Database::getConfigKey("tracker.animebytes.trusted", [])[$release->getGroup()])){
$release->setTrusted(Database::getConfigKey("tracker.animebytes.trusted", [])[$release->getGroup()]);
}else if(Database::getConfigKey("tracker.animebytes.goldlist.trusted", false)){
$items = explode("-", strtolower($release->getGroup()));
foreach(Database::getConfigKey("filter.groups.goldlist", []) as $gold){
if($release->isTrusted()){
break;
}
if(strtolower($release->getGroup()) == strtolower($gold)){
$release->setTrusted(true);
}
foreach($items as $i){
if($i === strtolower($gold)){
$release->setTrusted(true);
break;
}
}
}
}
if($release->getSource() === Release::SOURCE_UNKNOWN){
if(isset(Database::getConfigKey("tracker.animebytes.unknown.source", [])[$release->getGroup()])){
$release->setSource(constant(Release::class . "::SOURCE_" . Database::getConfigKey("tracker.animebytes.unknown.source", [])[$release->getGroup()]));
}else{
$release->setSource(constant(Release::class . "::SOURCE_" . Database::getConfigKey("tracker.animebytes.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.animebytes.unknown.quality", [])[$release->getGroup()]));
}else{
$release->setQuality(constant(Release::class . "::QUALITY_" . Database::getConfigKey("tracker.animebytes.unknown.quality.default", "720")));
}
}
if($release->getVideoCodec() === Release::VIDEO_CODEC_UNKNOWN){
if(isset(Database::getConfigKey("tracker.animebytes.unknown.videoCodec", [])[$release->getGroup()])){
$release->setVideoCodec(constant(Release::class . "::VIDEO_CODEC_" . Database::getConfigKey("tracker.animebytes.unknown.videoCodec", [])[$release->getGroup()]));
}else{
$release->setVideoCodec(constant(Release::class . "::VIDEO_CODEC_" . Database::getConfigKey("tracker.animebytes.unknown.videoCodec.default", "H264")));
}
}
$results[$release->getId()] = $release;
}
}
return $results;
}
public function setUploader($uploader){
$this->uploader = ($uploader === null ? -1 : $uploader);
}
}