Update List

This commit is contained in:
2025-10-10 20:23:35 +03:00
parent 4c70fca9b4
commit 642e3ec05d
14 changed files with 2247 additions and 0 deletions

235
DIGI_AUTH_INSTRUCTIONS.md Normal file
View File

@@ -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!** 📺🍿

182
DIGI_README.md Normal file
View File

@@ -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)

262
GHID_EXTRAGERE_TOKEN.md Normal file
View File

@@ -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!** 📺🍿

99
START_HERE.md Normal file
View File

@@ -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!**

119
digi.m3u Normal file
View File

@@ -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
#
# ========================================

296
digi_auth_extractor.py Normal file
View File

@@ -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)

10
digi_authenticated.m3u Normal file
View File

@@ -0,0 +1,10 @@
#EXTM3U
# ========================================
# PLAYLIST DIGI ONLINE - AUTENTIFICAT (COOKIES)
# Generat: 2025-10-10 20:10:30
# ========================================
# ========================================
# Total canale procesate: 0
# ========================================

263
digi_cookie_extractor.py Normal file
View File

@@ -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)

147
digi_dash_authenticated.m3u Normal file
View File

@@ -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
#
# ========================================

View File

@@ -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)

238
digi_manual_token.py Normal file
View File

@@ -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)

71
manifest.mpd Normal file
View File

@@ -0,0 +1,71 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--Generated with DiGi Packager v-0.1-rc2-->
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd" xmlns:cenc="urn:mpeg:cenc:2013" profiles="urn:mpeg:dash:profile:isoff-live:2011" minBufferTime="PT10S" type="dynamic" publishTime="2025-10-10T17:14:28Z" availabilityStartTime="2025-07-11T06:04:23Z" minimumUpdatePeriod="PT6S" timeShiftBufferDepth="PT36S" suggestedPresentationDelay="PT12S">
<Period id="0" start="PT0S">
<AdaptationSet id="0" contentType="audio" lang="ro" segmentAlignment="true">
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="3532fe02-221e-571d-9f34-1dd987c6888f"/>
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
<cenc:pssh>AAAAN3Bzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAABciD0RpR2lPbmxpbmUtaGd0dkjj3JWbBg==</cenc:pssh>
</ContentProtection>
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
<Representation id="0" bandwidth="102050" codecs="mp4a.40.2" mimeType="audio/mp4" audioSamplingRate="48000">
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
<SegmentTemplate timescale="90000" initialization="hgtv-init_aac.mp4" media="hgtv-audio-$Time$.m4a" startNumber="1305392">
<SegmentTimeline>
<S t="711230220942" d="537600"/>
<S t="711230761422" d="539520" r="1"/>
<S t="711231840462" d="537600"/>
<S t="711232380942" d="539520"/>
<S t="711232920462" d="541440"/>
<S t="711233461902" d="539520" r="1"/>
</SegmentTimeline>
</SegmentTemplate>
</Representation>
</AdaptationSet>
<AdaptationSet id="1" contentType="video" maxWidth="640" maxHeight="360" frameRate="90000/3600" par="16:9">
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="eaac9209-17f0-5bea-9098-6ca4623235b9"/>
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
<cenc:pssh>AAAAN3Bzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAABciD0RpR2lPbmxpbmUtaGd0dkjj3JWbBg==</cenc:pssh>
</ContentProtection>
<SupplementalProperty schemeIdUri="urn:mpeg:dash:adaptation-set-switching:2016" value="2"/>
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
<Representation id="1" bandwidth="1751816" codecs="avc1.4d401e" mimeType="video/mp4" sar="1:1" width="640" height="360">
<SegmentTemplate timescale="90000" initialization="hgtv-360p-init_h264.mp4" media="hgtv-360p-$Time$.m4v" startNumber="1304173">
<SegmentTimeline>
<S t="711230825744" d="540000" r="6"/>
</SegmentTimeline>
</SegmentTemplate>
</Representation>
<Representation id="2" bandwidth="899740" codecs="avc1.4d4015" mimeType="video/mp4" sar="640:639" width="426" height="240">
<SegmentTemplate timescale="90000" initialization="hgtv-180p-init_h264.mp4" media="hgtv-180p-$Time$.m4v" startNumber="1304159">
<SegmentTimeline>
<S t="711230825744" d="540000" r="6"/>
</SegmentTimeline>
</SegmentTemplate>
</Representation>
</AdaptationSet>
<AdaptationSet id="2" contentType="video" maxWidth="1280" maxHeight="720" frameRate="90000/3600" par="16:9">
<ContentProtection value="cenc" schemeIdUri="urn:mpeg:dash:mp4protection:2011" cenc:default_KID="4ad0fa09-1919-5062-9ad6-1f443804a01c"/>
<ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed">
<cenc:pssh>AAAAN3Bzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAABciD0RpR2lPbmxpbmUtaGd0dkjj3JWbBg==</cenc:pssh>
</ContentProtection>
<SupplementalProperty schemeIdUri="urn:mpeg:dash:adaptation-set-switching:2016" value="1"/>
<Role schemeIdUri="urn:mpeg:dash:role:2011" value="main"/>
<Representation id="3" bandwidth="3513181" codecs="avc1.4d401f" mimeType="video/mp4" sar="1:1" width="1024" height="576">
<SegmentTemplate timescale="90000" initialization="hgtv-576p-init_h264.mp4" media="hgtv-576p-$Time$.m4v" startNumber="1304218">
<SegmentTimeline>
<S t="711230825744" d="540000" r="6"/>
</SegmentTimeline>
</SegmentTemplate>
</Representation>
<Representation id="4" bandwidth="4045147" codecs="avc1.4d401f" mimeType="video/mp4" sar="1:1" width="1280" height="720">
<SegmentTemplate timescale="90000" initialization="hgtv-720p-init_h264.mp4" media="hgtv-720p-$Time$.m4v" startNumber="1304162">
<SegmentTimeline>
<S t="711230825744" d="540000" r="6"/>
</SegmentTimeline>
</SegmentTemplate>
</Representation>
</AdaptationSet>
</Period>
<UTCTiming schemeIdUri="urn:mpeg:dash:utc:direct:2014" value="2025-10-10T17:14:28Z"/>
</MPD>

75
run_digi_extractor.bat Normal file
View File

@@ -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

73
run_digi_manual.bat Normal file
View File

@@ -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