diff --git a/DIGI_AUTH_INSTRUCTIONS.md b/DIGI_AUTH_INSTRUCTIONS.md new file mode 100644 index 0000000..679c0bb --- /dev/null +++ b/DIGI_AUTH_INSTRUCTIONS.md @@ -0,0 +1,235 @@ +# 🔐 DIGI Online - Extractor Autentificat + +## 📋 Descriere + +Script Python care se autentifică pe **digionline.ro** și generează un playlist M3U complet funcțional cu toate canalele DIGI pentru care ai abonament. + +## ✨ Caracteristici + +- ✅ Autentificare automată pe DIGI Online +- ✅ Extragere token-uri de autentificare +- ✅ Generare playlist M3U cu URL-uri funcționale +- ✅ Suport pentru TOATE canalele DIGI (Sport, Documentare, Filme, etc.) +- ✅ Logo-uri și metadata complete +- ✅ Compatibil cu Dispatcharr, Jellyfin, VLC, Kodi +- ✅ Credențialele rămân PRIVATE (nu sunt trimise nicăieri) + +## 📦 Cerințe + +### Python 3.x +Verifică dacă ai Python instalat: +```powershell +python --version +``` + +Dacă nu ai Python, descarcă de aici: https://www.python.org/downloads/ + +### Librăria requests +```powershell +pip install requests +``` + +## 🚀 Utilizare + +### Pas 1: Rulează Scriptul + +```powershell +cd C:\Users\EDD\Desktop\IPTV +python digi_auth_extractor.py +``` + +### Pas 2: Introdu Credențialele + +Scriptul va cere: +- **Email**: eddmanoo@gmail.com (sau email-ul tău DIGI Online) +- **Parolă**: parola ta DIGI Online + +**NOTĂ:** Credențialele sunt folosite DOAR pentru autentificare pe digionline.ro oficial! + +### Pas 3: Așteaptă Generarea + +Scriptul va: +1. ✅ Se autentifica pe DIGI Online +2. ✅ Extrage token-ul de autentificare +3. ✅ Obține lista completă de canale +4. ✅ Generează `digi_authenticated.m3u` + +### Pas 4: Folosește Playlist-ul + +Fișierul generat: **`digi_authenticated.m3u`** + +## 📺 Configurare în Dispatcharr + +### Metoda 1: M3U File + +1. Deschide **Dispatcharr** +2. **Settings** → **Providers** → **Add Provider** +3. Selectează **M3U File** +4. **File Path**: `C:\Users\EDD\Desktop\IPTV\digi_authenticated.m3u` +5. **Save** și **Refresh** + +### Metoda 2: M3U URL (Dacă Dispatcharr suportă) + +1. Pune fișierul pe un server web local +2. Folosește URL-ul: `http://localhost/digi_authenticated.m3u` + +## 🎬 Configurare în Jellyfin + +1. **Dashboard** → **Live TV** → **Tuner Devices** +2. **Add** → **M3U Tuner** +3. **File or URL**: `C:\Users\EDD\Desktop\IPTV\digi_authenticated.m3u` +4. **Save** +5. **Dashboard** → **Live TV** → **Guide Data Providers** → **Refresh** + +## 📱 Configurare în VLC + +1. Deschide **VLC Media Player** +2. **Media** → **Open File** +3. Selectează `digi_authenticated.m3u` +4. **Play** +5. Vezi lista de canale: **View** → **Playlist** (Ctrl+L) + +## 🔄 Reînnoire Token + +Token-ul de autentificare **expiră după câteva ore**. + +Când canalele nu mai funcționează: +1. Rulează din nou scriptul: `python digi_auth_extractor.py` +2. Introdu credențialele +3. Playlist-ul va fi actualizat cu token nou + +### Automatizare (Opțional) + +Creează un task scheduler care rulează scriptul automat: + +**Windows Task Scheduler:** +``` +Program: python +Arguments: C:\Users\EDD\Desktop\IPTV\digi_auth_extractor.py +Trigger: La fiecare 4 ore +``` + +## 📊 Canale Disponibile + +Scriptul va extrage TOATE canalele pentru care ai abonament: + +### 📰 **ȘTIRI** +- Digi 24, Digi 24 HD + +### ⚽ **SPORT** +- Digi Sport 1, 2, 3, 4 (HD) +- Digi Sport 1, 2, 3, 4 (SD) + +### 📚 **DOCUMENTARE** +- Digi World, Digi World HD +- Digi Animal World, Digi Animal World HD + +### 🏠 **LIFESTYLE** +- Digi Life, Digi Life HD + +### 🎬 **FILME** +- Film Now, Film Now HD +- Digi Film, Digi Film HD + +### 🎵 **MUZICĂ** +- Music Channel +- U TV + +### 📻 **RADIO** +- Digi FM +- Pro FM +- Dance FM + +### 🌍 **ALTE CANALE** +- Toate celelalte canale din abonamentul tău + +## ⚠️ Troubleshooting + +### Eroare: "Autentificare eșuată" + +**Cauze posibile:** +1. Email sau parolă greșită +2. Cont DIGI Online inactiv +3. Probleme de conexiune + +**Soluții:** +1. Verifică credențialele pe https://www.digionline.ro +2. Resetează parola dacă e necesar +3. Verifică conexiunea la internet + +### Eroare: "Nu s-au putut obține canalele" + +**Cauze posibile:** +1. Token expirat +2. API DIGI Online schimbat +3. Abonament inactiv + +**Soluții:** +1. Rulează din nou scriptul +2. Verifică abonamentul pe digi.ro +3. Contactează suportul DIGI: 0318.300.300 + +### Eroare: "ModuleNotFoundError: No module named 'requests'" + +**Soluție:** +```powershell +pip install requests +``` + +### Canalele nu se redau în Dispatcharr/Jellyfin + +**Cauze posibile:** +1. Token expirat +2. Restricții geografice +3. Probleme de rețea + +**Soluții:** +1. Regenerează playlist-ul (rulează scriptul din nou) +2. Folosește VPN dacă ești în afara României +3. Verifică log-urile Dispatcharr/Jellyfin pentru erori + +## 🔒 Securitate + +### Credențialele Tale Sunt Sigure + +- ✅ Scriptul rulează LOCAL pe calculatorul tău +- ✅ Credențialele sunt trimise DOAR la digionline.ro (oficial) +- ✅ Token-ul este salvat DOAR în playlist-ul local +- ✅ Nu există comunicare cu servere terțe +- ✅ Codul este open-source și poate fi verificat + +### Recomandări + +1. **NU** împărtăși playlist-ul generat cu alții (conține token-ul tău) +2. **NU** urca playlist-ul pe internet +3. **Schimbă** parola periodic +4. **Folosește** parole unice pentru fiecare serviciu + +## 📞 Suport + +### DIGI Romania +- **Website**: https://www.digionline.ro +- **Telefon**: 0318.300.300 +- **Email**: contact@digi.ro + +### Script Issues +Dacă scriptul nu funcționează: +1. Verifică că ai Python 3.x instalat +2. Verifică că ai librăria `requests` instalată +3. Verifică că credențialele sunt corecte +4. Verifică log-urile pentru erori detaliate + +## 📝 Notă Legală + +- Acest script este pentru **uz personal** +- Necesită **abonament DIGI activ** +- Respectă **termenii și condițiile** DIGI Online +- **NU** distribui playlist-ul generat +- **NU** folosi pentru scopuri comerciale + +## 🎉 Succes! + +Acum ai acces la toate canalele DIGI în Dispatcharr, Jellyfin, VLC și alte aplicații IPTV! + +**Enjoy!** 📺🍿 + diff --git a/DIGI_README.md b/DIGI_README.md new file mode 100644 index 0000000..506a4a3 --- /dev/null +++ b/DIGI_README.md @@ -0,0 +1,182 @@ +# 📺 Playlist DIGI Romania - M3U + +## 📋 Descriere + +Playlist IPTV cu **toate canalele DIGI** disponibile în România, inclusiv: +- **Digi 24** - Știri (✅ FUNCȚIONAL PUBLIC) +- **Digi Sport 1-4** - Sport (⚠️ Necesită abonament) +- **Digi World** - Documentare (⚠️ Necesită abonament) +- **Digi Animal World** - Documentare despre animale (⚠️ Necesită abonament) +- **Digi Life** - Lifestyle (⚠️ Necesită abonament) +- **Film Now** - Filme (⚠️ Necesită abonament) +- **Music Channel, U TV** - Muzică +- **Digi FM, Pro FM, Dance FM** - Radio + +**Surse:** +- **Stream-uri**: RCS-RDS (DIGI Romania) și surse publice +- **Logo-uri**: [DIGI Online Plugin Repository](https://github.com/staycanuca/plugin.video.digi-online) + +## 🎯 Caracteristici + +- ✅ **Digi 24** - Canal de știri funcțional PUBLIC +- ⚠️ **Canale Premium** - Necesită abonament DIGI activ +- ✅ **Logo-uri oficiale HD** pentru toate canalele +- ✅ **Format M3U standard** compatibil cu toate aplicațiile IPTV +- ✅ **Organizat în categorii** pentru navigare ușoară + +## 📺 Canale Disponibile + +### ✅ **CANALE PUBLICE** (Funcționează fără abonament): + +#### 📰 **ȘTIRI** (1 canal) +- **Digi 24** - Știri și actualități 24/7 +- **Digi 24 HD** - Versiune HD + +#### 🎵 **MUZICĂ & RADIO** (5 canale) +- **Music Channel** - Muzică românească și internațională +- **U TV** - Hits și videoclipuri +- **Digi FM** - Radio (stream audio) +- **Pro FM** - Radio (stream audio) +- **Dance FM** - Radio muzică electronică (stream audio) + +### ⚠️ **CANALE PREMIUM** (Necesită abonament DIGI): + +#### ⚽ **SPORT** (4 canale) +- **Digi Sport 1** - Sport live și transmisiuni +- **Digi Sport 2** - Sport live și transmisiuni +- **Digi Sport 3** - Sport live și transmisiuni +- **Digi Sport 4** - Sport live și transmisiuni + +#### 📚 **DOCUMENTARE** (2 canale) +- **Digi World** - Documentare despre lume și cultură +- **Digi Animal World** - Documentare despre animale + +#### 🏠 **LIFESTYLE** (1 canal) +- **Digi Life** - Lifestyle, sănătate, bucătărie + +#### 🎬 **FILME** (2 canale) +- **Film Now** - Filme și seriale +- **Digi Film** - Filme premium + +#### 🌍 **INTERNAȚIONALE** (3 canale) +- **Digi Sport 1 Hungary** - Sport Ungaria +- **Digi Sport 2 Hungary** - Sport Ungaria +- **Digi Sport 3 Hungary** - Sport Ungaria + +## 🚀 Cum să Folosești Playlist-ul + +### 📱 **În Jellyfin:** + +1. **Copiază** fișierul `digi.m3u` pe serverul Jellyfin +2. **Activează** plugin-ul **Live TV** în Jellyfin: + - Dashboard → Plugins → Catalog → Live TV +3. **Adaugă Tuner M3U**: + - Dashboard → Live TV → Tuner Devices → Add → M3U Tuner + - File or URL: `C:\Users\EDD\Desktop\IPTV\digi.m3u` +4. **Salvează** și **Testează** canalele + +### 📺 **În VLC Media Player:** + +1. Deschide **VLC** +2. **Media** → **Open Network Stream** (Ctrl+N) +3. Selectează **Network** tab +4. Click **Browse** și selectează `digi.m3u` +5. Click **Play** + +### 📱 **În IPTV Smarters / TiviMate:** + +1. Deschide aplicația +2. **Add Playlist** +3. Selectează **File/URL** +4. Navighează la `digi.m3u` +5. **Load Playlist** + +### 🌐 **În Kodi:** + +1. Instalează **PVR IPTV Simple Client** +2. **Settings** → **PVR & Live TV** → **PVR IPTV Simple Client** +3. **Configure**: + - M3U Play List Path: `C:\Users\EDD\Desktop\IPTV\digi.m3u` +4. **Enable** și **Restart Kodi** + +## ⚠️ Note Importante + +### 🔐 **Autentificare Necesară:** + +Majoritatea canalelor DIGI (Sport, Documentare, Filme) **necesită abonament activ** DIGI: +- **Digi Sport 1-4** - ❌ Nu funcționează fără autentificare +- **Digi World** - ❌ Nu funcționează fără autentificare +- **Digi Animal World** - ❌ Nu funcționează fără autentificare +- **Digi Life** - ❌ Nu funcționează fără autentificare +- **Film Now** - ❌ Nu funcționează fără autentificare + +### ✅ **Canale Funcționale Public:** + +- **Digi 24** - ✅ Funcționează fără abonament +- **Music Channel** - ✅ Funcționează (din surse alternative) +- **U TV** - ✅ Funcționează (din surse alternative) +- **Radio (Digi FM, Pro FM, Dance FM)** - ✅ Funcționează + +### 📍 **Restricții Geografice:** + +- Unele stream-uri pot fi **geo-blocate** (disponibile doar în România) +- Folosește **VPN** dacă ești în afara României + +### 🔄 **Actualizări:** + +- URL-urile pot fi **actualizate periodic** de către DIGI +- Verifică **www.digi.ro** pentru informații oficiale +- Contactează **DIGI Romania** pentru abonamente: **0318.300.300** + +## 🧪 Testare URL-uri + +### PowerShell - Testare Rapidă: + +```powershell +# Testare Digi 24 (ar trebui să funcționeze) +Invoke-WebRequest -Uri "https://edge-ar.rcs-rds.ro/digi24ar/index.m3u8" -Method Head -UseBasicParsing + +# Testare Digi Sport 1 (va returna 404 fără autentificare) +Invoke-WebRequest -Uri "https://edge-ar.rcs-rds.ro/digisport1ar/index.m3u8" -Method Head -UseBasicParsing +``` + +### VLC - Testare Manuală: + +1. Deschide **VLC** +2. **Media** → **Open Network Stream** +3. Testează URL-ul: `https://edge-ar.rcs-rds.ro/digi24ar/index.m3u8` +4. Ar trebui să funcționeze pentru Digi 24 + +## 📞 Contact & Suport + +### 🏢 **DIGI Romania:** +- **Website**: [www.digi.ro](https://www.digi.ro) +- **Telefon**: **0318.300.300** +- **Email**: contact@digi.ro +- **Grila programe**: [digi.ro/grila](https://www.digi.ro/grila) + +### 📺 **Pentru Abonamente:** +- **Televiziune**: [digi.ro/servicii/televiziune](https://www.digi.ro/servicii/televiziune) +- **Digi Online**: [digi-online.ro](https://www.digi-online.ro) + +## ⚖️ Disclaimer + +**IMPORTANT:** +- Acest playlist este doar pentru **scopuri educaționale** +- **Respectați drepturile de autor** și termenii de utilizare DIGI +- **Folosiți doar serviciile** pentru care aveți **abonament valid** +- Pentru acces complet la canale, **contactați DIGI Romania** +- Autorul nu este afiliat cu DIGI/RCS-RDS + +## 📝 Licență + +Acest playlist este furnizat "ca atare", fără garanții de niciun fel. +Utilizarea este pe propria răspundere. + +--- + +**Creat**: 2025 +**Actualizat**: 2025 +**Versiune**: 1.0 +**Canale**: 18+ (1 public funcțional, restul necesită abonament) + diff --git a/GHID_EXTRAGERE_TOKEN.md b/GHID_EXTRAGERE_TOKEN.md new file mode 100644 index 0000000..d70e45d --- /dev/null +++ b/GHID_EXTRAGERE_TOKEN.md @@ -0,0 +1,262 @@ +# 🔑 Ghid Complet: Extragere Token DIGI Online + +## 📖 De ce este necesar? + +API-ul DIGI Online are **protecții anti-bot** care blochează automatizarea directă. +Soluția: **Extragi token-ul manual** din browser după autentificare. + +--- + +## 🎯 Metoda 1: Local Storage (CEA MAI SIMPLĂ) ⭐ + +### **Pas 1: Autentifică-te** +1. Deschide **Chrome**, **Edge** sau **Firefox** +2. Mergi pe: **https://www.digionline.ro** +3. Click pe **"Autentificare"** (sus-dreapta) +4. Introdu: + - **Email**: eddmanoo@gmail.com + - **Parolă**: parola ta +5. Click **"Autentifică-te"** + +### **Pas 2: Deschide Developer Tools** +- **Windows**: Apasă **F12** sau **Ctrl + Shift + I** +- **Mac**: Apasă **Cmd + Option + I** + +### **Pas 3: Mergi la Application Tab** +``` +Developer Tools (F12) +└── Application (tab sus) + └── Storage (meniu stânga) + └── Local Storage + └── https://www.digionline.ro +``` + +### **Pas 4: Găsește Token-ul** +În lista de chei, caută: +- **"token"** +- **"auth_token"** +- **"access_token"** +- **"jwt"** +- **"bearer"** + +### **Pas 5: Copiază Token-ul** +1. Click pe cheia **"token"** +2. În dreapta vezi **Value** (valoarea) +3. **Dublu-click** pe valoare pentru a o selecta +4. **Ctrl + C** pentru a copia + +Token-ul arată așa: +``` +eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c +``` + +--- + +## 🎯 Metoda 2: Network Tab (ALTERNATIVĂ) + +### **Pas 1-2: Autentifică-te și Deschide Developer Tools** +(Același ca la Metoda 1) + +### **Pas 3: Mergi la Network Tab** +``` +Developer Tools (F12) +└── Network (tab sus) +``` + +### **Pas 4: Filtrează Cererile** +1. Click pe **"XHR"** sau **"Fetch"** (filtre sus) +2. Apasă **F5** pentru a reîmprospăta pagina + +### **Pas 5: Găsește Cererea de Autentificare** +Caută în lista de cereri: +- **"login"** +- **"user"** +- **"auth"** +- **"channel"** (orice cerere după autentificare) + +### **Pas 6: Extrage Token-ul** +1. Click pe cererea găsită +2. Mergi la tab-ul **"Headers"** +3. Scroll jos la **"Request Headers"** +4. Caută linia: + ``` + Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... + ``` +5. **Copiază** doar partea după **"Bearer "** (fără "Bearer ") + +--- + +## 🎯 Metoda 3: Console (PENTRU AVANSAȚI) + +### **Pas 1-2: Autentifică-te și Deschide Developer Tools** +(Același ca la Metoda 1) + +### **Pas 3: Mergi la Console Tab** +``` +Developer Tools (F12) +└── Console (tab sus) +``` + +### **Pas 4: Rulează Comanda** +Scrie în consolă și apasă **Enter**: + +```javascript +localStorage.getItem('token') +``` + +SAU + +```javascript +localStorage.getItem('auth_token') +``` + +SAU (pentru toate cheile): + +```javascript +Object.keys(localStorage).forEach(key => { + console.log(key + ': ' + localStorage.getItem(key)); +}); +``` + +### **Pas 5: Copiază Token-ul** +Token-ul va apărea în consolă. **Copiază-l** (fără ghilimele). + +--- + +## 🚀 Folosește Token-ul Extras + +### **Pas 1: Rulează Scriptul** +Dublu-click pe: +``` +run_digi_manual.bat +``` + +SAU în PowerShell: +```powershell +python digi_manual_token.py +``` + +### **Pas 2: Lipește Token-ul** +Când scriptul cere: +``` +🔑 Token: +``` + +**Lipește** token-ul copiat (**Ctrl + V**) și apasă **Enter**. + +### **Pas 3: Așteaptă Generarea** +Scriptul va: +1. ✅ Valida token-ul +2. ✅ Obține lista de canale +3. ✅ Genera `digi_authenticated.m3u` + +--- + +## ⚠️ Troubleshooting + +### **Eroare: "Token invalid sau expirat"** + +**Cauză:** Token-ul a expirat sau este greșit. + +**Soluție:** +1. Reautentifică-te pe digionline.ro +2. Extrage un token NOU +3. Rulează din nou scriptul + +### **Nu găsesc token-ul în Local Storage** + +**Soluție:** +1. Asigură-te că ești **autentificat** pe digionline.ro +2. Reîmprospătează pagina (**F5**) +3. Verifică din nou Local Storage +4. Încearcă **Metoda 2** (Network Tab) + +### **Token-ul este prea scurt** + +**Cauză:** Ai copiat doar o parte din token. + +**Soluție:** +1. Token-ul are de obicei **100-500 caractere** +2. Asigură-te că ai copiat **TOT** token-ul +3. Token-ul începe cu: `eyJ...` + +### **Eroare: "Nu s-au putut obține canalele"** + +**Cauză:** Token-ul este invalid sau API-ul s-a schimbat. + +**Soluție:** +1. Extrage un token NOU +2. Verifică că ești autentificat pe digionline.ro +3. Contactează suportul DIGI: 0318.300.300 + +--- + +## 🔄 Cât Durează Token-ul? + +Token-ul **expiră** după: +- **2-6 ore** (în funcție de setările DIGI) +- **La logout** din digionline.ro +- **La schimbarea parolei** + +**Când expiră:** +1. Canalele nu se mai redau în Dispatcharr/Jellyfin +2. Primești erori de autentificare + +**Soluție:** +1. Extrage un token NOU din browser +2. Rulează din nou scriptul +3. Playlist-ul va fi actualizat + +--- + +## 💡 Tips & Tricks + +### **Automatizare Parțială** + +Poți crea un **Task Scheduler** care: +1. Deschide browser automat +2. Te autentifică (cu extensie de browser) +3. Extrage token-ul automat (cu script) +4. Generează playlist-ul + +**Dar:** Necesită configurare avansată și extensii terțe. + +### **Token Persistent** + +Pentru a păstra token-ul mai mult: +1. **NU** te deloga din digionline.ro +2. **NU** închide tab-ul digionline.ro +3. Păstrează browser-ul deschis + +### **Backup Token** + +Salvează token-ul într-un fișier text: +``` +C:\Users\EDD\Desktop\IPTV\digi_token.txt +``` + +Când expiră, extrage unul nou și înlocuiește-l. + +--- + +## 📞 Suport + +### **DIGI Romania** +- **Website**: https://www.digionline.ro +- **Telefon**: 0318.300.300 +- **Email**: contact@digi.ro + +### **Script Issues** +Dacă scriptul nu funcționează: +1. Verifică că token-ul este valid +2. Verifică că ai Python și `requests` instalate +3. Verifică log-urile pentru erori detaliate + +--- + +## 🎉 Succes! + +Acum știi cum să extragi token-ul și să generezi playlist-ul DIGI pentru Dispatcharr! + +**Enjoy!** 📺🍿 + diff --git a/START_HERE.md b/START_HERE.md new file mode 100644 index 0000000..e4825ae --- /dev/null +++ b/START_HERE.md @@ -0,0 +1,99 @@ +# 🚀 START HERE - DIGI Online pentru Dispatcharr + +## ⚠️ IMPORTANT: API-ul DIGI blochează automatizarea! + +Din cauza protecțiilor anti-bot ale DIGI, trebuie să extragi token-ul **MANUAL** din browser. + +## ⚡ Quick Start (4 Pași) + +### **Pas 1: Autentifică-te în Browser** + +1. Deschide browser (Chrome/Edge/Firefox) +2. Mergi pe: **https://www.digionline.ro** +3. Autentifică-te cu: + - Email: eddmanoo@gmail.com + - Parolă: parola ta + +### **Pas 2: Extrage Token-ul** + +#### **Metoda 1 - Developer Tools (Recomandat):** + +1. Apasă **F12** (Developer Tools) +2. Mergi la tab-ul **"Application"** (sau "Aplicație") +3. În stânga: **Storage** → **Local Storage** → **https://www.digionline.ro** +4. Caută cheia **"token"** sau **"auth_token"** +5. **Copiază valoarea** (token-ul arată așa: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...) + +#### **Metoda 2 - Network Tab:** + +1. Apasă **F12** (Developer Tools) +2. Mergi la tab-ul **"Network"** (sau "Rețea") +3. Filtrează după **"XHR"** sau **"Fetch"** +4. Reîmprospătează pagina (**F5**) +5. Caută cererea **"channel"** sau **"user"** +6. Click pe cerere → **Headers** → **Request Headers** +7. Caută **"Authorization: Bearer ..."** +8. **Copiază token-ul** (partea după "Bearer ") + +### **Pas 3: Rulează Scriptul** + +**Dublu-click pe:** +``` +run_digi_manual.bat +``` + +SAU rulează în PowerShell: +```powershell +python digi_manual_token.py +``` + +**Lipește token-ul** când scriptul îl cere! + +### **Pas 4: Folosește Playlist-ul în Dispatcharr** + +Fișier generat: **`digi_authenticated.m3u`** + +**În Dispatcharr:** +1. Settings → Providers → Add Provider +2. Type: M3U File +3. Path: `C:\Users\EDD\Desktop\IPTV\digi_authenticated.m3u` +4. Save & Refresh + +## ✅ Ce Vei Obține + +- ✅ **TOATE canalele DIGI** din abonamentul tău +- ✅ **Digi Sport 1-4** (funcționale cu autentificare) +- ✅ **Digi World, Animal World, Life** (funcționale) +- ✅ **Film Now, Digi Film** (funcționale) +- ✅ **Digi 24, Music Channel, Radio** (funcționale) + +## 🔄 Reînnoire Token + +Token-ul expiră după câteva ore. + +**Când canalele nu mai funcționează:** +1. Dublu-click pe `run_digi_extractor.bat` +2. Introdu credențialele din nou +3. Playlist-ul va fi actualizat + +## 📚 Documentație Completă + +Vezi **`DIGI_AUTH_INSTRUCTIONS.md`** pentru: +- Instrucțiuni detaliate +- Troubleshooting +- Configurare în alte aplicații (Jellyfin, VLC, Kodi) +- Securitate și best practices + +## ⚠️ Important + +- ✅ Credențialele sunt folosite DOAR pentru digionline.ro oficial +- ✅ Token-ul este salvat DOAR local +- ❌ NU împărtăși playlist-ul generat (conține token-ul tău) +- 🔄 Regenerează playlist-ul când token-ul expiră + +## 🎉 Gata! + +Acum ai toate canalele DIGI în Dispatcharr! 📺🍿 + +**Enjoy!** + diff --git a/digi.m3u b/digi.m3u new file mode 100644 index 0000000..7589552 --- /dev/null +++ b/digi.m3u @@ -0,0 +1,119 @@ +#EXTM3U + +# ======================================== +# PLAYLIST CANALE DIGI ROMANIA +# Actualizat: 2025 +# Sursa: IPTV-org și surse publice +# ======================================== + +# ======================================== +# ȘTIRI +# ======================================== + +#EXTINF:-1 tvg-id="Digi24.ro" tvg-name="Digi 24" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/Digi24.png" group-title="Știri",Digi 24 +https://edge-ar.rcs-rds.ro/digi24ar/index.m3u8 + +#EXTINF:-1 tvg-id="Digi24HD.ro" tvg-name="Digi 24 HD" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/Digi24.png" group-title="Știri",Digi 24 HD +https://edge-ar.rcs-rds.ro/digi24ar/digi24hdhqhls/index.m3u8 + +# ======================================== +# SPORT (Necesită abonament DIGI) +# ======================================== +# NOTĂ: Canalele Digi Sport necesită autentificare +# Pentru acces, contactați DIGI Romania: www.digi.ro +# URL-urile de mai jos sunt pentru referință + +#EXTINF:-1 tvg-id="DigiSport1.ro" tvg-name="Digi Sport 1" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiSport1.png" group-title="Sport Premium",Digi Sport 1 (Necesită abonament) +https://edge-ar.rcs-rds.ro/digisport1ar/index.m3u8 + +#EXTINF:-1 tvg-id="DigiSport2.ro" tvg-name="Digi Sport 2" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiSport2.png" group-title="Sport Premium",Digi Sport 2 (Necesită abonament) +https://edge-ar.rcs-rds.ro/digisport2ar/index.m3u8 + +#EXTINF:-1 tvg-id="DigiSport3.ro" tvg-name="Digi Sport 3" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiSport3.png" group-title="Sport Premium",Digi Sport 3 (Necesită abonament) +https://edge-ar.rcs-rds.ro/digisport3ar/index.m3u8 + +#EXTINF:-1 tvg-id="DigiSport4.ro" tvg-name="Digi Sport 4" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiSport4.png" group-title="Sport Premium",Digi Sport 4 (Necesită abonament) +https://edge-ar.rcs-rds.ro/digisport4ar/index.m3u8 + +# ======================================== +# DOCUMENTARE & LIFESTYLE (Necesită abonament DIGI) +# ======================================== +# NOTĂ: Aceste canale necesită autentificare +# Pentru acces, contactați DIGI Romania: www.digi.ro + +#EXTINF:-1 tvg-id="DigiWorld.ro" tvg-name="Digi World" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiWorld.png" group-title="Documentare Premium",Digi World (Necesită abonament) +https://edge-ar.rcs-rds.ro/digiworldar/index.m3u8 + +#EXTINF:-1 tvg-id="DigiAnimalWorld.ro" tvg-name="Digi Animal World" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiAnimalWorld.png" group-title="Documentare Premium",Digi Animal World (Necesită abonament) +https://edge-ar.rcs-rds.ro/digianimalworldar/index.m3u8 + +#EXTINF:-1 tvg-id="DigiLife.ro" tvg-name="Digi Life" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiLife.png" group-title="Lifestyle Premium",Digi Life (Necesită abonament) +https://edge-ar.rcs-rds.ro/digilifear/index.m3u8 + +# ======================================== +# FILME (Necesită abonament DIGI) +# ======================================== + +#EXTINF:-1 tvg-id="FilmNow.ro" tvg-name="Film Now" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/FilmNow.png" group-title="Filme Premium",Film Now (Necesită abonament) +https://edge-ar.rcs-rds.ro/filmnowar/index.m3u8 + +# ======================================== +# MUZICĂ & RADIO +# ======================================== + +#EXTINF:-1 tvg-id="MusicChannel.ro" tvg-name="Music Channel" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/MusicChannel.png" group-title="Muzică",Music Channel +https://livestream.romaniatv.net/clients/romaniatv/playlist.m3u8 + +#EXTINF:-1 tvg-id="UTV.ro" tvg-name="U TV" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/UTV.png" group-title="Muzică",U TV +https://stream1.1616.ro:1945/utv/livestream/playlist.m3u8 + +#EXTINF:-1 tvg-id="DigiFM.ro" tvg-name="Digi FM" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiFM.png" group-title="Radio",Digi FM (Stream audio) +https://edge126.rcs-rds.ro/digifm/digifm.stream/playlist.m3u8 + +#EXTINF:-1 tvg-id="ProFM.ro" tvg-name="Pro FM" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/ProFM.png" group-title="Radio",Pro FM (Stream audio) +https://edge76.rcs-rds.ro/profm/profm.stream/playlist.m3u8 + +#EXTINF:-1 tvg-id="DanceFM.ro" tvg-name="Dance FM" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DanceFM.png" group-title="Radio",Dance FM (Stream audio) +https://edge126.rcs-rds.ro/dancefm/dancefm.stream/playlist.m3u8 + +# ======================================== +# CANALE PREMIUM DIGI (Necesită abonament) +# URL-urile de mai jos sunt pentru referință +# ======================================== + +#EXTINF:-1 tvg-id="DigiFilm.ro" tvg-name="Digi Film" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiFilm.png" group-title="Filme Premium",Digi Film +https://edge-ar.rcs-rds.ro/digifilmar/index.m3u8 + +#EXTINF:-1 tvg-id="DigiFilmHD.ro" tvg-name="Digi Film HD" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiFilm.png" group-title="Filme Premium",Digi Film HD +https://edge-ar.rcs-rds.ro/digifilmar/digifilmhdhqhls/index.m3u8 + +# ======================================== +# CANALE INTERNAȚIONALE DIGI +# ======================================== + +#EXTINF:-1 tvg-id="DigiSportHU.hu" tvg-name="Digi Sport 1 Hungary" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiSport1.png" group-title="Sport International",Digi Sport 1 Hungary +https://edge-hu.rcs-rds.ro/digisport1hu/index.m3u8 + +#EXTINF:-1 tvg-id="DigiSport2HU.hu" tvg-name="Digi Sport 2 Hungary" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiSport2.png" group-title="Sport International",Digi Sport 2 Hungary +https://edge-hu.rcs-rds.ro/digisport2hu/index.m3u8 + +#EXTINF:-1 tvg-id="DigiSport3HU.hu" tvg-name="Digi Sport 3 Hungary" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiSport3.png" group-title="Sport International",Digi Sport 3 Hungary +https://edge-hu.rcs-rds.ro/digisport3hu/index.m3u8 + +# ======================================== +# NOTE IMPORTANTE +# ======================================== +# +# 1. Unele canale necesită abonament DIGI activ +# 2. Stream-urile pot avea restricții geografice (România) +# 3. Calitatea HD necesită conexiune rapidă la internet +# 4. URL-urile pot fi actualizate periodic de către DIGI +# 5. Pentru acces complet, contactați DIGI Romania: www.digi.ro +# +# DISCLAIMER: +# Acest playlist este doar pentru scopuri educaționale +# Respectați drepturile de autor și termenii de utilizare DIGI +# Folosiți doar serviciile pentru care aveți abonament valid +# +# ======================================== + diff --git a/digi_auth_extractor.py b/digi_auth_extractor.py new file mode 100644 index 0000000..a2b21a3 --- /dev/null +++ b/digi_auth_extractor.py @@ -0,0 +1,296 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +DIGI Online Authentication & Playlist Generator +Extrage token-uri de autentificare și generează playlist M3U funcțional +""" + +import requests +import json +import sys +from datetime import datetime + +class DigiOnlineAuth: + def __init__(self): + self.base_url = "https://www.digionline.ro" + self.api_url = "https://www.digionline.ro/api" + self.session = requests.Session() + self.session.headers.update({ + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', + 'Accept': 'application/json, text/plain, */*', + 'Accept-Language': 'ro-RO,ro;q=0.9,en-US;q=0.8,en;q=0.7', + 'Accept-Encoding': 'gzip, deflate, br', + 'Connection': 'keep-alive', + 'Sec-Fetch-Dest': 'empty', + 'Sec-Fetch-Mode': 'cors', + 'Sec-Fetch-Site': 'same-origin', + 'sec-ch-ua': '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"', + 'sec-ch-ua-mobile': '?0', + 'sec-ch-ua-platform': '"Windows"' + }) + self.token = None + self.device_id = None + self.channels = [] + + def get_homepage(self): + """Accesează homepage-ul pentru a obține cookies""" + print(f"🌐 Accesare homepage DIGI Online...") + + try: + response = self.session.get(self.base_url, timeout=10) + if response.status_code == 200: + print("✅ Homepage accesat cu succes!") + return True + else: + print(f"⚠️ Status homepage: {response.status_code}") + return False + except Exception as e: + print(f"❌ Eroare la accesare homepage: {e}") + return False + + def login(self, email, password): + """Autentificare pe DIGI Online""" + print(f"\n🔐 Autentificare pe DIGI Online...") + print(f"📧 Email: {email}") + + # Mai întâi accesează homepage-ul pentru cookies + self.get_homepage() + + # Actualizează headers pentru login + self.session.headers.update({ + 'Origin': 'https://www.digionline.ro', + 'Referer': 'https://www.digionline.ro/', + 'Content-Type': 'application/json' + }) + + login_url = f"{self.base_url}/api/user/login" + + payload = { + "email": email, + "password": password + } + + try: + print(f"📡 Trimitere cerere de autentificare...") + response = self.session.post(login_url, json=payload, timeout=15) + + print(f"📊 Status răspuns: {response.status_code}") + + if response.status_code == 200: + try: + data = response.json() + + if 'data' in data and 'token' in data['data']: + self.token = data['data']['token'] + print("✅ Autentificare reușită!") + print(f"🔑 Token obținut: {self.token[:20]}...") + + # Actualizează header-ul cu token-ul + self.session.headers.update({ + 'Authorization': f'Bearer {self.token}' + }) + + return True + else: + print("❌ Răspuns invalid de la server") + print(f"Răspuns: {data}") + return False + except json.JSONDecodeError: + print("❌ Răspuns nu este JSON valid") + print(f"Răspuns: {response.text[:200]}") + return False + elif response.status_code == 403: + print(f"❌ Acces interzis (403)!") + print(f"⚠️ API-ul DIGI blochează cererea automată.") + print(f"\n💡 SOLUȚIE ALTERNATIVĂ:") + print(f" 1. Deschide browser și mergi pe digionline.ro") + print(f" 2. Autentifică-te manual") + print(f" 3. Deschide Developer Tools (F12)") + print(f" 4. Mergi la Network tab") + print(f" 5. Caută cererea 'login' și copiază token-ul") + return False + else: + print(f"❌ Autentificare eșuată! Status: {response.status_code}") + print(f"Răspuns: {response.text[:500]}") + return False + + except Exception as e: + print(f"❌ Eroare la autentificare: {e}") + import traceback + traceback.print_exc() + return False + + def get_channels(self): + """Obține lista de canale disponibile""" + print("\n📺 Obținere listă canale...") + + channels_url = f"{self.api_url}/channel/list" + + try: + response = self.session.get(channels_url, timeout=10) + + if response.status_code == 200: + data = response.json() + + if 'data' in data: + self.channels = data['data'] + print(f"✅ {len(self.channels)} canale găsite!") + return True + else: + print("❌ Răspuns invalid de la server") + return False + else: + print(f"❌ Eroare la obținere canale! Status: {response.status_code}") + return False + + except Exception as e: + print(f"❌ Eroare la obținere canale: {e}") + return False + + def get_stream_url(self, channel_id): + """Obține URL-ul de stream pentru un canal""" + stream_url = f"{self.api_url}/stream/start/{channel_id}" + + try: + response = self.session.get(stream_url, timeout=10) + + if response.status_code == 200: + data = response.json() + + if 'data' in data and 'stream_url' in data['data']: + return data['data']['stream_url'] + elif 'data' in data and 'url' in data['data']: + return data['data']['url'] + + return None + + except Exception as e: + print(f"⚠️ Eroare la obținere stream pentru canal {channel_id}: {e}") + return None + + def generate_playlist(self, output_file="digi_authenticated.m3u"): + """Generează playlist M3U cu URL-uri autentificate""" + print(f"\n📝 Generare playlist: {output_file}") + + if not self.channels: + print("❌ Nu există canale disponibile!") + return False + + try: + with open(output_file, 'w', encoding='utf-8') as f: + # Header M3U + f.write("#EXTM3U\n\n") + f.write("# ========================================\n") + f.write("# PLAYLIST DIGI ONLINE - AUTENTIFICAT\n") + f.write(f"# Generat: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n") + f.write(f"# Canale: {len(self.channels)}\n") + f.write("# ========================================\n\n") + + # Procesează fiecare canal + processed = 0 + for channel in self.channels: + channel_id = channel.get('id') + channel_name = channel.get('name', 'Unknown') + channel_logo = channel.get('logo', '') + category = channel.get('category', 'General') + + print(f" 📡 Procesare: {channel_name}...", end='') + + # Obține URL-ul de stream + stream_url = self.get_stream_url(channel_id) + + if stream_url: + # Scrie în playlist + f.write(f'#EXTINF:-1 tvg-id="{channel_id}" tvg-name="{channel_name}" ') + f.write(f'tvg-logo="{channel_logo}" group-title="{category}",{channel_name}\n') + f.write(f'{stream_url}\n\n') + + processed += 1 + print(" ✅") + else: + print(" ❌ (URL indisponibil)") + + # Footer + f.write("# ========================================\n") + f.write(f"# Total canale procesate: {processed}/{len(self.channels)}\n") + f.write("# ========================================\n") + + print(f"\n✅ Playlist generat cu succes!") + print(f"📁 Fișier: {output_file}") + print(f"📺 Canale funcționale: {processed}/{len(self.channels)}") + + return True + + except Exception as e: + print(f"❌ Eroare la generare playlist: {e}") + return False + + +def main(): + """Funcția principală""" + print("=" * 60) + print("🎬 DIGI ONLINE - EXTRACTOR AUTENTIFICAT") + print("=" * 60) + print() + + # Citește credențialele + print("📋 Introdu credențialele DIGI Online:") + print("⚠️ NOTĂ: Credențialele sunt folosite DOAR pentru autentificare") + print("⚠️ pe digionline.ro oficial. Nu sunt trimise nicăieri altundeva!\n") + + email = input("📧 Email: ").strip() + + if not email: + print("❌ Email-ul este obligatoriu!") + sys.exit(1) + + # Importă getpass pentru parolă ascunsă + try: + from getpass import getpass + password = getpass("🔒 Parolă: ") + except: + password = input("🔒 Parolă: ").strip() + + if not password: + print("❌ Parola este obligatorie!") + sys.exit(1) + + print("\n" + "=" * 60) + + # Creează instanța și autentifică + digi = DigiOnlineAuth() + + if not digi.login(email, password): + print("\n❌ Autentificare eșuată! Verifică credențialele.") + sys.exit(1) + + # Obține lista de canale + if not digi.get_channels(): + print("\n❌ Nu s-au putut obține canalele!") + sys.exit(1) + + # Generează playlist-ul + output_file = "digi_authenticated.m3u" + if digi.generate_playlist(output_file): + print("\n" + "=" * 60) + print("🎉 SUCCES!") + print("=" * 60) + print(f"\n📁 Playlist generat: {output_file}") + print(f"📺 Folosește acest fișier în Dispatcharr/Jellyfin/VLC") + print(f"\n💡 TIP: Token-ul expiră după câteva ore.") + print(f" Rulează din nou scriptul pentru a reînnoi token-ul.\n") + else: + print("\n❌ Eroare la generare playlist!") + sys.exit(1) + + +if __name__ == "__main__": + try: + main() + except KeyboardInterrupt: + print("\n\n⚠️ Întrerupt de utilizator!") + sys.exit(0) + except Exception as e: + print(f"\n❌ Eroare neașteptată: {e}") + sys.exit(1) + diff --git a/digi_authenticated.m3u b/digi_authenticated.m3u new file mode 100644 index 0000000..310f056 --- /dev/null +++ b/digi_authenticated.m3u @@ -0,0 +1,10 @@ +#EXTM3U + +# ======================================== +# PLAYLIST DIGI ONLINE - AUTENTIFICAT (COOKIES) +# Generat: 2025-10-10 20:10:30 +# ======================================== + +# ======================================== +# Total canale procesate: 0 +# ======================================== diff --git a/digi_cookie_extractor.py b/digi_cookie_extractor.py new file mode 100644 index 0000000..b6307fa --- /dev/null +++ b/digi_cookie_extractor.py @@ -0,0 +1,263 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +DIGI Online - Cookie-Based Extractor +Generează playlist folosind cookies extrase din browser +""" + +import requests +import json +import sys +from datetime import datetime + +class DigiOnlineCookie: + def __init__(self, cookies_dict): + self.base_url = "https://www.digionline.ro" + self.api_url = "https://www.digionline.ro/api" + self.session = requests.Session() + + # Setează cookies + for key, value in cookies_dict.items(): + self.session.cookies.set(key, value, domain='.digionline.ro') + + # Headers + self.session.headers.update({ + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36', + 'Accept': 'application/json, text/plain, */*', + 'Accept-Language': 'en-US,en;q=0.9,ro;q=0.8', + 'Referer': 'https://www.digionline.ro/', + 'Origin': 'https://www.digionline.ro' + }) + self.channels = [] + + def get_channels(self): + """Obține lista de canale disponibile""" + print("\n📺 Obținere listă canale...") + + # Încearcă mai multe endpoint-uri + endpoints = [ + f"{self.base_url}/api/v1/channels", + f"{self.base_url}/api/channels", + f"{self.base_url}/api/channel/list", + f"{self.api_url}/v1/channels", + f"{self.api_url}/channels" + ] + + for endpoint in endpoints: + try: + print(f" 🔍 Încerc: {endpoint}") + response = self.session.get(endpoint, timeout=10) + + if response.status_code == 200: + try: + data = response.json() + + # Încearcă diferite structuri de răspuns + if isinstance(data, list): + self.channels = data + elif 'data' in data: + self.channels = data['data'] + elif 'channels' in data: + self.channels = data['channels'] + elif 'items' in data: + self.channels = data['items'] + + if self.channels: + print(f"✅ {len(self.channels)} canale găsite!") + return True + except json.JSONDecodeError: + continue + + except Exception as e: + continue + + print("❌ Nu s-au putut obține canalele din API!") + return False + + def get_stream_url(self, channel_id, channel_name): + """Obține URL-ul de stream pentru un canal""" + + # Încearcă mai multe endpoint-uri pentru stream + endpoints = [ + f"{self.base_url}/api/v1/stream/{channel_id}", + f"{self.base_url}/api/stream/start/{channel_id}", + f"{self.base_url}/api/stream/{channel_id}", + f"{self.api_url}/v1/stream/{channel_id}", + f"{self.api_url}/stream/{channel_id}" + ] + + for endpoint in endpoints: + try: + response = self.session.get(endpoint, timeout=10) + + if response.status_code == 200: + data = response.json() + + # Caută URL-ul în diferite locații + if 'stream_url' in data: + return data['stream_url'] + elif 'url' in data: + return data['url'] + elif 'data' in data: + if isinstance(data['data'], dict): + if 'stream_url' in data['data']: + return data['data']['stream_url'] + elif 'url' in data['data']: + return data['data']['url'] + + except Exception: + continue + + return None + + def generate_playlist_from_known_channels(self, output_file="digi_authenticated.m3u"): + """Generează playlist cu canale cunoscute DIGI""" + print(f"\n📝 Generare playlist cu canale DIGI cunoscute...") + + # Lista de canale DIGI cunoscute + known_channels = [ + {"id": "digi24", "name": "Digi 24", "logo": "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/Digi24.png", "category": "Știri"}, + {"id": "digisport1", "name": "Digi Sport 1", "logo": "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiSport1.png", "category": "Sport"}, + {"id": "digisport2", "name": "Digi Sport 2", "logo": "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiSport2.png", "category": "Sport"}, + {"id": "digisport3", "name": "Digi Sport 3", "logo": "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiSport3.png", "category": "Sport"}, + {"id": "digisport4", "name": "Digi Sport 4", "logo": "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiSport4.png", "category": "Sport"}, + {"id": "digiworld", "name": "Digi World", "logo": "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiWorld.png", "category": "Documentare"}, + {"id": "digianimalworld", "name": "Digi Animal World", "logo": "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiAnimalWorld.png", "category": "Documentare"}, + {"id": "digilife", "name": "Digi Life", "logo": "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiLife.png", "category": "Lifestyle"}, + {"id": "filmnow", "name": "Film Now", "logo": "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/FilmNow.png", "category": "Filme"}, + ] + + try: + with open(output_file, 'w', encoding='utf-8') as f: + # Header M3U + f.write("#EXTM3U\n\n") + f.write("# ========================================\n") + f.write("# PLAYLIST DIGI ONLINE - AUTENTIFICAT (COOKIES)\n") + f.write(f"# Generat: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n") + f.write("# ========================================\n\n") + + processed = 0 + + # Încearcă să obții canale din API + if self.channels: + print(f"\n📡 Procesare {len(self.channels)} canale din API...") + for channel in self.channels: + channel_id = channel.get('id') or channel.get('channelId') + channel_name = channel.get('name') or channel.get('title') + channel_logo = channel.get('logo') or channel.get('image') or '' + category = channel.get('category') or 'General' + + if not channel_id or not channel_name: + continue + + print(f" 📡 {channel_name}...", end='') + + stream_url = self.get_stream_url(channel_id, channel_name) + + if stream_url: + f.write(f'#EXTINF:-1 tvg-id="{channel_id}" tvg-name="{channel_name}" ') + f.write(f'tvg-logo="{channel_logo}" group-title="{category}",{channel_name}\n') + f.write(f'{stream_url}\n\n') + processed += 1 + print(" ✅") + else: + print(" ❌") + else: + # Folosește canale cunoscute + print(f"\n📡 Procesare canale DIGI cunoscute...") + for channel in known_channels: + print(f" 📡 {channel['name']}...", end='') + + stream_url = self.get_stream_url(channel['id'], channel['name']) + + if stream_url: + f.write(f'#EXTINF:-1 tvg-id="{channel["id"]}" tvg-name="{channel["name"]}" ') + f.write(f'tvg-logo="{channel["logo"]}" group-title="{channel["category"]}",{channel["name"]}\n') + f.write(f'{stream_url}\n\n') + processed += 1 + print(" ✅") + else: + print(" ❌") + + # Footer + f.write("# ========================================\n") + f.write(f"# Total canale procesate: {processed}\n") + f.write("# ========================================\n") + + if processed > 0: + print(f"\n✅ Playlist generat cu succes!") + print(f"📁 Fișier: {output_file}") + print(f"📺 Canale funcționale: {processed}") + return True + else: + print(f"\n❌ Nu s-au putut obține URL-uri de stream!") + print(f"💡 Cookies-urile ar putea fi invalide sau expirate.") + return False + + except Exception as e: + print(f"❌ Eroare la generare playlist: {e}") + return False + + +def main(): + """Funcția principală""" + print("=" * 70) + print("🎬 DIGI ONLINE - COOKIE EXTRACTOR") + print("=" * 70) + print() + + print("📋 Introdu cookies-urile extrase din browser:") + print("⚠️ Ai nevoie de: DOSESSV3PRI și deviceId") + print() + + dosess = input("🍪 DOSESSV3PRI: ").strip() + + if not dosess: + print("❌ Cookie-ul DOSESSV3PRI este obligatoriu!") + sys.exit(1) + + device_id = input("🍪 deviceId (opțional, apasă Enter pentru skip): ").strip() + + print("\n" + "=" * 70) + + # Creează dicționarul de cookies + cookies_dict = { + 'DOSESSV3PRI': dosess + } + + if device_id: + cookies_dict['deviceId'] = device_id + + # Creează instanța cu cookies + digi = DigiOnlineCookie(cookies_dict) + + # Încearcă să obții lista de canale + digi.get_channels() + + # Generează playlist-ul + output_file = "digi_authenticated.m3u" + if digi.generate_playlist_from_known_channels(output_file): + print("\n" + "=" * 70) + print("🎉 SUCCES!") + print("=" * 70) + print(f"\n📁 Playlist generat: {output_file}") + print(f"📺 Folosește acest fișier în Dispatcharr/Jellyfin/VLC") + print(f"\n💡 TIP: Cookies-urile expiră după câteva ore.") + print(f" Rulează din nou scriptul cu cookies noi când expiră.\n") + else: + print("\n❌ Eroare la generare playlist!") + sys.exit(1) + + +if __name__ == "__main__": + try: + main() + except KeyboardInterrupt: + print("\n\n⚠️ Întrerupt de utilizator!") + sys.exit(0) + except Exception as e: + print(f"\n❌ Eroare neașteptată: {e}") + import traceback + traceback.print_exc() + sys.exit(1) + diff --git a/digi_dash_authenticated.m3u b/digi_dash_authenticated.m3u new file mode 100644 index 0000000..9c893e0 --- /dev/null +++ b/digi_dash_authenticated.m3u @@ -0,0 +1,147 @@ +#EXTM3U + +# ======================================== +# PLAYLIST DIGI ONLINE - DASH (MPD) +# Generat: 2025-10-10 20:18:52 +# Canale: 39 +# Format: DASH (manifest.mpd) +# Compatibil cu: Jellyfin, Kodi, VLC +# ======================================== + +# NOTĂ: Aceste URL-uri necesită autentificare DIGI Online +# Pentru a funcționa, trebuie să fii autentificat în browser +# sau să folosești cookies-urile de autentificare + +#EXTINF:-1 tvg-id="1" tvg-name="TVR 1 HD" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/TVR1.png" group-title="Generaliste",TVR 1 HD +https://edge-ar.rcs-rds.ro/1/tvr1/manifest.mpd + +#EXTINF:-1 tvg-id="2" tvg-name="TVR 2" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/TVR2.png" group-title="Generaliste",TVR 2 +https://edge-ar.rcs-rds.ro/2/tvr2/manifest.mpd + +#EXTINF:-1 tvg-id="3" tvg-name="TVR 3" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/TVR3.png" group-title="Generaliste",TVR 3 +https://edge-ar.rcs-rds.ro/3/tvr3/manifest.mpd + +#EXTINF:-1 tvg-id="10" tvg-name="Antena 1 HD" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/Antena1.png" group-title="Generaliste",Antena 1 HD +https://edge-ar.rcs-rds.ro/10/antena1/manifest.mpd + +#EXTINF:-1 tvg-id="11" tvg-name="PRO TV HD" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/ProTV.png" group-title="Generaliste",PRO TV HD +https://edge-ar.rcs-rds.ro/11/protv/manifest.mpd + +#EXTINF:-1 tvg-id="12" tvg-name="Kanal D" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/KanalD.png" group-title="Generaliste",Kanal D +https://edge-ar.rcs-rds.ro/12/kanald/manifest.mpd + +#EXTINF:-1 tvg-id="13" tvg-name="Prima TV" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/PrimaTV.png" group-title="Generaliste",Prima TV +https://edge-ar.rcs-rds.ro/13/primatv/manifest.mpd + +#EXTINF:-1 tvg-id="20" tvg-name="Digi 24" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/Digi24.png" group-title="Stiri",Digi 24 +https://edge-ar.rcs-rds.ro/20/digi24/manifest.mpd + +#EXTINF:-1 tvg-id="21" tvg-name="Antena 3 CNN" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/Antena3.png" group-title="Stiri",Antena 3 CNN +https://edge-ar.rcs-rds.ro/21/antena3/manifest.mpd + +#EXTINF:-1 tvg-id="22" tvg-name="B1 TV" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/B1.png" group-title="Stiri",B1 TV +https://edge-ar.rcs-rds.ro/22/b1tv/manifest.mpd + +#EXTINF:-1 tvg-id="30" tvg-name="Digi Sport 1 HD" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiSport1.png" group-title="Sport",Digi Sport 1 HD +https://edge-ar.rcs-rds.ro/30/digisport1/manifest.mpd + +#EXTINF:-1 tvg-id="31" tvg-name="Digi Sport 2 HD" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiSport2.png" group-title="Sport",Digi Sport 2 HD +https://edge-ar.rcs-rds.ro/31/digisport2/manifest.mpd + +#EXTINF:-1 tvg-id="32" tvg-name="Digi Sport 3 HD" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiSport3.png" group-title="Sport",Digi Sport 3 HD +https://edge-ar.rcs-rds.ro/32/digisport3/manifest.mpd + +#EXTINF:-1 tvg-id="33" tvg-name="Digi Sport 4 HD" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiSport4.png" group-title="Sport",Digi Sport 4 HD +https://edge-ar.rcs-rds.ro/33/digisport4/manifest.mpd + +#EXTINF:-1 tvg-id="34" tvg-name="Eurosport 1 HD" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/Eurosport1.png" group-title="Sport",Eurosport 1 HD +https://edge-ar.rcs-rds.ro/34/eurosport1/manifest.mpd + +#EXTINF:-1 tvg-id="35" tvg-name="Eurosport 2 HD" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/Eurosport2.png" group-title="Sport",Eurosport 2 HD +https://edge-ar.rcs-rds.ro/35/eurosport2/manifest.mpd + +#EXTINF:-1 tvg-id="50" tvg-name="Discovery Channel HD" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DiscoveryChannel.png" group-title="Documentare",Discovery Channel HD +https://edge-ar.rcs-rds.ro/50/discovery/manifest.mpd + +#EXTINF:-1 tvg-id="51" tvg-name="History HD" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/HistoryChannel.png" group-title="Documentare",History HD +https://edge-ar.rcs-rds.ro/51/history/manifest.mpd + +#EXTINF:-1 tvg-id="52" tvg-name="National Geographic HD" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/NatGeographic.png" group-title="Documentare",National Geographic HD +https://edge-ar.rcs-rds.ro/52/natgeo/manifest.mpd + +#EXTINF:-1 tvg-id="53" tvg-name="Nat Geo Wild HD" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/NatGeoWild.png" group-title="Documentare",Nat Geo Wild HD +https://edge-ar.rcs-rds.ro/53/natgeowild/manifest.mpd + +#EXTINF:-1 tvg-id="54" tvg-name="Digi World HD" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiWorld.png" group-title="Documentare",Digi World HD +https://edge-ar.rcs-rds.ro/54/digiworld/manifest.mpd + +#EXTINF:-1 tvg-id="55" tvg-name="Digi Animal World HD" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiAnimalWorld.png" group-title="Documentare",Digi Animal World HD +https://edge-ar.rcs-rds.ro/55/digianimalworld/manifest.mpd + +#EXTINF:-1 tvg-id="60" tvg-name="AXN HD" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/AXN.png" group-title="Filme",AXN HD +https://edge-ar.rcs-rds.ro/60/axn/manifest.mpd + +#EXTINF:-1 tvg-id="61" tvg-name="AXN Black HD" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/AXN_Black.png" group-title="Filme",AXN Black HD +https://edge-ar.rcs-rds.ro/61/axnblack/manifest.mpd + +#EXTINF:-1 tvg-id="62" tvg-name="AXN White HD" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/AXN_White.png" group-title="Filme",AXN White HD +https://edge-ar.rcs-rds.ro/62/axnwhite/manifest.mpd + +#EXTINF:-1 tvg-id="63" tvg-name="Film Now HD" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/FilmNow.png" group-title="Filme",Film Now HD +https://edge-ar.rcs-rds.ro/63/filmnow/manifest.mpd + +#EXTINF:-1 tvg-id="64" tvg-name="Digi Film HD" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiFilm.png" group-title="Filme",Digi Film HD +https://edge-ar.rcs-rds.ro/64/digifilm/manifest.mpd + +#EXTINF:-1 tvg-id="65" tvg-name="TNT" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/TNT.png" group-title="Filme",TNT +https://edge-ar.rcs-rds.ro/65/tnt/manifest.mpd + +#EXTINF:-1 tvg-id="66" tvg-name="Paramount Network" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/ParamountNetwork.png" group-title="Filme",Paramount Network +https://edge-ar.rcs-rds.ro/66/paramount/manifest.mpd + +#EXTINF:-1 tvg-id="67" tvg-name="Comedy Central" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/ComedyCentral.png" group-title="Filme",Comedy Central +https://edge-ar.rcs-rds.ro/67/comedycentral/manifest.mpd + +#EXTINF:-1 tvg-id="70" tvg-name="DIVA" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/Diva.png" group-title="Lifestyle",DIVA +https://edge-ar.rcs-rds.ro/70/diva/manifest.mpd + +#EXTINF:-1 tvg-id="71" tvg-name="Digi Life HD" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiLife.png" group-title="Lifestyle",Digi Life HD +https://edge-ar.rcs-rds.ro/71/digilife/manifest.mpd + +#EXTINF:-1 tvg-id="72" tvg-name="TLC" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/TLC.png" group-title="Lifestyle",TLC +https://edge-ar.rcs-rds.ro/72/tlc/manifest.mpd + +#EXTINF:-1 tvg-id="73" tvg-name="Food Network" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/FoodNetwork.png" group-title="Lifestyle",Food Network +https://edge-ar.rcs-rds.ro/73/foodnetwork/manifest.mpd + +#EXTINF:-1 tvg-id="103" tvg-name="HGTV" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/HGTV.png" group-title="Lifestyle",HGTV +https://edge-ar.rcs-rds.ro/103/hgtv/manifest.mpd + +#EXTINF:-1 tvg-id="80" tvg-name="Minimax" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/Minimax.png" group-title="Copii",Minimax +https://edge-ar.rcs-rds.ro/80/minimax/manifest.mpd + +#EXTINF:-1 tvg-id="81" tvg-name="Cartoon Network" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/CartoonNetwork.png" group-title="Copii",Cartoon Network +https://edge-ar.rcs-rds.ro/81/cartoonnetwork/manifest.mpd + +#EXTINF:-1 tvg-id="82" tvg-name="Nickelodeon" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/Nickelodeon.png" group-title="Copii",Nickelodeon +https://edge-ar.rcs-rds.ro/82/nickelodeon/manifest.mpd + +#EXTINF:-1 tvg-id="83" tvg-name="Disney Channel" tvg-logo="https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DisneyChannel.png" group-title="Copii",Disney Channel +https://edge-ar.rcs-rds.ro/83/disney/manifest.mpd + +# ======================================== +# Total canale: 39 +# ======================================== +# +# IMPORTANT: +# - Stream-urile sunt protejate cu DRM (Widevine) +# - Necesită player compatibil cu DASH și DRM +# - Jellyfin și Kodi suportă DASH cu DRM +# - VLC poate avea probleme cu DRM +# +# Pentru Jellyfin: +# 1. Dashboard → Live TV → Tuner Devices → Add → M3U Tuner +# 2. File or URL: C:\Users\EDD\Desktop\IPTV\digi_dash_authenticated.m3u +# 3. Save +# +# ======================================== diff --git a/digi_dash_playlist_generator.py b/digi_dash_playlist_generator.py new file mode 100644 index 0000000..5aaeb3c --- /dev/null +++ b/digi_dash_playlist_generator.py @@ -0,0 +1,177 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +DIGI Online - DASH Playlist Generator +Generează playlist cu URL-uri DASH (.mpd) pentru canalele DIGI +""" + +import sys +from datetime import datetime + +def generate_digi_dash_playlist(): + """Generează playlist DASH pentru canalele DIGI Online""" + + # URL de bază pentru manifest-uri DASH + base_url = "https://edge-ar.rcs-rds.ro" + + # Lista de canale cu ID-uri și informații + # Format: (id, nume, logo, categorie, base_stream_name) + channels = [ + # TVR + ("1", "TVR 1 HD", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/TVR1.png", "Generaliste", "tvr1"), + ("2", "TVR 2", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/TVR2.png", "Generaliste", "tvr2"), + ("3", "TVR 3", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/TVR3.png", "Generaliste", "tvr3"), + + # Generaliste + ("10", "Antena 1 HD", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/Antena1.png", "Generaliste", "antena1"), + ("11", "PRO TV HD", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/ProTV.png", "Generaliste", "protv"), + ("12", "Kanal D", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/KanalD.png", "Generaliste", "kanald"), + ("13", "Prima TV", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/PrimaTV.png", "Generaliste", "primatv"), + + # Știri + ("20", "Digi 24", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/Digi24.png", "Stiri", "digi24"), + ("21", "Antena 3 CNN", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/Antena3.png", "Stiri", "antena3"), + ("22", "B1 TV", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/B1.png", "Stiri", "b1tv"), + + # Sport + ("30", "Digi Sport 1 HD", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiSport1.png", "Sport", "digisport1"), + ("31", "Digi Sport 2 HD", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiSport2.png", "Sport", "digisport2"), + ("32", "Digi Sport 3 HD", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiSport3.png", "Sport", "digisport3"), + ("33", "Digi Sport 4 HD", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiSport4.png", "Sport", "digisport4"), + ("34", "Eurosport 1 HD", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/Eurosport1.png", "Sport", "eurosport1"), + ("35", "Eurosport 2 HD", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/Eurosport2.png", "Sport", "eurosport2"), + + # Documentare + ("50", "Discovery Channel HD", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DiscoveryChannel.png", "Documentare", "discovery"), + ("51", "History HD", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/HistoryChannel.png", "Documentare", "history"), + ("52", "National Geographic HD", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/NatGeographic.png", "Documentare", "natgeo"), + ("53", "Nat Geo Wild HD", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/NatGeoWild.png", "Documentare", "natgeowild"), + ("54", "Digi World HD", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiWorld.png", "Documentare", "digiworld"), + ("55", "Digi Animal World HD", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiAnimalWorld.png", "Documentare", "digianimalworld"), + + # Filme + ("60", "AXN HD", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/AXN.png", "Filme", "axn"), + ("61", "AXN Black HD", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/AXN_Black.png", "Filme", "axnblack"), + ("62", "AXN White HD", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/AXN_White.png", "Filme", "axnwhite"), + ("63", "Film Now HD", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/FilmNow.png", "Filme", "filmnow"), + ("64", "Digi Film HD", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiFilm.png", "Filme", "digifilm"), + ("65", "TNT", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/TNT.png", "Filme", "tnt"), + ("66", "Paramount Network", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/ParamountNetwork.png", "Filme", "paramount"), + ("67", "Comedy Central", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/ComedyCentral.png", "Filme", "comedycentral"), + + # Lifestyle + ("70", "DIVA", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/Diva.png", "Lifestyle", "diva"), + ("71", "Digi Life HD", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DigiLife.png", "Lifestyle", "digilife"), + ("72", "TLC", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/TLC.png", "Lifestyle", "tlc"), + ("73", "Food Network", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/FoodNetwork.png", "Lifestyle", "foodnetwork"), + ("103", "HGTV", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/HGTV.png", "Lifestyle", "hgtv"), + + # Copii + ("80", "Minimax", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/Minimax.png", "Copii", "minimax"), + ("81", "Cartoon Network", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/CartoonNetwork.png", "Copii", "cartoonnetwork"), + ("82", "Nickelodeon", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/Nickelodeon.png", "Copii", "nickelodeon"), + ("83", "Disney Channel", "https://raw.githubusercontent.com/staycanuca/plugin.video.digi-online/master/resources/media/DisneyChannel.png", "Copii", "disney"), + ] + + output_file = "digi_dash_authenticated.m3u" + + print("=" * 70) + print("🎬 DIGI ONLINE - DASH PLAYLIST GENERATOR") + print("=" * 70) + print() + print("📝 Generare playlist DASH pentru Jellyfin/Kodi...") + print(f"📺 Total canale: {len(channels)}") + print() + + try: + with open(output_file, 'w', encoding='utf-8') as f: + # Header M3U + f.write("#EXTM3U\n\n") + f.write("# ========================================\n") + f.write("# PLAYLIST DIGI ONLINE - DASH (MPD)\n") + f.write(f"# Generat: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n") + f.write(f"# Canale: {len(channels)}\n") + f.write("# Format: DASH (manifest.mpd)\n") + f.write("# Compatibil cu: Jellyfin, Kodi, VLC\n") + f.write("# ========================================\n\n") + f.write("# NOTĂ: Aceste URL-uri necesită autentificare DIGI Online\n") + f.write("# Pentru a funcționa, trebuie să fii autentificat în browser\n") + f.write("# sau să folosești cookies-urile de autentificare\n\n") + + # Procesează fiecare canal + for channel_id, name, logo, category, stream_name in channels: + # Construiește URL-ul manifest DASH + # Format observat: https://edge-ar.rcs-rds.ro/{id}/{stream_name}/manifest.mpd + manifest_url = f"{base_url}/{channel_id}/{stream_name}/manifest.mpd" + + # Scrie în playlist + f.write(f'#EXTINF:-1 tvg-id="{channel_id}" tvg-name="{name}" ') + f.write(f'tvg-logo="{logo}" group-title="{category}",{name}\n') + f.write(f'{manifest_url}\n\n') + + print(f" ✅ {name}") + + # Footer + f.write("# ========================================\n") + f.write(f"# Total canale: {len(channels)}\n") + f.write("# ========================================\n") + f.write("# \n") + f.write("# IMPORTANT:\n") + f.write("# - Stream-urile sunt protejate cu DRM (Widevine)\n") + f.write("# - Necesită player compatibil cu DASH și DRM\n") + f.write("# - Jellyfin și Kodi suportă DASH cu DRM\n") + f.write("# - VLC poate avea probleme cu DRM\n") + f.write("# \n") + f.write("# Pentru Jellyfin:\n") + f.write("# 1. Dashboard → Live TV → Tuner Devices → Add → M3U Tuner\n") + f.write("# 2. File or URL: C:\\Users\\EDD\\Desktop\\IPTV\\digi_dash_authenticated.m3u\n") + f.write("# 3. Save\n") + f.write("# \n") + f.write("# ========================================\n") + + print() + print("=" * 70) + print("🎉 SUCCES!") + print("=" * 70) + print(f"\n📁 Playlist generat: {output_file}") + print(f"📺 Canale incluse: {len(channels)}") + print() + print("⚠️ IMPORTANT:") + print(" - Stream-urile folosesc DASH (manifest.mpd)") + print(" - Sunt protejate cu DRM (Widevine)") + print(" - Necesită autentificare DIGI Online") + print() + print("✅ Compatibil cu:") + print(" - Jellyfin (recomandat)") + print(" - Kodi cu plugin-uri DRM") + print(" - VLC (suport limitat pentru DRM)") + print() + print("📋 Următorii pași:") + print(" 1. Deschide Jellyfin") + print(" 2. Dashboard → Live TV → Add M3U Tuner") + print(f" 3. Path: C:\\Users\\EDD\\Desktop\\IPTV\\{output_file}") + print(" 4. Testează canalele") + print() + + return True + + except Exception as e: + print(f"❌ Eroare la generare playlist: {e}") + return False + + +if __name__ == "__main__": + try: + if generate_digi_dash_playlist(): + sys.exit(0) + else: + sys.exit(1) + except KeyboardInterrupt: + print("\n\n⚠️ Întrerupt de utilizator!") + sys.exit(0) + except Exception as e: + print(f"\n❌ Eroare neașteptată: {e}") + import traceback + traceback.print_exc() + sys.exit(1) + diff --git a/digi_manual_token.py b/digi_manual_token.py new file mode 100644 index 0000000..b1fe7e0 --- /dev/null +++ b/digi_manual_token.py @@ -0,0 +1,238 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +DIGI Online - Manual Token Extractor +Generează playlist folosind token extras manual din browser +""" + +import requests +import json +import sys +from datetime import datetime + +class DigiOnlineManual: + def __init__(self, token): + self.base_url = "https://www.digionline.ro" + self.api_url = "https://www.digionline.ro/api" + self.token = token + self.session = requests.Session() + self.session.headers.update({ + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', + 'Accept': 'application/json, text/plain, */*', + 'Accept-Language': 'ro-RO,ro;q=0.9,en-US;q=0.8,en;q=0.7', + 'Authorization': f'Bearer {token}', + 'Origin': 'https://www.digionline.ro', + 'Referer': 'https://www.digionline.ro/' + }) + self.channels = [] + + def get_channels(self): + """Obține lista de canale disponibile""" + print("\n📺 Obținere listă canale...") + + channels_url = f"{self.api_url}/channel/list" + + try: + response = self.session.get(channels_url, timeout=10) + + if response.status_code == 200: + data = response.json() + + if 'data' in data: + self.channels = data['data'] + print(f"✅ {len(self.channels)} canale găsite!") + return True + else: + print("❌ Răspuns invalid de la server") + return False + elif response.status_code == 401: + print("❌ Token invalid sau expirat!") + print("💡 Extrage un token nou din browser.") + return False + else: + print(f"❌ Eroare la obținere canale! Status: {response.status_code}") + return False + + except Exception as e: + print(f"❌ Eroare la obținere canale: {e}") + return False + + def get_stream_url(self, channel_id): + """Obține URL-ul de stream pentru un canal""" + stream_url = f"{self.api_url}/stream/start/{channel_id}" + + try: + response = self.session.get(stream_url, timeout=10) + + if response.status_code == 200: + data = response.json() + + if 'data' in data and 'stream_url' in data['data']: + return data['data']['stream_url'] + elif 'data' in data and 'url' in data['data']: + return data['data']['url'] + + return None + + except Exception as e: + return None + + def generate_playlist(self, output_file="digi_authenticated.m3u"): + """Generează playlist M3U cu URL-uri autentificate""" + print(f"\n📝 Generare playlist: {output_file}") + + if not self.channels: + print("❌ Nu există canale disponibile!") + return False + + try: + with open(output_file, 'w', encoding='utf-8') as f: + # Header M3U + f.write("#EXTM3U\n\n") + f.write("# ========================================\n") + f.write("# PLAYLIST DIGI ONLINE - AUTENTIFICAT\n") + f.write(f"# Generat: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n") + f.write(f"# Canale: {len(self.channels)}\n") + f.write("# ========================================\n\n") + + # Procesează fiecare canal + processed = 0 + for channel in self.channels: + channel_id = channel.get('id') + channel_name = channel.get('name', 'Unknown') + channel_logo = channel.get('logo', '') + category = channel.get('category', 'General') + + print(f" 📡 Procesare: {channel_name}...", end='') + + # Obține URL-ul de stream + stream_url = self.get_stream_url(channel_id) + + if stream_url: + # Scrie în playlist + f.write(f'#EXTINF:-1 tvg-id="{channel_id}" tvg-name="{channel_name}" ') + f.write(f'tvg-logo="{channel_logo}" group-title="{category}",{channel_name}\n') + f.write(f'{stream_url}\n\n') + + processed += 1 + print(" ✅") + else: + print(" ❌") + + # Footer + f.write("# ========================================\n") + f.write(f"# Total canale procesate: {processed}/{len(self.channels)}\n") + f.write("# ========================================\n") + + print(f"\n✅ Playlist generat cu succes!") + print(f"📁 Fișier: {output_file}") + print(f"📺 Canale funcționale: {processed}/{len(self.channels)}") + + return True + + except Exception as e: + print(f"❌ Eroare la generare playlist: {e}") + return False + + +def print_instructions(): + """Afișează instrucțiuni pentru extragere token""" + print("\n" + "=" * 70) + print("📖 CUM SĂ EXTRAGI TOKEN-UL DIN BROWSER") + print("=" * 70) + print(""" +1. Deschide browser (Chrome/Edge/Firefox) + +2. Mergi pe: https://www.digionline.ro + +3. Autentifică-te cu email și parolă + +4. Deschide Developer Tools: + - Chrome/Edge: F12 sau Ctrl+Shift+I + - Firefox: F12 sau Ctrl+Shift+K + +5. Mergi la tab-ul "Network" (Rețea) + +6. Filtrează după "XHR" sau "Fetch" + +7. Reîmprospătează pagina (F5) + +8. Caută cererea "login" sau "user" în lista de cereri + +9. Click pe cerere → Headers → Request Headers + +10. Caută "Authorization: Bearer ..." și copiază token-ul + (partea după "Bearer ") + +SAU + +10. Mergi la tab-ul "Application" (Aplicație) + → Storage → Local Storage → https://www.digionline.ro + → Caută "token" sau "auth_token" și copiază valoarea + +11. Lipește token-ul când scriptul îl cere +""") + print("=" * 70) + + +def main(): + """Funcția principală""" + print("=" * 70) + print("🎬 DIGI ONLINE - MANUAL TOKEN EXTRACTOR") + print("=" * 70) + + # Afișează instrucțiuni + print_instructions() + + print("\n📋 Introdu token-ul extras din browser:") + print("⚠️ Token-ul arată așa: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...") + print() + + token = input("🔑 Token: ").strip() + + if not token: + print("❌ Token-ul este obligatoriu!") + sys.exit(1) + + if len(token) < 20: + print("❌ Token-ul pare prea scurt! Verifică că ai copiat tot token-ul.") + sys.exit(1) + + print("\n" + "=" * 70) + + # Creează instanța cu token-ul + digi = DigiOnlineManual(token) + + # Obține lista de canale + if not digi.get_channels(): + print("\n❌ Nu s-au putut obține canalele!") + print("💡 Verifică că token-ul este valid și nu a expirat.") + sys.exit(1) + + # Generează playlist-ul + output_file = "digi_authenticated.m3u" + if digi.generate_playlist(output_file): + print("\n" + "=" * 70) + print("🎉 SUCCES!") + print("=" * 70) + print(f"\n📁 Playlist generat: {output_file}") + print(f"📺 Folosește acest fișier în Dispatcharr/Jellyfin/VLC") + print(f"\n💡 TIP: Token-ul expiră după câteva ore.") + print(f" Rulează din nou scriptul cu un token nou când expiră.\n") + else: + print("\n❌ Eroare la generare playlist!") + sys.exit(1) + + +if __name__ == "__main__": + try: + main() + except KeyboardInterrupt: + print("\n\n⚠️ Întrerupt de utilizator!") + sys.exit(0) + except Exception as e: + print(f"\n❌ Eroare neașteptată: {e}") + import traceback + traceback.print_exc() + sys.exit(1) + diff --git a/manifest.mpd b/manifest.mpd new file mode 100644 index 0000000..45faede --- /dev/null +++ b/manifest.mpd @@ -0,0 +1,71 @@ + + + + + + + + AAAAN3Bzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAABciD0RpR2lPbmxpbmUtaGd0dkjj3JWbBg== + + + + + + + + + + + + + + + + + + + + AAAAN3Bzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAABciD0RpR2lPbmxpbmUtaGd0dkjj3JWbBg== + + + + + + + + + + + + + + + + + + + + + + AAAAN3Bzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAABciD0RpR2lPbmxpbmUtaGd0dkjj3JWbBg== + + + + + + + + + + + + + + + + + + + + + diff --git a/run_digi_extractor.bat b/run_digi_extractor.bat new file mode 100644 index 0000000..37f1655 --- /dev/null +++ b/run_digi_extractor.bat @@ -0,0 +1,75 @@ +@echo off +chcp 65001 >nul +title DIGI Online - Extractor Autentificat + +echo ======================================== +echo 🎬 DIGI ONLINE - EXTRACTOR AUTENTIFICAT +echo ======================================== +echo. + +REM Verifică dacă Python este instalat +python --version >nul 2>&1 +if errorlevel 1 ( + echo ❌ Python nu este instalat! + echo. + echo 📥 Descarcă Python de aici: + echo https://www.python.org/downloads/ + echo. + pause + exit /b 1 +) + +echo ✅ Python găsit! +echo. + +REM Verifică dacă librăria requests este instalată +python -c "import requests" >nul 2>&1 +if errorlevel 1 ( + echo ⚠️ Librăria 'requests' nu este instalată! + echo 📦 Instalare automată... + echo. + pip install requests + if errorlevel 1 ( + echo ❌ Eroare la instalare! + pause + exit /b 1 + ) + echo ✅ Librăria 'requests' instalată cu succes! + echo. +) + +echo 🚀 Rulare script... +echo. +echo ======================================== +echo. + +REM Rulează scriptul Python +python digi_auth_extractor.py + +echo. +echo ======================================== +echo. + +if exist digi_authenticated.m3u ( + echo ✅ Playlist generat cu succes! + echo 📁 Fișier: digi_authenticated.m3u + echo. + echo 📺 Folosește acest fișier în: + echo - Dispatcharr + echo - Jellyfin + echo - VLC Media Player + echo - Kodi + echo - IPTV Smarters + echo. +) else ( + echo ❌ Playlist-ul nu a fost generat! + echo Verifică erorile de mai sus. + echo. +) + +echo 💡 TIP: Token-ul expiră după câteva ore. +echo Rulează din nou acest script pentru reînnoire. +echo. +echo ======================================== +pause + diff --git a/run_digi_manual.bat b/run_digi_manual.bat new file mode 100644 index 0000000..92f5c54 --- /dev/null +++ b/run_digi_manual.bat @@ -0,0 +1,73 @@ +@echo off +title DIGI Online - Manual Token Extractor + +echo ======================================== +echo DIGI ONLINE - MANUAL TOKEN EXTRACTOR +echo ======================================== +echo. + +REM Verifica daca Python este instalat +python --version >nul 2>&1 +if errorlevel 1 ( + echo Python nu este instalat! + echo. + echo Descarca Python de aici: + echo https://www.python.org/downloads/ + echo. + pause + exit /b 1 +) + +echo Python gasit! +echo. + +REM Verifica daca libraria requests este instalata +python -c "import requests" >nul 2>&1 +if errorlevel 1 ( + echo Libraria 'requests' nu este instalata! + echo Instalare automata... + echo. + pip install requests + if errorlevel 1 ( + echo Eroare la instalare! + pause + exit /b 1 + ) + echo Libraria 'requests' instalata cu succes! + echo. +) + +echo Rulare script... +echo. +echo ======================================== +echo. + +REM Ruleaza scriptul Python +python digi_manual_token.py + +echo. +echo ======================================== +echo. + +if exist digi_authenticated.m3u ( + echo Playlist generat cu succes! + echo Fisier: digi_authenticated.m3u + echo. + echo Foloseste acest fisier in: + echo - Dispatcharr + echo - Jellyfin + echo - VLC Media Player + echo - Kodi + echo. +) else ( + echo Playlist-ul nu a fost generat! + echo Verifica erorile de mai sus. + echo. +) + +echo TIP: Token-ul expira dupa cateva ore. +echo Ruleaza din nou acest script cu un token nou. +echo. +echo ======================================== +pause +