113 lines
3.9 KiB
PHP
113 lines
3.9 KiB
PHP
<?php
|
||
|
||
namespace App\Console\Commands;
|
||
|
||
use App\Models\Episode;
|
||
use App\Models\Season;
|
||
use App\Models\Subtitle;
|
||
use Illuminate\Console\Command;
|
||
use Illuminate\Support\Facades\DB;
|
||
|
||
/**
|
||
* FixSubtitleMismatch
|
||
*
|
||
* Anizium altyazı bug'ı: episode 1'in altyazısı diğer bölümlere yanlışlıkla kaydedilmiş olabilir.
|
||
* Altyazı URL'sindeki name=s1_b1_XX parametresini kontrol eder; yanlış bölüme işaret edenleri siler.
|
||
*
|
||
* Kullanım:
|
||
* php artisan animexe:fix-subtitles # Yanlış altyazıları sil
|
||
* php artisan animexe:fix-subtitles --dry-run # Sadece listele
|
||
* php artisan animexe:fix-subtitles --anime-id=42 # Sadece bu anime
|
||
*/
|
||
class FixSubtitleMismatch extends Command
|
||
{
|
||
protected $signature = 'animexe:fix-subtitles
|
||
{--dry-run : Silmeden önce listele}
|
||
{--anime-id= : Sadece bu anime_id\'yi kontrol et}';
|
||
|
||
protected $description = 'Anizium altyazı bölüm uyuşmazlığı bug\'ını düzelt (name parametresi yanlış episode\'a işaret eden altyazıları sil)';
|
||
|
||
public function handle(): int
|
||
{
|
||
$dryRun = $this->option('dry-run');
|
||
$animeId = $this->option('anime-id');
|
||
|
||
$this->info("Anizium Altyazı Uyuşmazlık Düzeltici");
|
||
$this->info("=====================================");
|
||
if ($dryRun) $this->warn("DRY-RUN modu — hiçbir şey silinmeyecek");
|
||
|
||
$query = Subtitle::query()
|
||
->join('episodes', 'subtitles.episode_id', '=', 'episodes.id')
|
||
->join('seasons', 'seasons.id', '=', 'episodes.season_id')
|
||
->whereNotNull('subtitles.url')
|
||
->where('subtitles.url', 'like', '%anizium%')
|
||
->select(
|
||
'subtitles.id as subtitle_id',
|
||
'subtitles.episode_id',
|
||
'subtitles.language',
|
||
'subtitles.url',
|
||
'seasons.season_number',
|
||
'episodes.episode_number',
|
||
'episodes.anime_id',
|
||
);
|
||
|
||
if ($animeId) {
|
||
$query->where('episodes.anime_id', (int) $animeId);
|
||
}
|
||
|
||
$subtitles = $query->get();
|
||
$this->info("Kontrol edilecek Anizium altyazısı: {$subtitles->count()}");
|
||
|
||
$mismatchIds = [];
|
||
|
||
foreach ($subtitles as $sub) {
|
||
$url = $sub->url;
|
||
$season = (int) $sub->season_number;
|
||
$episode = (int) $sub->episode_number;
|
||
$lang = $sub->language;
|
||
|
||
// URL'den name parametresini çıkar
|
||
$parsed = parse_url($url);
|
||
if (!isset($parsed['query'])) continue;
|
||
|
||
parse_str($parsed['query'], $params);
|
||
$name = $params['name'] ?? '';
|
||
|
||
if (!$name) continue;
|
||
|
||
// Beklenen: s{season}_b{episode}_{lang}
|
||
$expectedPrefix = "s{$season}_b{$episode}_";
|
||
if (!str_starts_with($name, $expectedPrefix)) {
|
||
$mismatchIds[] = $sub->subtitle_id;
|
||
$this->line(
|
||
"[MISMATCH] sub_id={$sub->subtitle_id} "
|
||
. "anime_id={$sub->anime_id} "
|
||
. "S{$season}E{$episode} {$lang} "
|
||
. "| name={$name} "
|
||
. "(beklenen prefix: {$expectedPrefix})"
|
||
);
|
||
}
|
||
}
|
||
|
||
$this->newLine();
|
||
$this->info("Uyuşmazlık bulunan: " . count($mismatchIds));
|
||
|
||
if (empty($mismatchIds)) {
|
||
$this->info("Düzeltilecek altyazı bulunamadı.");
|
||
return 0;
|
||
}
|
||
|
||
if ($dryRun) {
|
||
$this->warn("--dry-run: {" . count($mismatchIds) . "} altyazı silinecekti.");
|
||
return 0;
|
||
}
|
||
|
||
$deleted = Subtitle::whereIn('id', $mismatchIds)->delete();
|
||
$this->info("Silindi: {$deleted} yanlış altyazı.");
|
||
$this->info("Botları yeniden çalıştırarak doğru altyazıları yeniden indirebilirsiniz.");
|
||
$this->info(" python anizium_scraper/bot2_upload.py --daemon");
|
||
|
||
return 0;
|
||
}
|
||
}
|