import 'package:freezed_annotation/freezed_annotation.dart'; import 'enums.dart'; import 'karakter_kilidi.dart'; import 'uretim_ayari.dart'; part 'sahne.freezed.dart'; part 'sahne.g.dart'; /// Bir filmin tek sahnesi — prompt + süre + üretim ayarı override'ı. @freezed class Sahne with _$Sahne { const factory Sahne({ required String id, @Default(0) int sira, @Default(SahneTipi.video) SahneTipi tipi, @Default('') String prompt, @Default('') String negativePrompt, /// Süre kuralı: WanGP modeline göre 5/6/8/10/20 sn'den biri. @Default(5) int sureSn, // ─── Girdi ─────────────────────────────────────────────────────────── String? girisGorselYolu, String? sesParcaYolu, double? sesBaslangic, double? sesBitis, // ─── Override ──────────────────────────────────────────────────────── UretimAyari? ayarOverride, KarakterKilidi? kilitOverride, // ─── Çıktı ─────────────────────────────────────────────────────────── String? sonKareYolu, // Laplacian best-frame String? videoYolu, @Default([]) List varyantYollari, EnerjiSeviyesi? enerji, @Default(SahneDurum.bos) SahneDurum durum, @Default(0.0) double ilerleme, // 0..1 // ─── Aktif post-processing rozetleri ──────────────────────────────── @Default(false) bool faceSwapAktif, @Default(false) bool faceRestoreAktif, @Default(false) bool lipsyncAktif, @Default(false) bool vokalAyirmaAktif, String? notlar, @Default([]) List hatalar, required DateTime olusturma, required DateTime guncelleme, }) = _Sahne; factory Sahne.fromJson(Map j) => _$SahneFromJson(j); factory Sahne.bos({required String id, int sira = 0}) => Sahne( id: id, sira: sira, olusturma: DateTime.now(), guncelleme: DateTime.now(), ); }