mirror of
https://github.com/NNTmux/newznab-tmux.git
synced 2026-08-29 01:08:56 +00:00
309 lines
12 KiB
PHP
309 lines
12 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Api;
|
|
|
|
use App\Models\User;
|
|
use App\Models\Release;
|
|
use Blacklight\http\API;
|
|
use Blacklight\Releases;
|
|
use App\Models\ReleaseNfo;
|
|
use App\Models\UserRequest;
|
|
use Illuminate\Http\Request;
|
|
use App\Events\UserAccessedApi;
|
|
use Blacklight\utility\Utility;
|
|
use App\Http\Controllers\BasePageController;
|
|
|
|
class ApiController extends BasePageController
|
|
{
|
|
/**
|
|
* @param \Illuminate\Http\Request $request
|
|
* @throws \Throwable
|
|
*/
|
|
public function api(Request $request)
|
|
{
|
|
// API functions.
|
|
$function = 's';
|
|
if ($request->has('t')) {
|
|
switch ($request->input('t')) {
|
|
case 'd':
|
|
case 'details':
|
|
$function = 'd';
|
|
break;
|
|
case 'g':
|
|
case 'get':
|
|
$function = 'g';
|
|
break;
|
|
case 's':
|
|
case 'search':
|
|
$function = 's';
|
|
break;
|
|
case 'c':
|
|
case 'caps':
|
|
$function = 'c';
|
|
break;
|
|
case 'tv':
|
|
case 'tvsearch':
|
|
$function = 'tv';
|
|
break;
|
|
case 'm':
|
|
case 'movie':
|
|
$function = 'm';
|
|
break;
|
|
case 'gn':
|
|
case 'n':
|
|
case 'nfo':
|
|
case 'info':
|
|
$function = 'n';
|
|
break;
|
|
default:
|
|
Utility::showApiError(202, 'No such function ('.$request->input('t').')');
|
|
}
|
|
} else {
|
|
Utility::showApiError(200, 'Missing parameter (t)');
|
|
}
|
|
|
|
$uid = $apiKey = '';
|
|
$res = $catExclusions = [];
|
|
$maxRequests = 0;
|
|
|
|
// Page is accessible only by the apikey
|
|
|
|
if ($function !== 'c' && $function !== 'r') {
|
|
if (! $request->has('apikey') || ($request->has('apikey') && empty($request->input('apikey')))) {
|
|
Utility::showApiError(200, 'Missing parameter (apikey)');
|
|
} else {
|
|
$apiKey = $request->input('apikey');
|
|
$res = User::getByRssToken($apiKey);
|
|
if ($res === null) {
|
|
Utility::showApiError(100, 'Incorrect user credentials (wrong API key)');
|
|
}
|
|
}
|
|
|
|
if ($res->hasRole('Disabled')) {
|
|
Utility::showApiError(101);
|
|
}
|
|
|
|
$uid = $res['id'];
|
|
$catExclusions = User::getCategoryExclusionForApi($request);
|
|
$maxRequests = $res->role->apirequests;
|
|
}
|
|
|
|
// Record user access to the api, if its been called by a user (i.e. capabilities request do not require a user to be logged in or key provided).
|
|
if ($uid !== '') {
|
|
event(new UserAccessedApi($res));
|
|
$apiRequests = UserRequest::getApiRequests($uid);
|
|
if ($apiRequests > $maxRequests) {
|
|
Utility::showApiError(500, 'Request limit reached ('.$apiRequests.'/'.$maxRequests.')');
|
|
}
|
|
}
|
|
|
|
$releases = new Releases();
|
|
$api = new API(['Settings' => $this->settings, 'Request' => $request]);
|
|
|
|
// Set Query Parameters based on Request objects
|
|
$outputXML = ! ($request->has('o') && $request->input('o') === 'json');
|
|
$minSize = $request->has('minsize') && $request->input('minsize') > 0 ? $request->input('minsize') : 0;
|
|
$offset = $api->offset();
|
|
|
|
// Set API Parameters based on Request objects
|
|
$params['extended'] = $request->has('extended') && (int) $request->input('extended') === 1 ? '1' : '0';
|
|
$params['del'] = $request->has('del') && (int) $request->input('del') === 1 ? '1' : '0';
|
|
$params['uid'] = $uid;
|
|
$params['token'] = $apiKey;
|
|
$params['limit'] = $maxRequests;
|
|
$params['grabs'] = $apiRequests;
|
|
|
|
switch ($function) {
|
|
// Search releases.
|
|
case 's':
|
|
$api->verifyEmptyParameter('q');
|
|
$maxAge = $api->maxAge();
|
|
$groupName = $api->group();
|
|
UserRequest::addApiRequest($apiKey, $request->getRequestUri());
|
|
$categoryID = $api->categoryID();
|
|
$limit = $api->limit();
|
|
$searchArr = [
|
|
'searchname' => $request->input('q') ?? -1,
|
|
'name' => -1,
|
|
'fromname' => -1,
|
|
'filename' => -1,
|
|
];
|
|
|
|
if ($request->has('q')) {
|
|
$relData = $releases->search(
|
|
$searchArr,
|
|
$groupName,
|
|
-1,
|
|
-1,
|
|
-1,
|
|
-1,
|
|
$offset,
|
|
$limit,
|
|
'',
|
|
$maxAge,
|
|
$catExclusions,
|
|
'basic',
|
|
$categoryID,
|
|
$minSize
|
|
);
|
|
} else {
|
|
$relData = $releases->getBrowseRange(
|
|
1,
|
|
$categoryID,
|
|
$offset,
|
|
$limit,
|
|
'',
|
|
$maxAge,
|
|
$catExclusions,
|
|
$groupName,
|
|
$minSize
|
|
);
|
|
}
|
|
$api->output($relData, $params, $outputXML, $offset, 'api');
|
|
break;
|
|
// Search tv releases.
|
|
case 'tv':
|
|
$api->verifyEmptyParameter('q');
|
|
$api->verifyEmptyParameter('vid');
|
|
$api->verifyEmptyParameter('tvdbid');
|
|
$api->verifyEmptyParameter('traktid');
|
|
$api->verifyEmptyParameter('rid');
|
|
$api->verifyEmptyParameter('tvmazeid');
|
|
$api->verifyEmptyParameter('imdbid');
|
|
$api->verifyEmptyParameter('tmdbid');
|
|
$api->verifyEmptyParameter('season');
|
|
$api->verifyEmptyParameter('ep');
|
|
$maxAge = $api->maxAge();
|
|
UserRequest::addApiRequest($apiKey, $request->getRequestUri());
|
|
|
|
$siteIdArr = [
|
|
'id' => $request->input('vid') ?? '0',
|
|
'tvdb' => $request->input('tvdbid') ?? '0',
|
|
'trakt' => $request->input('traktid') ?? '0',
|
|
'tvrage' => $request->input('rid') ?? '0',
|
|
'tvmaze' => $request->input('tvmazeid') ?? '0',
|
|
'imdb' => $request->input('imdbid') ?? '0',
|
|
'tmdb' => $request->input('tmdbid') ?? '0',
|
|
];
|
|
|
|
// Process season only queries or Season and Episode/Airdate queries
|
|
|
|
$series = $request->input('season') ?? '';
|
|
$episode = $request->input('ep') ?? '';
|
|
|
|
if (preg_match('#^(19|20)\d{2}$#', $series, $year) && strpos($episode, '/') !== false) {
|
|
$airdate = str_replace('/', '-', $year[0].'-'.$episode);
|
|
}
|
|
|
|
$relData = $releases->tvSearch(
|
|
$siteIdArr,
|
|
$series,
|
|
$episode,
|
|
$airdate ?? '',
|
|
$api->offset(),
|
|
$api->limit(),
|
|
$request->input('q') ?? '',
|
|
$api->categoryID(),
|
|
$maxAge,
|
|
$minSize,
|
|
$catExclusions
|
|
);
|
|
|
|
$api->addLanguage($relData);
|
|
$api->output($relData, $params, $outputXML, $offset, 'api');
|
|
break;
|
|
|
|
// Search movie releases.
|
|
case 'm':
|
|
$api->verifyEmptyParameter('q');
|
|
$api->verifyEmptyParameter('imdbid');
|
|
$maxAge = $api->maxAge();
|
|
UserRequest::addApiRequest($apiKey, $request->getRequestUri());
|
|
|
|
$imdbId = $request->has('imdbid') && ! empty($request->input('imdbid')) ? $request->input('imdbid') : -1;
|
|
$tmdbId = $request->has('tmdbid') && ! empty($request->input('tmdbid')) ? $request->input('tmdbid') : -1;
|
|
$traktId = $request->has('traktid') && ! empty($request->input('traktid')) ? $request->input('traktid') : -1;
|
|
|
|
$relData = $releases->moviesSearch(
|
|
$imdbId,
|
|
$tmdbId,
|
|
$traktId,
|
|
$api->offset(),
|
|
$api->limit(),
|
|
$request->input('q') ?? '',
|
|
$api->categoryID(),
|
|
$maxAge,
|
|
$minSize,
|
|
$catExclusions
|
|
);
|
|
|
|
$api->addCoverURL(
|
|
$relData,
|
|
function ($release) {
|
|
return Utility::getCoverURL(['type' => 'movies', 'id' => $release->imdbid]);
|
|
}
|
|
);
|
|
|
|
$api->addLanguage($relData);
|
|
$api->output($relData, $params, $outputXML, $offset, 'api');
|
|
break;
|
|
|
|
// Get NZB.
|
|
case 'g':
|
|
$api->verifyEmptyParameter('g');
|
|
UserRequest::addApiRequest($apiKey, $request->getRequestUri());
|
|
$relData = Release::checkGuidForApi($request->input('id'));
|
|
if ($relData) {
|
|
return redirect(WWW_TOP.'/getnzb?r='.$apiKey.'&id='.$request->input('id').(($request->has('del') && $request->input('del') === '1') ? '&del=1' : ''));
|
|
}
|
|
|
|
Utility::showApiError(300, 'No such item (the guid you provided has no release in our database)');
|
|
break;
|
|
|
|
// Get individual NZB details.
|
|
case 'd':
|
|
if (! $request->has('id')) {
|
|
Utility::showApiError(200, 'Missing parameter (guid is required for single release details)');
|
|
}
|
|
|
|
UserRequest::addApiRequest($apiKey, $request->getRequestUri());
|
|
$data = Release::getByGuid($request->input('id'));
|
|
|
|
$api->output($data, $params, $outputXML, $offset, 'api');
|
|
break;
|
|
|
|
// Get an NFO file for an individual release.
|
|
case 'n':
|
|
if (! $request->has('id')) {
|
|
Utility::showApiError(200, 'Missing parameter (id is required for retrieving an NFO)');
|
|
}
|
|
|
|
UserRequest::addApiRequest($apiKey, $request->getRequestUri());
|
|
$rel = Release::query()->where('guid', $request->input('id'))->first(['id', 'searchname']);
|
|
$data = ReleaseNfo::getReleaseNfo($rel['id']);
|
|
|
|
if ($rel !== null) {
|
|
if ($data !== null) {
|
|
if ($request->has('o') && $request->input('o') === 'file') {
|
|
return response()->streamDownload(function () use ($data) {
|
|
echo $data['nfo'];
|
|
}, $rel['searchname'].'.nfo', ['Content-type:' => 'application/octet-stream']);
|
|
}
|
|
|
|
echo nl2br(Utility::cp437toUTF($data['nfo']));
|
|
} else {
|
|
Utility::showApiError(300, 'Release does not have an NFO file associated.');
|
|
}
|
|
} else {
|
|
Utility::showApiError(300, 'Release does not exist.');
|
|
}
|
|
break;
|
|
|
|
// Capabilities request.
|
|
case 'c':
|
|
$api->output([], $params, $outputXML, $offset, 'caps');
|
|
break;
|
|
}
|
|
}
|
|
}
|