// Video sihirbazı seçim modeli + sihirbaza özel kataloglar — saf Dart. import '../resim/nsfw_kataloglari.dart'; import '../resim/resim_kataloglari.dart'; import 'video_kataloglari.dart'; /// Video sihirbazına özel kataloglar (sahne/açı/lens/stil/palet/özne/efekt). abstract final class VideoSihirbazKataloglari { static const List sahneTurleri = [ VideoOge('muzik_video', 'Müzik Video', 'music video scene, performance energy'), VideoOge('aksiyon', 'Aksiyon', 'action scene, high stakes tension'), VideoOge('drama', 'Drama', 'dramatic emotional scene'), VideoOge('belgesel', 'Belgesel', 'documentary footage, real life'), VideoOge('dans', 'Dans', 'dance performance scene'), VideoOge('araba', 'Araba', 'automotive scene'), VideoOge('doga', 'Doğa', 'nature landscape scene'), VideoOge('dovus', 'Dövüş', 'fight scene, martial arts'), VideoOge('romantik', 'Romantik', 'romantic intimate scene'), VideoOge('korku', 'Korku', 'horror scene, unsettling'), ]; /// Sahne türüne göre özne önerileri (id → liste). Boş sahne → genel. static const Map> ozneOnerileri = { 'muzik_video': [ VideoOge('sahne_sarkici', 'Sahnede şarkıcı', 'a singer performing on stage under spotlights'), VideoOge('neon_rapci', 'Neon sokakta rapçi', 'a rapper in a neon-lit alley'), VideoOge('festival_dj', 'Festivalde DJ', 'a DJ performing at a festival, crowd jumping'), VideoOge('grup', 'Grup performansı', 'a band performing live, dynamic stage lights'), VideoOge('spot_dansci', 'Spot ışığında dansçı', 'a dancer in a single spotlight on dark stage'), ], 'aksiyon': [ VideoOge('patlama_kahraman', 'Patlamadan kaçan', 'a hero running away from an explosion'), VideoOge('cati_kovalamaca', 'Çatıda kovalamaca', 'an agent chasing across rooftops'), VideoOge('motor_kacis', 'Motosiklet kaçışı', 'a motorcycle rider weaving through traffic'), VideoOge('helikopter', 'Helikopter sahnesi', 'a helicopter hovering over a city in chaos'), ], 'drama': [ VideoOge('pencere_kadin', 'Pencerede kadın', 'a woman staring out a rain-soaked window'), VideoOge('yasli_adam', 'Yalnız yaşlı adam', 'an old man sitting alone at an empty table'), VideoOge('veda', 'Veda anı', 'two people saying farewell at a train station'), VideoOge('mektup', 'Mektup okuyan', 'a person reading an old letter, tearful eyes'), ], 'belgesel': [ VideoOge('vahsi_yasam', 'Vahşi yaşam', 'wild animals roaming the savanna'), VideoOge('balikci', 'Şafakta balıkçı', 'a fisherman casting nets at dawn'), VideoOge('pazar_esnaf', 'Pazarda esnaf', 'a street vendor in a busy market'), VideoOge('zanaatkar', 'Zanaatkâr', 'an artisan crafting by hand in a workshop'), ], 'dans': [ VideoOge('balerin', 'Depoda balerin', 'a ballerina dancing in an abandoned warehouse'), VideoOge('breakdans', 'Sokakta breakdans', 'a breakdancer spinning on the street'), VideoOge('modern_dans', 'Siste modern dans', 'a contemporary dancer moving through fog'), VideoOge('cift_dans', 'Çift dansı', 'a couple performing a passionate tango'), ], 'araba': [ VideoOge('drift', 'Drift atan araba', 'a sports car drifting around a corner, tire smoke'), VideoOge('sahil_klasik', 'Sahilde klasik', 'a classic car cruising a coastal road'), VideoOge('neon_super', 'Neon şehirde süper', 'a supercar driving through a neon city at night'), VideoOge('col_rali', 'Çölde ralli', 'a rally car jumping over desert dunes, dust trail'), ], 'doga': [ VideoOge('selale', 'Ormanda şelale', 'a waterfall cascading in a lush jungle'), VideoOge('kartal', 'Süzülen kartal', 'an eagle soaring over mountain peaks'), VideoOge('dalgalar', 'Kayalıkta dalgalar', 'ocean waves crashing on rocky cliffs'), VideoOge('kuzey_isigi', 'Kuzey ışıkları', 'aurora borealis dancing over a frozen lake'), ], 'dovus': [ VideoOge('ring', 'Ringde dövüşçüler', 'two fighters circling each other in a boxing ring'), VideoOge('samuray', 'Samuray düellosu', 'a samurai duel in a bamboo forest'), VideoOge('yagmur_dovus', 'Yağmurda dövüş', 'a street fight in pouring rain'), VideoOge('kungfu', 'Kung fu ustası', 'a kung fu master training on a mountain temple'), ], 'romantik': [ VideoOge('gunbatimi_cift', 'Gün batımında çift', 'a couple slow dancing at sunset'), VideoOge('sehir_isiklari', 'Şehir ışıklarında', 'lovers under glowing city lights'), VideoOge('plaj_yuruyus', 'Plajda el ele', 'a couple walking hand in hand on a beach'), VideoOge('yagmur_opucuk', 'Yağmurda öpücük', 'a couple kissing in the rain under an umbrella'), ], 'korku': [ VideoOge('koridor_golge', 'Koridorda gölge', 'a shadowy figure at the end of a dark hallway'), VideoOge('terk_hastane', 'Terk edilmiş hastane', 'an abandoned hospital with flickering lights'), VideoOge('orman_hayalet', 'Ormanda hayalet', 'a ghostly figure standing in a misty forest'), VideoOge('bodrum', 'Bodrum kapısı', 'a creaking basement door slowly opening'), ], }; /// Sahne seçilmediğinde gösterilecek genel özneler. static const List genelOzneler = [ VideoOge('yuruyen_kadin', 'Yürüyen kadın', 'a young woman walking through the city'), VideoOge('takimli_adam', 'Takım elbiseli adam', 'a man in a suit standing on a rooftop'), VideoOge('robot', 'Fütüristik robot', 'a futuristic robot moving gracefully'), VideoOge('kedi', 'Meraklı kedi', 'a curious cat exploring'), VideoOge('kalabalik_cadde', 'Kalabalık cadde', 'a crowded city street, people passing by'), ]; static const List kameraAcilari = [ VideoOge('low_angle', 'Alçak açı', 'low angle shot'), VideoOge('high_angle', 'Yüksek açı', 'high angle shot'), VideoOge('dutch', 'Dutch açı', 'dutch angle, tilted frame'), VideoOge('eye_level', 'Göz hizası', 'eye level shot'), VideoOge('birds_eye', 'Kuş bakışı', 'birds eye view from above'), ]; static const List lensler = [ VideoOge('wide', 'Geniş açı', 'wide angle lens'), VideoOge('35mm', '35mm', 'shot on 35mm lens'), VideoOge('85mm', '85mm portre', '85mm lens, shallow depth of field'), VideoOge('macro', 'Makro', 'macro lens, extreme close-up detail'), VideoOge('fisheye', 'Balıkgözü', 'fisheye lens distortion'), VideoOge('anamorphic', 'Anamorfik', 'anamorphic lens, cinematic lens flares'), ]; static const List hizDuygulari = [ VideoOge('slow_motion', 'Ağır çekim hissi', 'slow motion feel'), VideoOge('timelapse', 'Timelapse hissi', 'timelapse feel'), VideoOge('normal', 'Normal', 'normal speed, natural pacing'), ]; static const List stiller = [ VideoOge('cinematic', 'Sinematik', 'cinematic film look'), VideoOge('anime', 'Anime', 'anime style animation'), VideoOge('cyberpunk', 'Cyberpunk', 'cyberpunk aesthetic, neon and chrome'), VideoOge('film_noir', 'Film Noir', 'film noir, high contrast shadows'), VideoOge('vintage', 'Vintage Film', 'vintage film look, grainy retro footage'), VideoOge('documentary', 'Belgesel', 'documentary realistic style'), VideoOge('music_video', 'Müzik Video', 'stylized music video look, bold visuals'), VideoOge('dreamy', 'Rüyamsı', 'dreamy soft focus aesthetic'), ]; static const List renkPaletleri = [ VideoOge('teal_orange', 'Teal & Orange', 'teal and orange color grading'), VideoOge('neon', 'Neon', 'neon color palette, vivid glow'), VideoOge('pastel', 'Pastel', 'soft pastel color palette'), VideoOge('mono', 'Siyah-Beyaz', 'black and white, monochrome'), VideoOge('sicak', 'Sıcak tonlar', 'warm golden color tones'), VideoOge('soguk', 'Soğuk tonlar', 'cold blue color tones'), VideoOge('doygun', 'Doygun', 'highly saturated rich colors'), VideoOge('soluk', 'Soluk', 'desaturated muted colors'), ]; static const List efektDokunuslari = [ VideoOge('lens_flare', 'Lens flare', 'lens flare'), VideoOge('light_leak', 'Işık sızması', 'light leaks'), VideoOge('film_grain', 'Film greni', 'film grain'), VideoOge('motion_blur', 'Hareket bulanıklığı', 'motion blur'), VideoOge('bokeh', 'Bokeh', 'bokeh background lights'), VideoOge('particles', 'Parçacıklar', 'floating dust particles in light'), VideoOge('glitch', 'Glitch', 'digital glitch effects'), VideoOge('god_rays', 'Işık hüzmeleri', 'volumetric god rays'), VideoOge('smoke', 'Duman', 'drifting smoke'), VideoOge('sparks', 'Kıvılcım', 'flying sparks'), VideoOge('rain_drops', 'Yağmur damlası', 'rain drops on lens'), VideoOge('neon_glow', 'Neon parıltı', 'neon glow accents'), ]; /// Tüm özne önerileri (id → prompt araması için). static final List tumOzneler = [ for (final liste in ozneOnerileri.values) ...liste, ...genelOzneler, ]; } /// Video sihirbazı seçimleri — yalnız çip seçimleri, serbest metin yok. class VideoSihirbazSecimleri { VideoSihirbazSecimleri({ this.sahneTuru = '', this.ozne = '', Set? kameraHareketi, this.kameraAcisi = '', this.lens = '', this.hareketYogunlugu = '', this.hizDuygusu = '', Set? atmosfer, Set? efektDokunuslari, this.isikZaman = '', this.stil = '', this.renkPaleti = '', this.nsfwAcik = false, Set? nsfwSecimler, }) : kameraHareketi = kameraHareketi ?? {}, atmosfer = atmosfer ?? {}, efektDokunuslari = efektDokunuslari ?? {}, nsfwSecimler = nsfwSecimler ?? {}; final String sahneTuru; final String ozne; final Set kameraHareketi; final String kameraAcisi; final String lens; final String hareketYogunlugu; final String hizDuygusu; final Set atmosfer; final Set efektDokunuslari; final String isikZaman; final String stil; final String renkPaleti; final bool nsfwAcik; final Set nsfwSecimler; static String? _pv(List k, String id) { for (final o in k) { if (o.id == id) return o.promptEn; } return null; } static String? _pk(List k, String id) { for (final o in k) { if (o.id == id) return o.promptEn; } return null; } static void _ekle(List p, String? s) { if (s != null && s.trim().isNotEmpty) p.add(s); } static void _ekleSet(List p, List katalog, Set sec) { for (final o in katalog) { if (sec.contains(o.id)) _ekle(p, o.promptEn); } } /// Seçimleri İngilizce video prompt'una derler. String promptDerle() { final p = []; _ekle(p, _pv(VideoSihirbazKataloglari.tumOzneler, ozne)); _ekle(p, _pv(VideoSihirbazKataloglari.sahneTurleri, sahneTuru)); _ekleSet(p, VideoKataloglari.kameraHareketleri, kameraHareketi); _ekle(p, _pv(VideoSihirbazKataloglari.kameraAcilari, kameraAcisi)); _ekle(p, _pv(VideoSihirbazKataloglari.lensler, lens)); _ekle(p, _pv(VideoKataloglari.hareketYogunlugu, hareketYogunlugu)); _ekle(p, _pv(VideoSihirbazKataloglari.hizDuygulari, hizDuygusu)); _ekleSet(p, VideoKataloglari.atmosfer, atmosfer); _ekleSet(p, VideoSihirbazKataloglari.efektDokunuslari, efektDokunuslari); _ekle(p, _pv(VideoKataloglari.isikZaman, isikZaman)); _ekle(p, _pv(VideoSihirbazKataloglari.stiller, stil)); _ekle(p, _pv(VideoSihirbazKataloglari.renkPaletleri, renkPaleti)); if (nsfwAcik) { for (final id in nsfwSecimler) { _ekle(p, _pk(NsfwKataloglari.seviye, id) ?? _pk(NsfwKataloglari.tumCoklu, id)); } } p.add('high quality, smooth motion'); return p.join(', '); } /// Negatif prompt — temel + NSFW açıkken çocuk koruması. String negatifDerle() { const temel = 'blurry, jittery, distorted, watermark'; if (!nsfwAcik) return temel; return '$temel, child, kid, underage, minor, teenager, ' 'young looking face, loli, shota, childlike features'; } bool get bos => sahneTuru.isEmpty && ozne.isEmpty && kameraHareketi.isEmpty && kameraAcisi.isEmpty && lens.isEmpty && hareketYogunlugu.isEmpty && hizDuygusu.isEmpty && atmosfer.isEmpty && efektDokunuslari.isEmpty && isikZaman.isEmpty && stil.isEmpty && renkPaleti.isEmpty && nsfwSecimler.isEmpty; VideoSihirbazSecimleri kopyala({ String? sahneTuru, String? ozne, Set? kameraHareketi, String? kameraAcisi, String? lens, String? hareketYogunlugu, String? hizDuygusu, Set? atmosfer, Set? efektDokunuslari, String? isikZaman, String? stil, String? renkPaleti, bool? nsfwAcik, Set? nsfwSecimler, }) => VideoSihirbazSecimleri( sahneTuru: sahneTuru ?? this.sahneTuru, ozne: ozne ?? this.ozne, kameraHareketi: kameraHareketi ?? this.kameraHareketi, kameraAcisi: kameraAcisi ?? this.kameraAcisi, lens: lens ?? this.lens, hareketYogunlugu: hareketYogunlugu ?? this.hareketYogunlugu, hizDuygusu: hizDuygusu ?? this.hizDuygusu, atmosfer: atmosfer ?? this.atmosfer, efektDokunuslari: efektDokunuslari ?? this.efektDokunuslari, isikZaman: isikZaman ?? this.isikZaman, stil: stil ?? this.stil, renkPaleti: renkPaleti ?? this.renkPaleti, nsfwAcik: nsfwAcik ?? this.nsfwAcik, nsfwSecimler: nsfwSecimler ?? this.nsfwSecimler, ); Map toJson() => { 'sahneTuru': sahneTuru, 'ozne': ozne, 'kameraHareketi': kameraHareketi.toList(), 'kameraAcisi': kameraAcisi, 'lens': lens, 'hareketYogunlugu': hareketYogunlugu, 'hizDuygusu': hizDuygusu, 'atmosfer': atmosfer.toList(), 'efektDokunuslari': efektDokunuslari.toList(), 'isikZaman': isikZaman, 'stil': stil, 'renkPaleti': renkPaleti, 'nsfwAcik': nsfwAcik, 'nsfwSecimler': nsfwSecimler.toList(), }; factory VideoSihirbazSecimleri.fromJson(Map j) { Set kume(String k) => Set.from((j[k] as List?) ?? const []); return VideoSihirbazSecimleri( sahneTuru: j['sahneTuru'] as String? ?? '', ozne: j['ozne'] as String? ?? '', kameraHareketi: kume('kameraHareketi'), kameraAcisi: j['kameraAcisi'] as String? ?? '', lens: j['lens'] as String? ?? '', hareketYogunlugu: j['hareketYogunlugu'] as String? ?? '', hizDuygusu: j['hizDuygusu'] as String? ?? '', atmosfer: kume('atmosfer'), efektDokunuslari: kume('efektDokunuslari'), isikZaman: j['isikZaman'] as String? ?? '', stil: j['stil'] as String? ?? '', renkPaleti: j['renkPaleti'] as String? ?? '', nsfwAcik: j['nsfwAcik'] as bool? ?? false, nsfwSecimler: kume('nsfwSecimler'), ); } }