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

133 lines
6.6 KiB
PHP
Raw 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\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;
}
}