import 'dart:io'; import 'package:csv/csv.dart'; import '../cekirdek/log.dart'; import '../modeller/proje.dart'; import 'proje_deposu.dart'; import 'segment_olusturucu.dart'; /// CSV format: /// proje_ismi,ses_dosyasi,gorsel_dosyasi,prompt,segment_suresi,cozunurluk class CsvSatiri { final String projeIsmi; final String? sesDosyasi; final String? gorselDosyasi; final String? prompt; final int segmentSuresi; final String cozunurluk; final String oran; CsvSatiri({ required this.projeIsmi, this.sesDosyasi, this.gorselDosyasi, this.prompt, this.segmentSuresi = 20, this.cozunurluk = '540p', this.oran = '16:9', }); } class CsvTopluImport { static Future> oku(String csvDosyaYolu) async { final str = await File(csvDosyaYolu).readAsString(); final satirlar = const CsvToListConverter( eol: '\n', shouldParseNumbers: false, ).convert(str); if (satirlar.isEmpty) return []; final basliklar = satirlar[0].map((e) => e.toString().toLowerCase()).toList(); int idx(String ad) => basliklar.indexOf(ad); final pIdx = idx('proje_ismi'); final sIdx = idx('ses_dosyasi'); final gIdx = idx('gorsel_dosyasi'); final prIdx = idx('prompt'); final suIdx = idx('segment_suresi'); final czIdx = idx('cozunurluk'); final orIdx = idx('oran'); final sonuc = []; for (int i = 1; i < satirlar.length; i++) { final r = satirlar[i]; String? al(int i) => i >= 0 && i < r.length ? (r[i].toString().trim().isEmpty ? null : r[i].toString().trim()) : null; if (pIdx < 0 || pIdx >= r.length) continue; final isim = r[pIdx].toString().trim(); if (isim.isEmpty) continue; sonuc.add(CsvSatiri( projeIsmi: isim, sesDosyasi: sIdx >= 0 ? al(sIdx) : null, gorselDosyasi: gIdx >= 0 ? al(gIdx) : null, prompt: prIdx >= 0 ? al(prIdx) : null, segmentSuresi: suIdx >= 0 ? int.tryParse(al(suIdx) ?? '20') ?? 20 : 20, cozunurluk: czIdx >= 0 ? (al(czIdx) ?? '540p') : '540p', oran: orIdx >= 0 ? (al(orIdx) ?? '16:9') : '16:9', )); } return sonuc; } static Future> projeleriOlustur({ required List satirlar, void Function(int, int, String)? ilerleme, }) async { final sonuc = []; for (int i = 0; i < satirlar.length; i++) { final r = satirlar[i]; ilerleme?.call(i + 1, satirlar.length, r.projeIsmi); try { var proje = await ProjeDeposu.projeOlustur( isim: r.projeIsmi, sesPath: r.sesDosyasi, girisGorseliPath: r.gorselDosyasi, ); // Global ayarları güncelle proje = proje.copyWith( global: proje.global.copyWith( segmentSuresi: r.segmentSuresi, cozunurluk: r.cozunurluk, oran: r.oran, varsayilanPrompt: r.prompt ?? proje.global.varsayilanPrompt, ), ); // Segmentleri otomatik oluştur if (r.sesDosyasi != null) { proje = await SegmentOlusturucu.otomatikSegmentleriOlustur(proje); } await ProjeDeposu.kaydet(proje); sonuc.add(proje); } catch (e) { Log.hata('CsvImport', 'Satır $i hata: $e'); } } return sonuc; } /// Örnek CSV şablonu static String ornekSablon() { return 'proje_ismi,ses_dosyasi,gorsel_dosyasi,prompt,segment_suresi,cozunurluk,oran\n' 'Ornek1,C:\\sarki1.mp3,C:\\gorsel1.png,cinematic dawn scene,20,540p,16:9\n' 'Ornek2,,,prompt only project,10,720p,9:16\n'; } }