feat: proxy session management
This commit is contained in:
@@ -7,7 +7,6 @@ A simple NodeJS web server that retrieves your IPTV stream, caches it, and conve
|
||||
Setup a `.env` file or
|
||||
equivalent environment variables:
|
||||
```env
|
||||
DEFAULT_CHANNEL_URL=https://mcdn.daserste.de/daserste/de/master.m3u8
|
||||
STORAGE_PATH=/mnt/streams/recordings
|
||||
```
|
||||
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
const request = require('request');
|
||||
const ChannelService = require('../services/ChannelService');
|
||||
const ProxyHelperService = require('../services/proxy/ProxyHelperService');
|
||||
const SessionFactory = require('../services/session/SessionFactory');
|
||||
|
||||
module.exports = {
|
||||
channel(req, res) {
|
||||
let { url: targetUrl, channelId, headers, id } = req.query;
|
||||
async channel(req, res) {
|
||||
let { url: targetUrl, channelId, headers } = req.query;
|
||||
|
||||
if(!targetUrl) {
|
||||
const channel = channelId ?
|
||||
@@ -15,10 +16,13 @@ module.exports = {
|
||||
res.status(404).json({ error: 'Channel not found' });
|
||||
return;
|
||||
}
|
||||
|
||||
targetUrl = channel.url;
|
||||
|
||||
if(id) {
|
||||
targetUrl += `?id=${id}`;
|
||||
const sessionProvider = SessionFactory.getSessionProvider(channel);
|
||||
if(sessionProvider) {
|
||||
await sessionProvider.createSession();
|
||||
targetUrl = channel.sessionUrl;
|
||||
}
|
||||
|
||||
if(channel.headers && channel.headers.length > 0) {
|
||||
|
||||
@@ -19,14 +19,14 @@ class ChannelService {
|
||||
|
||||
this.channels = [
|
||||
//Some Test-channels to get started, remove this when using your own playlist
|
||||
new Channel('Das Erste', process.env.DEFAULT_CHANNEL_URL, "https://upload.wikimedia.org/wikipedia/commons/thumb/5/56/Das_Erste-Logo_klein.svg/768px-Das_Erste-Logo_klein.svg.png", 'direct'),
|
||||
//new Channel('Das Erste', "https://mcdn.daserste.de/daserste/de/master.m3u8", "https://upload.wikimedia.org/wikipedia/commons/thumb/5/56/Das_Erste-Logo_klein.svg/768px-Das_Erste-Logo_klein.svg.png", 'direct'),
|
||||
new Channel('DAZN 1 DE', "https://xyzdddd.mizhls.ru/lb/premium426/index.m3u8", "https://upload.wikimedia.org/wikipedia/commons/4/49/DAZN_1.svg", 'proxy', daddyHeaders),
|
||||
new Channel('beIN Sports 1', "https://xyzdddd.mizhls.ru/lb/premium61/index.m3u8", "https://www.thesportsdb.com/images/media/channel/logo/BeIn_Sports_1_Australia.png", 'proxy', daddyHeaders),
|
||||
new Channel('beIN Sports 2', "https://xyzdddd.mizhls.ru/lb/premium92/index.m3u8", "https://www.thesportsdb.com/images/media/channel/logo/BeIn_Sports_HD_2_France.png", 'proxy', daddyHeaders),
|
||||
new Channel('Sky Sport Football', "https://xyzdddd.mizhls.ru/lb/premium35/index.m3u8", "https://raw.githubusercontent.com/tv-logo/tv-logos/main/countries/united-kingdom/sky-sports-football-uk.png", 'proxy', daddyHeaders),
|
||||
new Channel('Sky Sports Premier League', "https://xyzdddd.mizhls.ru/lb/premium130/index.m3u8", "https://github.com/tv-logo/tv-logos/blob/main/countries/united-kingdom/sky-sports-premier-league-uk.png?raw=true", 'proxy', daddyHeaders),
|
||||
new Channel('SuperSport Premier League', 'https://xyzdddd.mizhls.ru/lb/premium414/index.m3u8', "https://github.com/tv-logo/tv-logos/blob/8d25ddd79ca2f9cd033b808c45cccd2b3da563ee/countries/south-africa/supersport-premier-league-za.png?raw=true", 'restream', daddyHeaders),
|
||||
new Channel('TEST', 'https://rr.vipstreams.in/alpha/js/al-taawon-vs-al-qadisiya/1/playlist.m3u8', "https://upload.wikimedia.org/wikipedia/commons/thumb/5/56/Das_Erste-Logo_klein.svg/768px-Das_Erste-Logo_klein.svg.png", 'restream', streamedSuHeaders),
|
||||
//new Channel('TEST', 'https://rr.vipstreams.in/alpha/js/al-taawon-vs-al-qadisiya/1/playlist.m3u8', "https://upload.wikimedia.org/wikipedia/commons/thumb/5/56/Das_Erste-Logo_klein.svg/768px-Das_Erste-Logo_klein.svg.png", 'restream', streamedSuHeaders),
|
||||
];
|
||||
this.currentChannel = this.channels[0];
|
||||
}
|
||||
|
||||
@@ -9,7 +9,6 @@ async function start(nextChannel) {
|
||||
const sessionProvider = SessionFactory.getSessionProvider(nextChannel);
|
||||
if(sessionProvider) {
|
||||
await sessionProvider.createSession();
|
||||
console.log('Session URL:', nextChannel.sessionUrl);
|
||||
}
|
||||
|
||||
ffmpegService.startFFmpeg(nextChannel);
|
||||
|
||||
@@ -32,7 +32,6 @@ class StreamedSuSession extends SessionHandler {
|
||||
|
||||
const encryptedData = await response.text();
|
||||
|
||||
console.log('Session encrypted:', encryptedData);
|
||||
const decryptUrl = `https://streamed-decrypter.vercel.app/api/decrypt?data=${encodeURIComponent(encryptedData)}`;
|
||||
|
||||
const decryptRes = await fetch(decryptUrl, { method: "GET" });
|
||||
@@ -42,7 +41,6 @@ class StreamedSuSession extends SessionHandler {
|
||||
}
|
||||
|
||||
const sessionDecrypted = await decryptRes.json();
|
||||
console.log('Session decrypted:', sessionDecrypted);
|
||||
this.channel.sessionUrl = sessionDecrypted.ok;
|
||||
return sessionDecrypted.ok;
|
||||
|
||||
|
||||
@@ -25,7 +25,6 @@ services:
|
||||
volumes:
|
||||
- streams_data:/streams
|
||||
environment:
|
||||
DEFAULT_CHANNEL_URL: https://mcdn.daserste.de/daserste/de/master.m3u8
|
||||
STORAGE_PATH: /streams/
|
||||
networks:
|
||||
- app-network
|
||||
|
||||
@@ -10,7 +10,6 @@ services:
|
||||
volumes:
|
||||
- streams_data:/streams
|
||||
environment:
|
||||
DEFAULT_CHANNEL_URL: https://mcdn.daserste.de/daserste/de/master.m3u8
|
||||
STORAGE_PATH: /streams/
|
||||
networks:
|
||||
- app-network
|
||||
|
||||
@@ -25,7 +25,6 @@ services:
|
||||
volumes:
|
||||
- streams_data:/streams
|
||||
environment:
|
||||
DEFAULT_CHANNEL_URL: https://mcdn.daserste.de/daserste/de/master.m3u8
|
||||
STORAGE_PATH: /streams/
|
||||
networks:
|
||||
- app-network
|
||||
|
||||
Reference in New Issue
Block a user