Film Mahşeri - Serverless Premium Sinema & Dizi Platformu
Film Mahşeri, geleneksel CMS (WordPress, Blogger vb.) altyapılarının hantallığını tamamen ortadan kaldıran, modern BaaS (Backend as a Service) çözümleriyle baştan aşağı yeniden inşa edilmiş, %100 Sunucusuz (Serverless) bir SPA (Single Page Application) mimarisidir.
⚡ Mühendislik Harikası:
Bu proje; yüksek performanslı PostgreSQL sorgularını, gerçek zamanlı NoSQL veritabanı akışlarını ve dinamik API entegrasyonlarını sadece Vanilla JS kullanarak bir araya getiren deneysel bir çalışmadır.
📑 İçindekiler
- 🌟 Sistem Mimarisi ve Temel Özellikler
- 📁 Dosya ve Klasör Ağacı
- ⚙️ Teknoloji Yığını (Tech Stack)
- 🛠️ Kurulum Rehberi (Adım Adım)
- 🗄️ Veritabanı Kurulumu (SQL & NoSQL)
- 🔐 Çift Katmanlı Güvenlik Ağı
- 🧠 Gelişmiş Modüller (PWA & Anti-Theft)
- 🚧 Sıkça Sorulan Sorular ve Hata Çözümleri
- 🗺️ Yol Haritası (Roadmap)
- 🤝 Katkıda Bulunma & Lisans
🌟 Sistem Mimarisi ve Temel Özellikler
- TMDb Dinamik Trend Algoritması: Sistem, her yüklendiğinde
TMDb Trending APIüzerinden haftanın en çok izlenen küresel filmlerini çeker. Bu ID'leri kendi Supabase veritabanımızla asenkron olarak eşleştirip ana sayfadaki "Editörün Seçtikleri" alanını insan müdahalesi olmadan otomatik günceller. - Gerçek Zamanlı (Live) Arama: Veritabanını yormamak için
Debounce(Geciktirme) tekniği kullanılmış, Supabase'inilike(Büyük/küçük harf duyarsız) operatörü ile milisaniyelik canlı arama motoru geliştirilmiştir. - İleri Düzey Profil ve Yorum Sistemi: Firebase Firestore kullanılarak izleyicilerin yaptıkları yorumlar, favori filmleri ve izleme geçmişleri anlık (Real-time) olarak güncellenir.
- Kusursuz Tema Motoru: Sayfa yüklenirken yaşanan FOUC (Flash of Unstyled Content - Beyaz ekran patlaması) sorununu çözen, kullanıcı tercihini
LocalStorage'da şifreleyerek tutan CSS değişken (Custom Properties) destekli Dark/Light tema motoru.
📁 Dosya ve Klasör Ağacı
Modüler bir yaklaşımla, hiçbir frontend framework'ü (React/Vue) kullanılmadan SPA deneyimi yaratılmıştır:
⚙️ Teknoloji Yığını (Tech Stack)
- Frontend (İstemci): HTML5, CSS3, ES6+ Vanilla JavaScript. (Sıfır bağımlılık ilkesi).
- Ana Veritabanı (İlişkisel):
Supabase (PostgreSQL). Filmler, kategoriler, kapak yolları (URL) ve metadata verileri için yüksek okuma performansı. - Bağlı Veritabanı (NoSQL) & Auth:
Firebase (Firestore). Hızlı yazma/güncelleme gerektiren yorumlar, kullanıcı verileri, film istekleri ve hata bildirimleri için kullanılmıştır. - Ağ Akışı: Fetch API & Async/Await.
- Medya Oynatıcı: HLS destekli özel yapılandırılmış JW Player (player.html içinde izole edilmiştir).
🛠️ Kurulum Rehberi (Adım Adım)
Projenin kendi sunucunuzda veya localhost'ta çalışabilmesi için aşağıdaki adımları sırasıyla uygulayın:
1. Projeyi Klonlayın
cd film-mahseri
2. Domain (Alan Adı) Güncellemesi
Tüm .html dosyalarını ve app.js dosyasını açın. Kod içindeki SENIN-SITEN.com yer tutucularını CTRL + F yaparak bulun ve kendi gerçek alan adınız (veya localhost) ile değiştirin. Aksi takdirde SEO etiketleri ve Player Güvenlik Duvarı çalışmayacaktır.
3. API Anahtarlarını Alın ve Yerleştirin
- TMDb: TheMovieDB'den ücretsiz API anahtarı alın ve
.htmldosyalarındakiTREND_TMDB_API_KEYsabitine yapıştırın. - Supabase & Firebase:
app.jsdosyasını açın ve config değişkenlerindekiBURAYA_KENDI...yazان kısımlara proje anahtarlarınızı girin.
🗄️ Veritabanı Kurulumu (SQL & NoSQL)
Supabase SQL Şeması
Supabase panelinizde SQL Editor kısmına girin ve tabloyu oluşturmak için şu sorguyu çalıştırın:
Firebase Firestore Şeması
Firebase panelinizde Firestore veritabanını oluşturun. Tablolar kod tarafından otomatik oluşturulacaktır ancak şu koleksiyonlar kullanılmaktadır:
users(Kullanıcı profilleri ve izleme geçmişleri)comments(Filmlere yapılan yorumlar)istekler(Film istek formu verileri)iletisim(İletişim formu verileri)roles&banned_users(Yönetici yetkileri ve engellenenler)
🔐 Çift Katmanlı Güvenlik Ağı
SPA (Single Page Application) yapılarında API anahtarlarının kaynak kodda görünmesi bir mimari zorunluluktur. Güvenlik, kodları saklamakla değil; veritabanına konulan kilitlerle (Policies/Rules) sağlanır.
Supabase RLS (Row Level Security) Kilidi
Sisteme dışarıdan film eklenmesini engellemek için sadece okuma yetkisi verilmelidir:
Firebase Security Rules
Kullanıcıların sadece kendi verilerini silebilmesi ve yorumları sadece giriş yapanların yazabilmesi için:
🧠 Gelişmiş Modüller (PWA & Anti-Theft)
1. Sıfır Dosyalı PWA Motoru (Blogger/Static Host Bypass)
Blogger veya katı statik hostlar kök dizine manifest.json yüklenmesini engellediği için "Line 1, Column 1 Syntax Error" hatası verir. Bu projede, fiziksel bir dosya kullanmak yerine Base64 kodlanmış Data URI ile tarayıcının hafızasında sanal bir PWA sistemi ayağa kaldırılır.
2. Gelişmiş Anti-Theft (Emeğe Saygı / Kredi Koruma) Sistemi
Açık kaynak paylaşılan bu projenin footer kısmında yer alan "Tasarım & Altyapı: Ali Semi" yazısı özel bir şifreleme algoritmasıyla korunmaktadır.
- Eğer bir hırsız kaynak koddan bu yazıyı silerse,
- CSS ile
display: noneveyaopacity: 0yapıp gizlemeye çalışırsa,
Sistem durumu anında (2 saniye içinde) tespit eder ve sayfanın DOM'unu kilitleyerek kullanıcıyı otomatik olarak Orijinal Geliştirici Sitesine yönlendirir. Obfuscate (Karmaşıklaştırma) edildiği için kodun nerede olduğu anlaşılamaz.
🚧 Sıkça Sorulan Sorular ve Hata Çözümleri
Soru: app.js'de firebase is not defined hatası alıyorum.
Cevap: Firebase SDK bağlantılarının (CDN) app.js çağrılmadan önce (<head> etiketleri arasında) yüklendiğinden emin olun. Projedeki sıralamayı bozmayın.
Soru: admin.html sayfasına girdiğimde beni dışarı atıyor.
Cevap: Admin sayfasına sadece kurucu erişebilir. Firebase Auth üzerinden kayıt olduktan sonra admin.html dosyasını açıp admin@seninsiten.com yazan kod satırını kendi kayıt olduğunuz e-posta adresi ile değiştirin.
Soru: Filmi ekliyorum ama oynatıcı açılmıyor.
Cevap: player.html dosyasının içindeki IZIN_VERILEN_SITE sabitini kendi alan adınız yapmadığınız için oynatıcı güvenlik gereği erişimi engelliyor.
Geliştirici: Ali Semi
Bu proje MIT Lisansı ile açık kaynaklı olarak paylaşılmıştır ancak geliştirici kredilerinin (Footer) kaldırılmaması şartıyla kullanıma uygundur.