Update Anidb related classes and models

This commit is contained in:
DariusIII
2018-01-05 14:06:07 +01:00
parent 56e142cc07
commit 4d137a0388
4 changed files with 63 additions and 117 deletions
+1
View File
@@ -1,4 +1,5 @@
2018-01-05 DariusIII
* Chg: Update Anidb related classes and models
* Chg: Remove nntmux/PreDb class and move its functions into Predb model
* Chg: Update ConsoleTools class and related scripts
* Chg: Update Forking and postprocess.php
+3
View File
@@ -3,9 +3,12 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Yadakhov\InsertOnDuplicateKey;
class AnidbEpisode extends Model
{
use InsertOnDuplicateKey;
/**
* @var bool
*/
+3
View File
@@ -3,9 +3,12 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Yadakhov\InsertOnDuplicateKey;
class AnidbTitle extends Model
{
use InsertOnDuplicateKey;
/**
* @var string
*/
+56 -117
View File
@@ -2,8 +2,9 @@
namespace nntmux\db\populate;
use nntmux\db\DB;
use Carbon\Carbon;
use App\Models\AnidbInfo;
use App\Models\AnidbTitle;
use Illuminate\Support\Carbon;
use nntmux\ColorCLI;
use App\Models\Settings;
use nntmux\ReleaseImage;
@@ -11,7 +12,7 @@ use App\Models\AnidbEpisode;
class AniDB
{
const CLIENT_VERSION = 2;
private const CLIENT_VERSION = 2;
/**
* Whether or not to echo message output.
@@ -25,17 +26,6 @@ class AniDB
*/
public $imgSavePath;
/**
* @var DB
*/
public $pdo;
/**
* The AniDB ID we are looking up.
* @var bool
*/
private $anidbId;
/**
* The name of the nZEDb client for AniDB lookups.
* @var string
@@ -74,7 +64,6 @@ class AniDB
$options += $defaults;
$this->echooutput = ($options['Echo'] && NN_ECHOCLI);
$this->pdo = ($options['Settings'] instanceof DB ? $options['Settings'] : new DB());
$anidbupdint = Settings::settingValue('APIs.AniDB.max_update_frequency');
$lastupdated = Settings::settingValue('APIs.AniDB.last_full_update');
@@ -119,21 +108,7 @@ class AniDB
*/
private function checkDuplicateDbEntry($id, $type, $lang, $title)
{
return $this->pdo->queryOneRow(
sprintf(
'
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),
$this->pdo->escapeString($title)
)
);
return AnidbTitle::query()->where(['anidbid' => $id, 'type' => $type, 'lang' => $lang, 'title' => $title])->first(['anidbid'])->toArray();
}
/**
@@ -160,10 +135,7 @@ class AniDB
echo 'AniDB: Error getting response.'.PHP_EOL;
} elseif (preg_match('/\<error\>Banned\<\/error\>/', $apiresponse)) {
$this->banned = true;
Settings::update(
['value' => time()],
['section' => 'APIs', 'subsection' => 'AniDB', 'name' => 'banned']
);
Settings::query()->where(['section' => 'APIs', 'subsection' => 'AniDB', 'name' => 'banned'])->update(['value' => 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)) {
@@ -187,7 +159,7 @@ class AniDB
foreach ($episode->title as $title) {
$xmlAttribs = $title->attributes('xml', true);
// only english, x-jat imploded episode titles for now
if (in_array($xmlAttribs->lang, ['en', 'x-jat'], false)) {
if (\in_array($xmlAttribs->lang, ['en', 'x-jat'], false)) {
$titleArray[] = $title[0];
}
}
@@ -234,7 +206,7 @@ class AniDB
$property = $property ?? 'name';
$temp = '';
if (is_object($element) && ! empty($element)) {
if (\is_object($element) && ! empty($element)) {
$result = $children === true ? $element->children() : $element;
foreach ($result as $entry) {
$temp .= (string) $entry->$property.', ';
@@ -247,6 +219,7 @@ class AniDB
/**
* Requests and returns the API data from AniDB.
*
* @param $anidbId
* @return string
*/
private function getAniDbResponse($anidbId): string
@@ -287,18 +260,7 @@ class AniDB
$check = $this->checkDuplicateDbEntry($id, $type, $lang, $title);
if ($check === false) {
$this->pdo->queryInsert(
sprintf(
'
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)
)
);
AnidbTitle::insertIgnore(['anidbid' => $id, 'type' => $type, 'lang' => $lang, 'title' => $title]);
} else {
echo ColorCLI::warning("Duplicate: $id");
}
@@ -313,29 +275,24 @@ class AniDB
*/
private function insertAniDBInfoEps(array $AniDBInfoArray = [], $anidbId): string
{
$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())',
$anidbId,
$this->pdo->escapeString($AniDBInfoArray['type']),
$this->pdo->escapeString($AniDBInfoArray['startdate']),
$this->pdo->escapeString($AniDBInfoArray['enddate']),
$this->pdo->escapeString($AniDBInfoArray['related']),
$this->pdo->escapeString($AniDBInfoArray['similar']),
$this->pdo->escapeString($AniDBInfoArray['creators']),
$this->pdo->escapeString($AniDBInfoArray['description']),
$this->pdo->escapeString($AniDBInfoArray['rating']),
$this->pdo->escapeString($AniDBInfoArray['picture']),
$this->pdo->escapeString($AniDBInfoArray['categories']),
$this->pdo->escapeString($AniDBInfoArray['characters'])
)
);
AnidbInfo::query()
->insert(
[
'anidbid' => $anidbId,
'type' => $AniDBInfoArray['type'],
'startdate' => $AniDBInfoArray['startdate'],
'enddate' => $AniDBInfoArray['enddate'],
'related' => $AniDBInfoArray['enddate'],
'similar' => $AniDBInfoArray['similar'],
'creators' => $AniDBInfoArray['creators'],
'description' => $AniDBInfoArray['description'],
'rating' => $AniDBInfoArray['rating'],
'picture' => $AniDBInfoArray['picture'],
'categories' => $AniDBInfoArray['categories'],
'characters' => $AniDBInfoArray['characters'],
'updated' => Carbon::now(),
]
);
if (! empty($AniDBInfoArray['epsarr'])) {
$this->insertAniDBEpisodes($AniDBInfoArray['epsarr'], $anidbId);
}
@@ -352,7 +309,7 @@ class AniDB
{
if (! empty($episodeArr)) {
foreach ($episodeArr as $episode) {
AnidbEpisode::query()->updateOrCreate(
AnidbEpisode::insertIgnore(
[
'anidbid' => $anidbId,
'episodeid' => $episode['episode_id'],
@@ -437,14 +394,12 @@ class AniDB
private function populateInfoTable($anidbId = '')
{
if (empty($anidbId)) {
$anidbIds = $this->pdo->query(
sprintf(
'SELECT DISTINCT at.anidbid
FROM anidb_titles at
LEFT JOIN anidb_info ai ON ai.anidbid = at.anidbid
WHERE ai.updated IS NULL'
)
);
$anidbIds = AnidbTitle::query()
->selectRaw('DISTINCT anidb_titles.anidbid')
->leftJoin('anidb_info as ai', 'ai.anidbid', '=', 'anidb_titles.anidbid')
->whereNull('ai.updated')
->get();
foreach ($anidbIds as $anidb) {
$AniDBAPIArray = $this->getAniDbAPI($anidb['anidbid']);
@@ -501,10 +456,7 @@ class AniDB
*/
private function setLastUpdated(): void
{
(new Settings)->update(
['value' => time()],
['section' => 'APIs', 'subsection' => 'AniDB', 'name' => 'last_full_update']
);
Settings::query()->where(['section' => 'APIs', 'subsection' => 'AniDB', 'name' => 'last_full_update'])->update(['value' => time()]);
}
/**
@@ -516,29 +468,24 @@ class AniDB
*/
private function updateAniDBInfoEps(array $AniDBInfoArray = [], $anidbId): string
{
$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',
$this->pdo->escapeString($AniDBInfoArray['type']),
$this->pdo->escapeString($AniDBInfoArray['startdate']),
$this->pdo->escapeString($AniDBInfoArray['enddate']),
$this->pdo->escapeString($AniDBInfoArray['related']),
$this->pdo->escapeString($AniDBInfoArray['similar']),
$this->pdo->escapeString($AniDBInfoArray['creators']),
$this->pdo->escapeString($AniDBInfoArray['description']),
$this->pdo->escapeString($AniDBInfoArray['rating']),
$this->pdo->escapeString($AniDBInfoArray['picture']),
$this->pdo->escapeString($AniDBInfoArray['categories']),
$this->pdo->escapeString($AniDBInfoArray['characters']),
$anidbId
)
);
AnidbInfo::query()
->where('anidbid', $anidbId)
->update(
[
'type' => $AniDBInfoArray['type'],
'startdate' => $AniDBInfoArray['startdate'],
'enddate' => $AniDBInfoArray['enddate'],
'related' => $AniDBInfoArray['enddate'],
'similar' => $AniDBInfoArray['similar'],
'creators' => $AniDBInfoArray['creators'],
'description' => $AniDBInfoArray['description'],
'rating' => $AniDBInfoArray['rating'],
'picture' => $AniDBInfoArray['picture'],
'categories' => $AniDBInfoArray['categories'],
'characters' => $AniDBInfoArray['characters'],
'updated' => Carbon::now(),
]
);
if (! empty($AniDBInfoArray['epsarr'])) {
$this->insertAniDBEpisodes($AniDBInfoArray['epsarr'], $anidbId);
}
@@ -554,17 +501,9 @@ class AniDB
*/
private function updateAniChildTables(array $AniDBInfoArray = [], $anidbId): void
{
$check = $this->pdo->queryOneRow(
sprintf(
'
SELECT ai.anidbid AS info
FROM anidb_info ai
WHERE ai.anidbid = %d',
$anidbId
)
);
$check = AnidbInfo::query()->where('anidbid', $anidbId)->first(['anidbid']);
if ($check === false) {
if ($check === null) {
$picture = $this->insertAniDBInfoEps($AniDBInfoArray, $anidbId);
} else {
$picture = $this->updateAniDBInfoEps($AniDBInfoArray, $anidbId);