Files
2026-07-14 00:01:48 +03:00

63 lines
2.0 KiB
PHP

<?php
namespace App\Console\Commands;
use App\Models\Anime;
use App\Services\JikanService;
use Illuminate\Console\Command;
class FetchMalIds extends Command
{
protected $signature = 'animexe:fetch-mal-ids {--force : Overwrite existing MAL IDs}';
protected $description = 'Auto-fetch MAL IDs for all animes and fill season mal_id chain via Jikan API';
public function handle(): int
{
$jikan = new JikanService();
$query = Anime::query();
if (!$this->option('force')) {
$query->whereNull('mal_id');
}
$animes = $query->get();
$this->info("Processing {$animes->count()} anime(s)…");
$bar = $this->output->createProgressBar($animes->count());
$bar->start();
$found = 0;
foreach ($animes as $anime) {
try {
if (!$anime->mal_id || $this->option('force')) {
$malId = $jikan->searchMalId($anime->title, $anime->title_en, $anime->title_jp, $anime->type);
if ($malId) {
$anime->update(['mal_id' => $malId]);
$found++;
}
usleep(400_000); // rate limit
}
// Fill season chain
if ($anime->mal_id) {
$chain = $jikan->fetchSeasonMalIds($anime->mal_id);
foreach ($anime->seasons()->orderBy('season_number')->get() as $i => $season) {
if (!$season->mal_id && isset($chain[$i])) {
$season->update(['mal_id' => $chain[$i]]);
}
}
}
} catch (\Throwable $e) {
$this->newLine();
$this->warn(" ⚠ [{$anime->title}]: {$e->getMessage()}");
}
$bar->advance();
}
$bar->finish();
$this->newLine();
$this->info("Done. {$found} new MAL ID(s) fetched.");
return 0;
}
}