mirror of
https://github.com/NNTmux/newznab-tmux.git
synced 2026-09-02 03:08:53 +00:00
AniDB code cleanup, ported from nZEDb
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
2016-06-08 DariusIII
|
||||
* Upd: AniDB code cleanup, ported from nZEDb
|
||||
2016-06-07 DariusIII
|
||||
* Upd: Make Charisma theme dark, fix some bootstrap issues.
|
||||
* Upd: Update composer.lock file
|
||||
|
||||
+1
-1
@@ -8,7 +8,7 @@
|
||||
<precommit>9</precommit>
|
||||
<!-- this is the version of the pre-commit file in githooks NOT the files it calls -->
|
||||
</hooks>
|
||||
<commit>5275</commit></git>
|
||||
<commit>5276</commit></git>
|
||||
<scripts>
|
||||
<last>
|
||||
<date>0000-00-00</date>
|
||||
|
||||
+43
-33
@@ -44,10 +44,10 @@ class AniDB
|
||||
// FIXME fix the missing variables for this query
|
||||
$this->pdo->queryExec(
|
||||
sprintf('
|
||||
UPDATE anidb_titles AS at INNER JOIN anidb_info ai USING (anidbid) SET title = %s, type = %s, startdate = %s, enddate = %s,
|
||||
related = %s, similar = %s, creators = %s, description = %s, rating = %s,
|
||||
categories = %s, characters = %s, epnos = %s, airdates = %s,
|
||||
episodetitles = %s, unixtime = %d WHERE anidbid = %d',
|
||||
UPDATE anidb_titles AS at INNER JOIN anidb_info ai USING (anidbid) SET title = %s, type = %s, startdate = %s, enddate = %s,
|
||||
related = %s, similar = %s, creators = %s, description = %s, rating = %s,
|
||||
categories = %s, characters = %s, epnos = %s, airdates = %s,
|
||||
episodetitles = %s, unixtime = %d WHERE anidbid = %d',
|
||||
$this->pdo->escapeString($title),
|
||||
$this->pdo->escapeString($type),
|
||||
$this->pdo->escapeString($startdate),
|
||||
@@ -77,11 +77,11 @@ class AniDB
|
||||
{
|
||||
$this->pdo->queryExec(
|
||||
sprintf('
|
||||
DELETE at, ai, ae
|
||||
FROM anidb_titles AS at
|
||||
LEFT OUTER JOIN anidb_info ai USING (anidbid)
|
||||
LEFT OUTER JOIN anidb_episodes ae USING (anidbid)
|
||||
WHERE anidbid = %d',
|
||||
DELETE at, ai, ae
|
||||
FROM anidb_titles AS at
|
||||
LEFT OUTER JOIN anidb_info ai USING (anidbid)
|
||||
LEFT OUTER JOIN anidb_episodes ae USING (anidbid)
|
||||
WHERE anidbid = %d',
|
||||
$anidbID
|
||||
)
|
||||
);
|
||||
@@ -96,31 +96,33 @@ class AniDB
|
||||
*/
|
||||
public function getAnimeList($letter = '', $animetitle = '')
|
||||
{
|
||||
$regex = 'REGEXP';
|
||||
$rsql = '';
|
||||
$rsql = $tsql = '';
|
||||
|
||||
if ($letter != '') {
|
||||
if ($letter == '0-9') {
|
||||
$letter = '[0-9]';
|
||||
}
|
||||
$rsql .= sprintf('AND at.title %s %s', $regex, $this->pdo->escapeString('^' . $letter));
|
||||
$rsql .= sprintf('AND at.title REGEXP %s', $this->pdo->escapeString('^' . $letter));
|
||||
}
|
||||
|
||||
$tsql = '';
|
||||
if ($animetitle != '') {
|
||||
$tsql .= sprintf('AND at.title %s', $this->pdo->likeString($animetitle, true, true));
|
||||
}
|
||||
|
||||
return $this->pdo->queryDirect(
|
||||
sprintf('SELECT at.anidbid, at.title, ai.type, ai.categories, ai.rating, ai.startdate, ai.enddate
|
||||
FROM anidb_titles at
|
||||
LEFT JOIN anidb_info ai USING (anidbid)
|
||||
INNER JOIN releases r ON at.anidbid = r.anidbid
|
||||
WHERE at.anidbid > 0 %s %s
|
||||
GROUP BY at.anidbid
|
||||
ORDER BY at.title ASC',
|
||||
sprintf('
|
||||
SELECT at.anidbid, at.title,
|
||||
ai.type, ai.categories, ai.rating, ai.startdate, ai.enddate
|
||||
FROM anidb_titles at
|
||||
LEFT JOIN anidb_info ai USING (anidbid)
|
||||
STRAIGHT_JOIN releases r ON at.anidbid = r.anidbid
|
||||
WHERE at.anidbid > 0 %s %s
|
||||
AND r.categories_id = %d
|
||||
GROUP BY at.anidbid
|
||||
ORDER BY at.title ASC',
|
||||
$rsql,
|
||||
$tsql
|
||||
$tsql,
|
||||
Category::TV_ANIME
|
||||
)
|
||||
);
|
||||
}
|
||||
@@ -147,12 +149,15 @@ class AniDB
|
||||
}
|
||||
|
||||
return $this->pdo->query(
|
||||
sprintf('SELECT at.anidbid, GROUP_CONCAT(at.title SEPARATOR ", ") AS title, ai.description
|
||||
FROM anidb_titles AS at LEFT JOIN anidb_info AS ai USING (anidbid)
|
||||
WHERE 1=1 %s
|
||||
AND at.lang = "en"
|
||||
GROUP BY at.anidbid
|
||||
ORDER BY at.anidbid ASC %s',
|
||||
sprintf("
|
||||
SELECT at.anidbid, GROUP_CONCAT(at.title SEPARATOR ', ') AS title,
|
||||
ai.description
|
||||
FROM anidb_titles AS at
|
||||
LEFT JOIN anidb_info AS ai USING (anidbid)
|
||||
WHERE 1=1 %s
|
||||
AND at.lang = 'en'
|
||||
GROUP BY at.anidbid
|
||||
ORDER BY at.anidbid ASC %s",
|
||||
$rsql,
|
||||
$limit
|
||||
)
|
||||
@@ -173,8 +178,10 @@ class AniDB
|
||||
}
|
||||
|
||||
$res = $this->pdo->queryOneRow(
|
||||
sprintf('SELECT COUNT(DISTINCT at.anidbid) AS num
|
||||
FROM anidb_titles AS at LEFT JOIN anidb_info AS ai USING (anidbid)
|
||||
sprintf('
|
||||
SELECT COUNT(DISTINCT at.anidbid) AS num
|
||||
FROM anidb_titles AS at
|
||||
LEFT JOIN anidb_info AS ai USING (anidbid)
|
||||
WHERE 1=1
|
||||
%s',
|
||||
$rsql
|
||||
@@ -193,14 +200,17 @@ class AniDB
|
||||
public function getAnimeInfo($anidbID)
|
||||
{
|
||||
$animeInfo = $this->pdo->query(
|
||||
sprintf('SELECT at.anidbid, at.lang, at.title,
|
||||
ai.startdate, ai.enddate, ai.updated, ai.related, ai.creators, ai.description,
|
||||
ai.rating, ai.picture, ai.categories, ai.characters, ai.type, ai.similar
|
||||
FROM anidb_titles AS at LEFT JOIN anidb_info ai USING (anidbid)
|
||||
sprintf('
|
||||
SELECT at.anidbid, at.lang, at.title,
|
||||
ai.startdate, ai.enddate, ai.updated, ai.related, ai.creators, ai.description,
|
||||
ai.rating, ai.picture, ai.categories, ai.characters, ai.type, ai.similar
|
||||
FROM anidb_titles AS at
|
||||
LEFT JOIN anidb_info AS ai USING (anidbid)
|
||||
WHERE at.anidbid = %d',
|
||||
$anidbID
|
||||
)
|
||||
);
|
||||
|
||||
return isset($animeInfo[0]) ? $animeInfo[0] : false;
|
||||
}
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ namespace newznab\db\populate;
|
||||
|
||||
use newznab\ReleaseImage;
|
||||
use newznab\db\Settings;
|
||||
use newznab\utility\Utility;
|
||||
|
||||
class AniDB
|
||||
{
|
||||
@@ -33,7 +34,7 @@ class AniDB
|
||||
private $anidbId;
|
||||
|
||||
/**
|
||||
* The name of the NNTmux client for AniDB lookups
|
||||
* The name of the nZEDb client for AniDB lookups
|
||||
* @var string
|
||||
*/
|
||||
private $apiKey;
|
||||
@@ -70,7 +71,6 @@ class AniDB
|
||||
$this->echooutput = ($options['Echo'] && NN_ECHOCLI);
|
||||
$this->pdo = ($options['Settings'] instanceof Settings ? $options['Settings'] : new Settings());
|
||||
|
||||
// $maxanidbprocessed = $this->pdo->getSetting('maxanidbprocessed');
|
||||
$anidbupdint = $this->pdo->getSetting('intanidbupdate');
|
||||
$lastupdated = $this->pdo->getSetting('lastanidbupdate');
|
||||
|
||||
@@ -97,6 +97,7 @@ class AniDB
|
||||
case 'info':
|
||||
$this->anidbId = $anidbId;
|
||||
$this->populateInfoTable();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -114,12 +115,12 @@ class AniDB
|
||||
{
|
||||
return $this->pdo->queryOneRow(
|
||||
sprintf('
|
||||
SELECT anidbid
|
||||
FROM anidb_titles
|
||||
WHERE anidbid = %d
|
||||
AND type = %s
|
||||
AND lang = %s
|
||||
AND title = %s',
|
||||
SELECT anidbid
|
||||
FROM anidb_titles
|
||||
WHERE anidbid = %d
|
||||
AND type = %s
|
||||
AND lang = %s
|
||||
AND title = %s',
|
||||
$id,
|
||||
$this->pdo->escapeString($type),
|
||||
$this->pdo->escapeString($lang),
|
||||
@@ -135,7 +136,7 @@ class AniDB
|
||||
*/
|
||||
private function getAniDbAPI()
|
||||
{
|
||||
$timestamp = $this->pdo->getSetting('banned') + 90000;
|
||||
$timestamp = $this->pdo->getSetting('APIs.AniDB.banned') + 90000;
|
||||
if ($timestamp > time()) {
|
||||
echo "Banned from AniDB lookups until " . date('Y-m-d H:i:s', $timestamp) . "\n";
|
||||
return false;
|
||||
@@ -148,18 +149,15 @@ class AniDB
|
||||
echo "AniDB: Error getting response." . PHP_EOL;
|
||||
} elseif (preg_match("/\<error\>Banned\<\/error\>/", $apiresponse)) {
|
||||
$this->banned = true;
|
||||
$this->pdo->setSetting(['banned' => time()]);
|
||||
$this->pdo->setSetting(['APIs.AniDB.banned' => time()]);
|
||||
} elseif (preg_match("/\<error\>Anime not found\<\/error\>/", $apiresponse)) {
|
||||
echo "AniDB : Anime not yet on site. Remove until next update.\n";
|
||||
} elseif ($AniDBAPIXML = new \SimpleXMLElement($apiresponse)) {
|
||||
|
||||
$AniDBAPIArray['similar'] = $this->processAPIResponceElement($AniDBAPIXML->similaranime, 'anime');
|
||||
|
||||
$AniDBAPIArray['related'] = $this->processAPIResponceElement($AniDBAPIXML->relatedanime, 'anime');
|
||||
|
||||
$AniDBAPIArray['creators'] = $this->processAPIResponceElement($AniDBAPIXML->creators);
|
||||
|
||||
$AniDBAPIArray['characters'] = $this->processAPIResponceElement($AniDBAPIXML->characters);
|
||||
|
||||
$AniDBAPIArray['categories'] = $this->processAPIResponceElement($AniDBAPIXML->categories);
|
||||
|
||||
$episodeArray = [];
|
||||
@@ -170,7 +168,7 @@ class AniDB
|
||||
|
||||
$episodeArray[$i]['episode_id'] = (int)$episode->attributes()->id[0];
|
||||
$episodeArray[$i]['episode_no'] = (int)$episode->epno;
|
||||
$episodeArray[$i]['airdate'] = (string)$episode->airdate;
|
||||
$episodeArray[$i]['airdate'] = (string)$episode->airdate;
|
||||
|
||||
if ($AniDBAPIXML->title && $AniDBAPIXML->title[0]->attributes()) {
|
||||
foreach ($AniDBAPIXML->title->children() as $title) {
|
||||
@@ -189,13 +187,15 @@ class AniDB
|
||||
|
||||
//start and end date come from AniDB API as date strings -- no manipulation needed
|
||||
$AniDBAPIArray['startdate'] = isset($AniDBAPIXML->startdate) ? $AniDBAPIXML->startdate : '0000-00-00';
|
||||
$AniDBAPIArray['enddate'] = isset($AniDBAPIXML->enddate) ? $AniDBAPIXML->enddate : '0000-00-00';
|
||||
$AniDBAPIArray['enddate'] = isset($AniDBAPIXML->enddate) ? $AniDBAPIXML->enddate : '0000-00-00';
|
||||
|
||||
if (isset($AniDBAPIXML->ratings->permanent)) {
|
||||
$AniDBAPIArray['rating'] = $AniDBAPIXML->ratings->permanent;
|
||||
} else {
|
||||
$AniDBAPIArray['rating'] = isset($AniDBAPIXML->ratings->temporary) ?
|
||||
$AniDBAPIXML->ratings->temporary : $AniDBAPIArray['rating'] = '';
|
||||
$AniDBAPIArray['rating'] = (isset($AniDBAPIXML->ratings->temporary)
|
||||
? $AniDBAPIXML->ratings->temporary
|
||||
: $AniDBAPIArray['rating'] = ''
|
||||
);
|
||||
}
|
||||
|
||||
$AniDBAPIArray += [
|
||||
@@ -207,6 +207,7 @@ class AniDB
|
||||
|
||||
return $AniDBAPIArray;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -219,12 +220,13 @@ class AniDB
|
||||
private function processAPIResponceElement(\SimpleXMLElement $element, $property = null)
|
||||
{
|
||||
$property = empty($property) ? 'name' : $property;
|
||||
$temp = '';
|
||||
$temp = '';
|
||||
if ($element && $element[0]->attributes()) {
|
||||
foreach ($element->children() as $entry) {
|
||||
$temp .= (string)$entry->$property . ', ';
|
||||
}
|
||||
}
|
||||
|
||||
return (empty($temp) ? '' : substr($temp, 0, -2));
|
||||
}
|
||||
|
||||
@@ -235,26 +237,19 @@ class AniDB
|
||||
*/
|
||||
private function getAniDbResponse()
|
||||
{
|
||||
$curlString = sprintf(
|
||||
$urlString = sprintf(
|
||||
'http://api.anidb.net:9001/httpapi?request=anime&client=%s&clientver=%d&protover=1&aid=%d',
|
||||
$this->apiKey,
|
||||
self::CLIENT_VERSION,
|
||||
$this->anidbId
|
||||
);
|
||||
|
||||
$ch = curl_init($curlString);
|
||||
|
||||
$curlOpts = [
|
||||
CURLOPT_RETURNTRANSFER => 1,
|
||||
CURLOPT_HEADER => 0,
|
||||
CURLOPT_FAILONERROR => 1,
|
||||
CURLOPT_ENCODING => 'gzip'
|
||||
];
|
||||
|
||||
curl_setopt_array($ch, $curlOpts);
|
||||
$apiresponse = curl_exec($ch);
|
||||
curl_close($ch);
|
||||
return $apiresponse;
|
||||
return Utility::getUrl(
|
||||
[
|
||||
'url' => $urlString,
|
||||
'method' => 'get'
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -272,15 +267,15 @@ class AniDB
|
||||
if ($check === false) {
|
||||
$this->pdo->queryInsert(
|
||||
sprintf('
|
||||
INSERT IGNORE INTO anidb_titles
|
||||
(anidbid, type, lang, title)
|
||||
VALUES
|
||||
(%d, %s, %s, %s)',
|
||||
INSERT IGNORE INTO anidb_titles
|
||||
(anidbid, type, lang, title)
|
||||
VALUES (%d, %s, %s, %s)',
|
||||
$id,
|
||||
$this->pdo->escapeString($type),
|
||||
$this->pdo->escapeString($lang),
|
||||
$this->pdo->escapeString($title)
|
||||
));
|
||||
)
|
||||
);
|
||||
} else {
|
||||
echo $this->pdo->log->warning("Duplicate: $id");
|
||||
}
|
||||
@@ -297,9 +292,12 @@ class AniDB
|
||||
{
|
||||
$this->pdo->queryInsert(
|
||||
sprintf('
|
||||
INSERT INTO anidb_info (anidbid, type, startdate, enddate, related, similar, creators, description, rating, picture, categories, characters, updated)
|
||||
VALUES
|
||||
(%d, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, NOW())',
|
||||
INSERT INTO anidb_info
|
||||
(
|
||||
anidbid, type, startdate, enddate, related, similar, creators,
|
||||
description, rating, picture, categories, characters, updated
|
||||
)
|
||||
VALUES (%d, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, NOW())',
|
||||
$this->anidbId,
|
||||
$this->pdo->escapeString($AniDBInfoArray['type']),
|
||||
$this->pdo->escapeString($AniDBInfoArray['startdate']),
|
||||
@@ -314,10 +312,10 @@ class AniDB
|
||||
$this->pdo->escapeString($AniDBInfoArray['characters'])
|
||||
)
|
||||
);
|
||||
|
||||
if (isset($AniDBInfoArray['epsarr'])) {
|
||||
$this->insertAniDBEpisodes($AniDBInfoArray['epsarr']);
|
||||
}
|
||||
|
||||
return $AniDBInfoArray['picture'];
|
||||
}
|
||||
|
||||
@@ -332,8 +330,9 @@ class AniDB
|
||||
foreach ($episodeArr as $episode) {
|
||||
$this->pdo->queryInsert(
|
||||
sprintf('
|
||||
INSERT IGNORE INTO anidb_episodes (anidbid, episodeid, episode_no, episode_title, airdate)
|
||||
VALUES (%d, %d, %d, %s, %s)',
|
||||
INSERT IGNORE INTO anidb_episodes
|
||||
(anidbid, episodeid, episode_no, episode_title, airdate)
|
||||
VALUES (%d, %d, %d, %s, %s)',
|
||||
$this->anidbId,
|
||||
$episode['episode_id'],
|
||||
$episode['episode_no'],
|
||||
@@ -357,22 +356,16 @@ class AniDB
|
||||
}
|
||||
|
||||
$animetitles = new \SimpleXMLElement("compress.zlib://http://anidb.net/api/anime-titles.xml.gz", null, true);
|
||||
/*
|
||||
$lines = gzfile(realpath(NN_ROOT . '..' . DS . 'anime-titles.xml.gz'));
|
||||
$file = implode('', $lines);
|
||||
$animetitles = new \SimpleXMLElement($file, 0, false);
|
||||
*/
|
||||
|
||||
//Even if the update process fails,
|
||||
//we must mark the last update time or risk ban
|
||||
$this->setLastUpdated();
|
||||
|
||||
if ($animetitles instanceof \Traversable) {
|
||||
$count = count($animetitles);
|
||||
$count = $animetitles->count();
|
||||
if ($this->echooutput) {
|
||||
echo $this->pdo->log->header(
|
||||
"Total of " . number_format($count) .
|
||||
" titles to add." . PHP_EOL
|
||||
"Total of " . number_format($count) . " titles to add." . PHP_EOL
|
||||
);
|
||||
}
|
||||
|
||||
@@ -380,16 +373,21 @@ class AniDB
|
||||
echo "Remaining: $count \r";
|
||||
foreach ($anime->title as $title) {
|
||||
$xmlAttribs = $title->attributes('xml', true);
|
||||
$this->insertAniDb((string)$anime['aid'],
|
||||
$this->insertAniDb(
|
||||
(string)$anime['aid'],
|
||||
(string)$title['type'],
|
||||
(string)$xmlAttribs->lang,
|
||||
(string)$title[0]);
|
||||
(string)$title[0]
|
||||
);
|
||||
$this->pdo->log->primary(
|
||||
"Inserting: %d, %s, %s, %s",
|
||||
$anime['aid'],
|
||||
$title['type'],
|
||||
$xmlAttribs->lang,
|
||||
$title[0]);
|
||||
sprintf(
|
||||
"Inserting: %d, %s, %s, %s",
|
||||
$anime['aid'],
|
||||
$title['type'],
|
||||
$xmlAttribs->lang,
|
||||
$title[0]
|
||||
)
|
||||
);
|
||||
}
|
||||
$count--;
|
||||
}
|
||||
@@ -414,17 +412,29 @@ class AniDB
|
||||
$AniDBAPIArray = $this->getAniDbAPI();
|
||||
|
||||
if ($this->banned === true) {
|
||||
$this->pdo->log->doEcho($this->pdo->log->error("AniDB Banned, import will fail, please wait 24 hours before retrying."),
|
||||
true);
|
||||
$this->pdo->log->doEcho(
|
||||
$this->pdo->log->error(
|
||||
"AniDB Banned, import will fail, please wait 24 hours before retrying."
|
||||
),
|
||||
true
|
||||
);
|
||||
exit;
|
||||
} elseif ($AniDBAPIArray === false && $this->echooutput) {
|
||||
$this->pdo->log->doEcho($this->pdo->log->info("Anime ID: {$this->anidbId} not available for update yet."),
|
||||
true);
|
||||
$this->pdo->log->doEcho(
|
||||
$this->pdo->log->info(
|
||||
"Anime ID: {$this->anidbId} not available for update yet."
|
||||
),
|
||||
true
|
||||
);
|
||||
} else {
|
||||
$this->updateAniChildTables($AniDBAPIArray);
|
||||
if (NN_DEBUG) {
|
||||
$this->pdo->log->doEcho($this->pdo->log->headerOver("Added/Updated AniDB ID: {$this->anidbId}"),
|
||||
true);
|
||||
$this->pdo->log->doEcho(
|
||||
$this->pdo->log->headerOver(
|
||||
"Added/Updated AniDB ID: {$this->anidbId}"
|
||||
),
|
||||
true
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -434,7 +444,7 @@ class AniDB
|
||||
*/
|
||||
private function setLastUpdated()
|
||||
{
|
||||
$this->pdo->setSetting(['lastanidbupdate' => time()]);
|
||||
$this->pdo->setSetting(['APIs.anidb.last_full_update' => time()]);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -448,12 +458,12 @@ class AniDB
|
||||
{
|
||||
$this->pdo->queryExec(
|
||||
sprintf('
|
||||
UPDATE anidb_info
|
||||
SET type = %s, startdate = %s, enddate = %s, related = %s,
|
||||
similar = %s, creators = %s, description = %s,
|
||||
rating = %s, picture = %s, categories = %s, characters = %s,
|
||||
updated = NOW()
|
||||
WHERE anidbid = %d',
|
||||
UPDATE anidb_info
|
||||
SET type = %s, startdate = %s, enddate = %s, related = %s,
|
||||
similar = %s, creators = %s, description = %s,
|
||||
rating = %s, picture = %s, categories = %s, characters = %s,
|
||||
updated = NOW()
|
||||
WHERE anidbid = %d',
|
||||
$this->pdo->escapeString($AniDBInfoArray['type']),
|
||||
$this->pdo->escapeString($AniDBInfoArray['startdate']),
|
||||
$this->pdo->escapeString($AniDBInfoArray['enddate']),
|
||||
@@ -468,8 +478,8 @@ class AniDB
|
||||
$this->anidbId
|
||||
)
|
||||
);
|
||||
|
||||
$this->insertAniDBEpisodes($AniDBInfoArray['epsarr']);
|
||||
|
||||
return $AniDBInfoArray['picture'];
|
||||
}
|
||||
|
||||
@@ -482,9 +492,9 @@ class AniDB
|
||||
{
|
||||
$check = $this->pdo->queryOneRow(
|
||||
sprintf('
|
||||
SELECT ai.anidbid AS info
|
||||
FROM anidb_info ai
|
||||
WHERE ai.anidbid = %d',
|
||||
SELECT ai.anidbid AS info
|
||||
FROM anidb_info ai
|
||||
WHERE ai.anidbid = %d',
|
||||
$this->anidbId
|
||||
)
|
||||
);
|
||||
|
||||
@@ -0,0 +1,145 @@
|
||||
<?php
|
||||
/**
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program (see LICENSE.txt in the base directory. If
|
||||
* not, see:
|
||||
*
|
||||
* @link <http://www.gnu.org/licenses/>.
|
||||
* @author niel
|
||||
* @copyright 2014 nZEDb
|
||||
*/
|
||||
namespace newznab\db\populate;
|
||||
|
||||
use newznab\db\Settings;
|
||||
use newznab\utility\Utility;
|
||||
|
||||
class PopulateTitles
|
||||
{
|
||||
/**
|
||||
* @var \newznab\db\Settings
|
||||
*/
|
||||
public $pdo;
|
||||
|
||||
/**
|
||||
* @var \SimpleXMLElement
|
||||
*/
|
||||
protected $dataXML;
|
||||
|
||||
/**
|
||||
* @var \PDOStatement
|
||||
*/
|
||||
protected $checkForDuplicate;
|
||||
|
||||
/**
|
||||
* @var \PDOStatement
|
||||
*/
|
||||
protected $insertEntry;
|
||||
|
||||
protected $mainTable;
|
||||
|
||||
/**
|
||||
* URL of source data.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $sourceURL;
|
||||
|
||||
protected $tempTable;
|
||||
|
||||
public function __constructor($options)
|
||||
{
|
||||
$defaults = [
|
||||
'pdo' => null,
|
||||
];
|
||||
$options += $defaults;
|
||||
|
||||
$this->sourceURL = $options['data-source-url'];
|
||||
$this->mainTable = $options['main-table'];
|
||||
$this->tempTable = $options['main-table'] . '_tmp';
|
||||
|
||||
if (isset($options['pdo']) && $options['pdo'] instanceof Settings) {
|
||||
$this->pdo = $options['pdo'];
|
||||
}
|
||||
}
|
||||
|
||||
protected function checkForDuplicate(array $parameters)
|
||||
{
|
||||
if ($this->checkForDuplicate instanceof \PDOStatement) {
|
||||
$this->checkForDuplicate->execute($parameters);
|
||||
return $this->checkForDuplicate->fetchAll();
|
||||
} else {
|
||||
throw new \RuntimeException("Duplicate check query not yet prepared!");
|
||||
}
|
||||
}
|
||||
|
||||
protected function createTempTable()
|
||||
{
|
||||
// Clear the old temporary table.
|
||||
$sql = "DROP TABLE IF EXISTS {$this->tempTable}";
|
||||
$result = $this->pdo()->exec($sql);
|
||||
|
||||
if ($result !== false) {
|
||||
$sql = "CREATE TABLE {$this->tempTable} LIKE {$this->mainTable}";
|
||||
$result = $this->pdo()->exec($sql);
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
protected function insertEntry(array $parameters)
|
||||
{
|
||||
if ($this->insertEntry instanceof \PDOStatement) {
|
||||
$this->insertEntry->execute($parameters);
|
||||
return $this->insertEntry->fetchAll();
|
||||
} else {
|
||||
throw new \RuntimeException("Insertion query not yet prepared!");
|
||||
}
|
||||
}
|
||||
|
||||
protected function loadXMLFromFile($file)
|
||||
{
|
||||
$useErrors = libxml_use_internal_errors(true);
|
||||
$this->dataXML = simplexml_load_file($file);
|
||||
|
||||
if (!$this->dataXML) {
|
||||
foreach (libxml_get_errors() as $error) {
|
||||
echo "\t", $error->message;
|
||||
}
|
||||
}
|
||||
|
||||
libxml_use_internal_errors($useErrors);
|
||||
return ($this->dataXML !== false);
|
||||
}
|
||||
|
||||
protected function pdo()
|
||||
{
|
||||
if ($this->pdo === null) {
|
||||
$this->pdo = new Settings();
|
||||
}
|
||||
return $this->pdo;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $pathname full path to file for saving. Will be overwritten.
|
||||
*
|
||||
* @return bool|int
|
||||
*/
|
||||
protected function saveSourceFile($pathname)
|
||||
{
|
||||
$result = false;
|
||||
$file = Utility::getUrl(['url' => $this->sourceURL]);
|
||||
if ($file !== false) {
|
||||
$result = file_put_contents($pathname, $file);
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
@@ -50,9 +50,9 @@ class AniDB
|
||||
$options += $defaults;
|
||||
|
||||
$this->echooutput = ($options['Echo'] && NN_ECHOCLI);
|
||||
$this->pdo = ($options['Settings'] instanceof Settings ? $options['Settings'] : new Settings());
|
||||
$this->pdo = ($options['Settings'] instanceof Settings ? $options['Settings'] : new Settings());
|
||||
|
||||
$qty = $this->pdo->getSetting('maxanidbprocessed');
|
||||
$qty = $this->pdo->getSetting('maxanidbprocessed');
|
||||
$this->aniqty = !empty($qty) ? $qty : 100;
|
||||
|
||||
$this->status = 'NULL';
|
||||
@@ -64,40 +64,42 @@ class AniDB
|
||||
public function processAnimeReleases()
|
||||
{
|
||||
$results = $this->pdo->queryDirect(
|
||||
sprintf('
|
||||
SELECT searchname, id
|
||||
FROM releases
|
||||
WHERE nzbstatus = %d
|
||||
AND anidbid IS NULL
|
||||
AND categories_id = %d
|
||||
ORDER BY postdate DESC
|
||||
LIMIT %d',
|
||||
NZB::NZB_ADDED,
|
||||
Category::TV_ANIME,
|
||||
$this->aniqty
|
||||
)
|
||||
sprintf('
|
||||
SELECT searchname, id
|
||||
FROM releases
|
||||
WHERE nzbstatus = %d
|
||||
AND anidbid IS NULL
|
||||
AND categories_id = %d
|
||||
ORDER BY postdate DESC
|
||||
LIMIT %d',
|
||||
NZB::NZB_ADDED,
|
||||
Category::TV_ANIME,
|
||||
$this->aniqty
|
||||
)
|
||||
);
|
||||
|
||||
if ($results instanceof \Traversable) {
|
||||
|
||||
$this->doRandomSleep();
|
||||
|
||||
$this->padb = new \newznab\db\populate\AniDB([
|
||||
'Echo' => $this->echooutput,
|
||||
'Settings' => $this->pdo
|
||||
]);
|
||||
$this->padb = new \newznab\db\populate\AniDB(
|
||||
[
|
||||
'Echo' => $this->echooutput,
|
||||
'Settings' => $this->pdo
|
||||
]
|
||||
);
|
||||
|
||||
foreach ($results as $release) {
|
||||
$matched = $this->matchAnimeRelease($release);
|
||||
if ($matched === false) {
|
||||
$this->pdo->queryExec(
|
||||
sprintf('
|
||||
UPDATE releases
|
||||
SET anidbid = %d
|
||||
WHERE id = %d',
|
||||
$this->status,
|
||||
$release['id']
|
||||
)
|
||||
sprintf('
|
||||
UPDATE releases
|
||||
SET anidbid = %d
|
||||
WHERE id = %d',
|
||||
$this->status,
|
||||
$release['id']
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -117,15 +119,15 @@ class AniDB
|
||||
private function checkAniDBInfo($anidbId, $episode = -1)
|
||||
{
|
||||
return $this->pdo->queryOneRow(
|
||||
sprintf('
|
||||
SELECT ae.anidbid, ae.episode_no,
|
||||
ae.airdate, ae.episode_title
|
||||
FROM anidb_episodes ae
|
||||
WHERE ae.anidbid = %d
|
||||
AND ae.episode_no = %d',
|
||||
$anidbId,
|
||||
$episode
|
||||
)
|
||||
sprintf('
|
||||
SELECT ae.anidbid, ae.episode_no,
|
||||
ae.airdate, ae.episode_title
|
||||
FROM anidb_episodes ae
|
||||
WHERE ae.anidbid = %d
|
||||
AND ae.episode_no = %d',
|
||||
$anidbId,
|
||||
$episode
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -146,22 +148,27 @@ class AniDB
|
||||
*/
|
||||
private function extractTitleEpisode($cleanName = '')
|
||||
{
|
||||
if (preg_match('/(^|.*\")(\[[a-zA-Z\.\!?-]+\][\s_]*)?(\[BD\][\s_]*)?(\[\d{3,4}[ip]\][\s_]*)?(?P<title>[\w\s_.+!?\'-\(\)]+)(New Edit|(Blu-?ray)?( ?Box)?( ?Set)?)?([ _]-[ _]|([ ._-]Epi?(sode)?[ ._-]?0?)?[ ._-]?|[ ._-]Vol\.|[ ._-]E)(?P<epno>\d{1,3}|Movie|O[VA]{2}|Complete Series)(v\d|-\d+)?[-_. ].*[\[\(\"]/i',
|
||||
$cleanName,
|
||||
$matches)
|
||||
$cleanName = str_replace('_', ' ', $cleanName);
|
||||
|
||||
if (preg_match('/(^|.*\")(\[[a-zA-Z\.\!?-]+\][\s_]*)?(\[BD\][\s_]*)?(\[\d{3,4}[ip]\][\s_]*)?(?P<title>[\w\s_.+!?\'-\(\)]+)(New Edit|(Blu-?ray)?( ?Box)?( ?Set)?)?([ _]-[ _]|([ ._-]Epi?(sode)?[ ._-]?0?)?[ ._-]?|[ ._-]Vol\.|[ ._-]E)(?P<epno>\d{1,3}|Movie|OVA|Complete Series)(v\d|-\d+)?[-_. ].*[\[\(\"]/i',
|
||||
$cleanName,
|
||||
$matches)
|
||||
) {
|
||||
$matches['epno'] = (int)$matches['epno'];
|
||||
if (in_array($matches['epno'], ['Movie', 'OVA'])) {
|
||||
$matches['epno'] = (int)1;
|
||||
$matches['epno'] = 1;
|
||||
}
|
||||
} else if (preg_match('/^(\[[a-zA-Z\.\-!?]+\][\s_]*)?(\[BD\])?(\[\d{3,4}[ip]\])?(?P<title>[\w\s_.+!?\'-\(\)]+)(New Edit|(Blu-?ray)?( ?Box)?( ?Set)?)?\s*[\(\[](BD|\d{3,4}[ipx])/i',
|
||||
$cleanName,
|
||||
$matches)
|
||||
$cleanName,
|
||||
$matches)
|
||||
) {
|
||||
$matches['epno'] = (int)1;
|
||||
$matches['epno'] = 1;
|
||||
} else {
|
||||
if (NN_DEBUG) {
|
||||
$this->pdo->log->doEcho(PHP_EOL . "Could not parse searchname {$cleanName}.", true);
|
||||
$this->pdo->log->doEcho(
|
||||
PHP_EOL . "Could not parse searchname {$cleanName}.",
|
||||
true
|
||||
);
|
||||
}
|
||||
$this->status = self::PROC_EXTFAIL;
|
||||
}
|
||||
@@ -183,12 +190,12 @@ class AniDB
|
||||
private function getAnidbByName($searchName = '')
|
||||
{
|
||||
return $this->pdo->queryOneRow(
|
||||
sprintf("
|
||||
SELECT at.anidbid, at.title
|
||||
FROM anidb_titles AS at
|
||||
WHERE at.title %s",
|
||||
$this->pdo->likeString($searchName, true, true)
|
||||
)
|
||||
sprintf("
|
||||
SELECT at.anidbid, at.title
|
||||
FROM anidb_titles AS at
|
||||
WHERE at.title %s",
|
||||
$this->pdo->likeString($searchName, true, true)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -211,8 +218,8 @@ class AniDB
|
||||
if (is_array($cleanArr) && isset($cleanArr['title']) && is_numeric($cleanArr['epno'])) {
|
||||
|
||||
echo $this->pdo->log->header(PHP_EOL . "Looking Up: ") .
|
||||
$this->pdo->log->primary(" Title: {$cleanArr['title']}" . PHP_EOL .
|
||||
" Episode: {$cleanArr['epno']}");
|
||||
$this->pdo->log->primary(" Title: {$cleanArr['title']}" . PHP_EOL .
|
||||
" Episode: {$cleanArr['epno']}");
|
||||
|
||||
// get anidb number for the title of the name
|
||||
$anidbId = $this->getAnidbByName($cleanArr['title']);
|
||||
@@ -231,37 +238,39 @@ class AniDB
|
||||
$this->padb->populateTable('info', $anidbId['anidbid']);
|
||||
$this->doRandomSleep();
|
||||
$updatedAni = $this->checkAniDBInfo($anidbId['anidbid']);
|
||||
$type = 'Remote';
|
||||
$type = 'Remote';
|
||||
} else {
|
||||
echo PHP_EOL .
|
||||
$this->pdo->log->info("This AniDB ID was not found to be accurate locally, but has been updated too recently to check AniDB.") .
|
||||
PHP_EOL;
|
||||
$this->pdo->log->info("This AniDB ID was not found to be accurate locally, but has been updated too recently to check AniDB.") .
|
||||
PHP_EOL;
|
||||
}
|
||||
}
|
||||
|
||||
$this->updateRelease($anidbId['anidbid'], $release['id']);
|
||||
|
||||
$this->pdo->log->doEcho(
|
||||
$this->pdo->log->headerOver("Matched {$type} AniDB ID: ") .
|
||||
$this->pdo->log->primary($anidbId['anidbid']) .
|
||||
$this->pdo->log->alternateOver(" Title: ") .
|
||||
$this->pdo->log->primary($anidbId['title']) .
|
||||
$this->pdo->log->alternateOver(" Episode #: ") .
|
||||
$this->pdo->log->primary($cleanArr['epno']) .
|
||||
$this->pdo->log->alternateOver(" Episode Title: ") .
|
||||
$this->pdo->log->primary($updatedAni['episode_title'])
|
||||
$this->pdo->log->headerOver("Matched {$type} AniDB ID: ") .
|
||||
$this->pdo->log->primary($anidbId['anidbid']) .
|
||||
$this->pdo->log->alternateOver(" Title: ") .
|
||||
$this->pdo->log->primary($anidbId['title']) .
|
||||
$this->pdo->log->alternateOver(" Episode #: ") .
|
||||
$this->pdo->log->primary($cleanArr['epno']) .
|
||||
$this->pdo->log->alternateOver(" Episode Title: ") .
|
||||
$this->pdo->log->primary($updatedAni['episode_title'])
|
||||
);
|
||||
|
||||
$matched = true;
|
||||
} else {
|
||||
if (NN_DEBUG) {
|
||||
$this->pdo->log->doEcho(PHP_EOL .
|
||||
"Could not match searchname: {$release['searchname']}.",
|
||||
true);
|
||||
$this->pdo->log->doEcho(
|
||||
PHP_EOL . "Could not match searchname: {$release['searchname']}.",
|
||||
true
|
||||
);
|
||||
}
|
||||
$this->status = self::PROC_NOMATCH;
|
||||
}
|
||||
}
|
||||
|
||||
return $matched;
|
||||
}
|
||||
|
||||
@@ -272,13 +281,13 @@ class AniDB
|
||||
private function updateRelease($anidbId, $relId)
|
||||
{
|
||||
$this->pdo->queryExec(
|
||||
sprintf("
|
||||
UPDATE releases
|
||||
SET anidbid = %d
|
||||
WHERE id = %d",
|
||||
$anidbId,
|
||||
$relId
|
||||
)
|
||||
sprintf("
|
||||
UPDATE releases
|
||||
SET anidbid = %d
|
||||
WHERE id = %d",
|
||||
$anidbId,
|
||||
$relId
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -292,13 +301,13 @@ class AniDB
|
||||
private function updateTimeCheck($anidbId)
|
||||
{
|
||||
return $this->pdo->queryOneRow(
|
||||
sprintf("
|
||||
SELECT anidbid
|
||||
FROM anidb_info ai
|
||||
WHERE DATEDIFF(NOW(), ai.updated) < 7
|
||||
AND ai.anidbid = %d",
|
||||
$anidbId
|
||||
)
|
||||
sprintf("
|
||||
SELECT anidbid
|
||||
FROM anidb_info ai
|
||||
WHERE ai.updated < (NOW() - INTERVAL 7 DAY)
|
||||
AND ai.anidbid = %d",
|
||||
$anidbId
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user