133 lines
6.6 KiB
PHP
133 lines
6.6 KiB
PHP
<?php
|
||
|
||
namespace App\Console\Commands;
|
||
|
||
use App\Models\ImportJob;
|
||
use App\Models\Anime;
|
||
use Illuminate\Console\Command;
|
||
use Illuminate\Support\Str;
|
||
|
||
/**
|
||
* CreateCrossImportJobs
|
||
*
|
||
* Yayınlanan animeler için çapraz kaynak job'ları oluşturur:
|
||
* • Anizium import'u olan ama AnimeCix import'u olmayan anime → AnimeCix job (watch_id bilgisi Python'dan)
|
||
* • AnimeCix import'u olan ama Anizium import'u olmayan anime → Anizium job (watch_id bilgisi job'lardan)
|
||
* • Her iki kaynakta da done job'u olan anime → bölüm bazlı video_sources yenileme için
|
||
* yeni job (done job'u "pending" yaparak botu yeniden çalıştırır)
|
||
*
|
||
* Kullanım:
|
||
* php artisan animexe:cross-import # İki kaynakta da eksik job'ları oluştur
|
||
* php artisan animexe:cross-import --force # Var olan done job'larını da yeniden kuyruğa al
|
||
* php artisan animexe:cross-import --only=anizium # Sadece Anizium job'larını oluştur
|
||
* php artisan animexe:cross-import --only=animecix # Sadece AnimeCix job'larını oluştur
|
||
*/
|
||
class CreateCrossImportJobs extends Command
|
||
{
|
||
protected $signature = 'animexe:cross-import
|
||
{--force : Mevcut done job\'larını yeniden pending yap}
|
||
{--only= : Sadece belirtilen kaynağı oluştur (anizium|animecix)}
|
||
{--dry-run : Job oluşturmadan listele}';
|
||
|
||
protected $description = 'Mevcut animeler için eksik kaynak job\'larını oluşturur (Anizium ↔ AnimeCix çapraz import)';
|
||
|
||
public function handle(): int
|
||
{
|
||
$force = $this->option('force');
|
||
$only = $this->option('only');
|
||
$dryRun = $this->option('dry-run');
|
||
|
||
$this->info("Animexe Çapraz Import Job Oluşturucu");
|
||
$this->info("====================================");
|
||
|
||
// Tüm yayınlanan animeleri job durumlarıyla al
|
||
$animes = Anime::where('is_published', true)
|
||
->with('importJobs')
|
||
->get();
|
||
|
||
$this->info("Toplam yayınlanan anime: {$animes->count()}");
|
||
|
||
$aniziumCreated = 0;
|
||
$animecixCreated = 0;
|
||
$skipped = 0;
|
||
$requeued = 0;
|
||
|
||
foreach ($animes as $anime) {
|
||
$jobs = $anime->importJobs;
|
||
$aniziumJobs = $jobs->where('source', 'anizium');
|
||
$animecixJobs = $jobs->where('source', 'animecix');
|
||
|
||
$hasAniziumDone = $aniziumJobs->where('status', 'done')->isNotEmpty();
|
||
$hasAnimecixDone = $animecixJobs->where('status', 'done')->isNotEmpty();
|
||
$hasAniziumAny = $aniziumJobs->whereIn('status', ['pending','fetching','downloading','uploading','done'])->isNotEmpty();
|
||
$hasAnimecixAny = $animecixJobs->whereIn('status', ['pending','fetching','downloading','uploading','done'])->isNotEmpty();
|
||
|
||
// ── Re-queue: ikisi de done olan animeleri yeniden işlet ──────────
|
||
if ($force && $hasAniziumDone && $hasAnimecixDone) {
|
||
if (!$dryRun) {
|
||
// En son done Anizium job'unu yeniden pending yap
|
||
$aj = $aniziumJobs->where('status', 'done')->sortByDesc('id')->first();
|
||
if ($aj) {
|
||
$aj->update(['status' => 'pending', 'done_episodes' => 0, 'error_log' => null, 'current_step' => 'Çapraz re-import']);
|
||
}
|
||
// En son done AnimeCix job'unu yeniden pending yap
|
||
$cj = $animecixJobs->where('status', 'done')->sortByDesc('id')->first();
|
||
if ($cj) {
|
||
$cj->update(['status' => 'pending', 'done_episodes' => 0, 'error_log' => null, 'current_step' => 'Çapraz re-import']);
|
||
}
|
||
$requeued++;
|
||
} else {
|
||
$this->line("[DRY] Re-queue: {$anime->title} (her iki kaynak mevcut)");
|
||
}
|
||
continue;
|
||
}
|
||
|
||
// ── Anizium job oluştur ───────────────────────────────────────────
|
||
if ((!$only || $only === 'anizium') && !$hasAniziumAny) {
|
||
// Anizium watch_id'yi bilmiyoruz — Python reimport_all.py bu görevi üstlenir.
|
||
// Buradan sadece anime_id'yi atayarak "ihtiyaç listesi" oluşturabiliriz;
|
||
// watch_id olmadan bot job'ı işleyemez. Bu yüzden sadece logluyoruz.
|
||
$this->warn("[SKIP-ANİZİUM] {$anime->title} (watch_id bilinmiyor — reimport_all.py kullan)");
|
||
$skipped++;
|
||
}
|
||
|
||
// ── AnimeCix job oluştur ──────────────────────────────────────────
|
||
if ((!$only || $only === 'animecix') && !$hasAnimecixAny) {
|
||
// animecix_title_id'yi bilmiyoruz — daemon.py bunu otomatik keşfeder.
|
||
$this->warn("[SKIP-ANİMECİX] {$anime->title} (title_id bilinmiyor — daemon.py kullan)");
|
||
$skipped++;
|
||
}
|
||
|
||
// ── Anizium'u olan ama AnimeCix'i olmayan: Anizium job'larından watch_id var ──
|
||
// ─ (bu zaten mevcut) ─
|
||
|
||
// ── AnimeCix'i olan ama Anizium'u olmayan: watch_id bilinmiyorsa skip ──
|
||
if ((!$only || $only === 'anizium') && $hasAnimecixDone && !$hasAniziumAny) {
|
||
// AnimeCix'te var ama Anizium'da yok — reimport_all.py Anizium katalogunda arayacak
|
||
$this->line("[ANİZİUM-GEREKLİ] {$anime->title} (MAL: {$anime->mal_id}) — reimport_all.py işleyecek");
|
||
}
|
||
|
||
// ── Anizium'u olan ama AnimeCix'i olmayan: daemon.py katalog taramasında otomatik bulur ──
|
||
if ((!$only || $only === 'animecix') && $hasAniziumDone && !$hasAnimecixAny) {
|
||
$this->line("[ANİMECİX-GEREKLİ] {$anime->title} (MAL: {$anime->mal_id}) — daemon.py bulacak");
|
||
}
|
||
}
|
||
|
||
// ── Var olan Anizium done job'larını yeniden pending yap (--force) ───
|
||
if ($force && !$dryRun) {
|
||
$this->info("Re-queue tamamlandı: {$requeued} anime");
|
||
}
|
||
|
||
$this->newLine();
|
||
$this->info("Özet:");
|
||
$this->info(" Anizium job oluşturuldu : {$aniziumCreated}");
|
||
$this->info(" AnimeCix job oluşturuldu: {$animecixCreated}");
|
||
$this->info(" Yeniden kuyruğa alındı : {$requeued}");
|
||
$this->info(" Atlandı (watch_id yok) : {$skipped}");
|
||
$this->newLine();
|
||
$this->info("Tüm anime + kaynak eşleştirmesi için: python reimport_all.py");
|
||
|
||
return 0;
|
||
}
|
||
}
|