AniDB code cleanup, ported from nZEDb

This commit is contained in:
DariusIII
2016-06-08 09:14:56 +02:00
parent 6ea32b2c44
commit dddf4614cc
6 changed files with 364 additions and 188 deletions
+2
View File
@@ -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
View File
@@ -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
View File
@@ -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;
}
+86 -76
View File
@@ -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
)
);
+145
View File
@@ -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;
}
}
+87 -78
View File
@@ -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
)
);
}
}