// Uçtan uca doğrulama: gerçek workflow kodu → ComfyUI → mp3 indirme. // Çalıştırma: dart run tool/e2e_muzik.dart import 'dart:convert'; import 'dart:io'; import '../lib/comfy/workflow/muzik_workflow.dart'; Future main() async { const base = 'http://127.0.0.1:8188'; final http = HttpClient(); final p = MuzikParametreleri( tags: 'instrumental, lo-fi, chill, relaxing, 90 bpm', lyrics: '', seed: 12345, bpm: 90, sureSn: 10, steps: 8, ); final workflow = muzikWorkflowOlustur(p); Future> post(String yol, Map govde) async { final istek = await http.postUrl(Uri.parse('$base$yol')); istek.headers.contentType = ContentType.json; istek.write(jsonEncode(govde)); final cevap = await istek.close(); final metin = await cevap.transform(utf8.decoder).join(); return jsonDecode(metin) as Map; } Future> get(String yol) async { final istek = await http.getUrl(Uri.parse('$base$yol')); final cevap = await istek.close(); final metin = await cevap.transform(utf8.decoder).join(); return jsonDecode(metin) as Map; } print('Workflow gonderiliyor...'); final sonuc = await post('/prompt', { 'prompt': workflow, 'client_id': 'fikoyt-e2e', }); if (sonuc['error'] != null) { print('HATA: ${jsonEncode(sonuc)}'); exit(1); } final promptId = sonuc['prompt_id'] as String; print('prompt_id: $promptId — bekleniyor...'); for (var i = 0; i < 120; i++) { await Future.delayed(const Duration(seconds: 3)); final hist = await get('/history/$promptId'); final kayit = hist[promptId] as Map?; if (kayit == null) continue; final status = kayit['status'] as Map?; final tamam = status?['completed'] == true; final durumStr = status?['status_str']; if (durumStr == 'error') { print('URETIM HATASI: ${jsonEncode(status)}'); exit(1); } if (tamam) { final outputs = kayit['outputs'] as Map; print('TAMAMLANDI. outputs: ${jsonEncode(outputs)}'); for (final nodeOut in outputs.values) { final audio = (nodeOut as Map)['audio']; if (audio is List) { for (final a in audio) { final dosyaAdi = a['filename'] as String; final alt = (a['subfolder'] as String?) ?? ''; final uri = Uri.parse( '$base/view?filename=${Uri.encodeComponent(dosyaAdi)}&subfolder=${Uri.encodeComponent(alt)}&type=output'); final istek = await http.getUrl(uri); final cevap = await istek.close(); final bytes = await cevap .fold>([], (acc, parca) => acc..addAll(parca)); final hedef = File('e2e_cikti.mp3'); await hedef.writeAsBytes(bytes); print('INDIRILDI: ${hedef.absolute.path} (${bytes.length} bayt)'); } } } exit(0); } } print('ZAMAN ASIMI'); exit(1); }