import 'dart:async'; import 'dart:io'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../cekirdek/log.dart'; /// WanGP Standalone başlatma + port kontrolü. /// Port: 7861 (LTX Desktop port 8001'den ayrı — paralel çalışabilir). class WanGpBaslatici { static const _bat = r'D:\__sistem__\Masaustu\FikoYT.Yeni.Cag\video-uretim\WanGP-Standalone-Baslat.bat'; static const port = 7861; static Future calisiyorMu({int port = port}) async { try { final s = await Socket.connect( '127.0.0.1', port, timeout: const Duration(milliseconds: 500), ); s.destroy(); return true; } catch (_) { return false; } } static Future baslat() async { if (await calisiyorMu()) { Log.bilgi('WanGp', 'Standalone zaten çalışıyor (7861)'); return; } if (!await File(_bat).exists()) { throw Exception('Bat bulunamadı: $_bat'); } Log.bilgi('WanGp', 'Standalone başlatılıyor'); await Process.start('cmd', ['/c', 'start', '""', _bat], mode: ProcessStartMode.detached, runInShell: true); } static Future portaErisilebilirOlanaKadarBekle({ Duration zaman = const Duration(minutes: 5), }) async { final son = DateTime.now().add(zaman); while (DateTime.now().isBefore(son)) { if (await calisiyorMu()) return true; await Future.delayed(const Duration(seconds: 2)); } return false; } } class WanGpDurum { final bool calisiyor; final String url; final String? hata; const WanGpDurum({ required this.calisiyor, required this.url, this.hata, }); static const yok = WanGpDurum( calisiyor: false, url: 'http://127.0.0.1:7861', ); WanGpDurum kopyala({bool? calisiyor, String? url, String? hata}) => WanGpDurum( calisiyor: calisiyor ?? this.calisiyor, url: url ?? this.url, hata: hata, ); } class WanGpNotifier extends StateNotifier { WanGpNotifier() : super(WanGpDurum.yok) { _periyodikKontrol(); } Timer? _timer; void _periyodikKontrol() { _timer = Timer.periodic(const Duration(seconds: 3), (_) async { final ok = await WanGpBaslatici.calisiyorMu(); if (ok != state.calisiyor) { state = state.kopyala(calisiyor: ok, hata: ok ? null : state.hata); } }); } Future baslat() async { try { await WanGpBaslatici.baslat(); final ok = await WanGpBaslatici.portaErisilebilirOlanaKadarBekle(); state = state.kopyala( calisiyor: ok, hata: ok ? null : 'WanGP açılmadı (timeout)'); } catch (e) { state = state.kopyala(hata: e.toString()); } } @override void dispose() { _timer?.cancel(); super.dispose(); } } final wangpProvider = StateNotifierProvider((ref) => WanGpNotifier());