Files
animexe/app/Console/Commands/FixSubtitleMismatch.php
2026-07-14 00:01:48 +03:00

113 lines
3.9 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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;
}
}