import 'dart:io'; import 'package:path/path.dart' as p; import '../cekirdek/log.dart'; /// ACE-Step çıktı klasöründe son üretilen ses dosyalarını listeler ve /// projeye kopyalama yardımcısı sağlar. class AceStepAktarici { static const _ciktiKlasoru = r'D:\__sistem__\Masaustu\FikoYT.Yeni.Cag\video-uretim\ace-step\outputs'; /// ACE-Step output klasöründeki son N ses dosyasını döner (en yeni önce). static Future> sonUretilen({int n = 20}) async { final dir = Directory(_ciktiKlasoru); if (!await dir.exists()) { Log.uyari('AceStep', 'Çıktı klasörü yok: $_ciktiKlasoru'); return []; } final dosyalar = []; await for (final ent in dir.list(recursive: true)) { if (ent is File && (ent.path.endsWith('.wav') || ent.path.endsWith('.mp3') || ent.path.endsWith('.flac'))) { dosyalar.add(ent); } } dosyalar.sort((a, b) => b.statSync().modified.compareTo(a.statSync().modified)); return dosyalar.take(n).toList(); } /// Bir ACE-Step çıktısının metadata'sı (varsa, yan dosyada JSON) static Future metadataAciklamasi(File sesDosyasi) async { final base = p.basenameWithoutExtension(sesDosyasi.path); final candid = [ File(p.join(p.dirname(sesDosyasi.path), '$base.json')), File(p.join(p.dirname(sesDosyasi.path), '$base.txt')), ]; for (final c in candid) { if (await c.exists()) { try { final str = await c.readAsString(); return str.length > 200 ? '${str.substring(0, 200)}...' : str; } catch (_) {} } } return null; } }