Advertisement
samipote

Untitled

Sep 2nd, 2023
1,804
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Create the Game model
  2. const Game = mongoose.model('Game', gameSchema);
  3.  
  4. // Serve static files from the public directory
  5. app.use(express.static(path.join(__dirname, 'public')));
  6.  
  7. const proxyAddress = 'http://localhost:8080/';
  8. process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
  9.  
  10. // A function that returns a modified URL for .ts and .wbp files
  11. function getSegmentURL(targetURL) {
  12.   const baseURL = getBaseURL();
  13.   return baseURL + 'segment/' + targetURL.replace('https://', '');
  14. }
  15.  
  16. // A function that returns a modified URL for .m3u8 files
  17. function getPlaylistURL(targetURL) {
  18.   const baseURL = getBaseURL();
  19.   return baseURL + 'proxy/' + targetURL.replace('https://', '');
  20. }
  21. function getKeyURL(targetURL) {
  22.      const baseURL = getBaseURL();
  23.   return baseURL + 'key/' + targetURL.replace('https://', '')
  24. }
  25.  
  26. function getHeadersForDomain(domain) {
  27.   const defaultHeaders = {
  28.     'accept': '*/*',
  29.     'accept-encoding': 'gzip, deflate, br',
  30.     'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36',
  31.     'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Brave";v="116"',
  32.     'sec-ch-ua-mobile': '?0',
  33.     'sec-ch-ua-platform': 'Windows',
  34.     'sec-fetch-dest': 'empty',
  35.     'sec-fetch-mode': 'cors',
  36.     'sec-fetch-site': 'cross-site',
  37.     'sec-gpc': '1',
  38.   };
  39.  
  40.   switch(domain) {
  41.     case 'ddy1.cdndac.lol':
  42.     case 'ddy2.cdndac.lol':
  43.     case 'ddy3.cdndac.lol':
  44.         case 'ddy4.cdndac.lol':
  45.         case 'ddy5.cdndac.lol':
  46.         case 'ddh1.cdndac.lol':
  47.     //... other ddy domains
  48.       return {
  49.         ...defaultHeaders,
  50.         'origin': 'https://ddhwebcast4k.xyz',
  51.         'referer': 'https://ddhwebcast4k.xyz/',
  52.       };
  53.  
  54.     case 'ed-t1.edghst.me':
  55.     case 'ed-t2.edghst.me':
  56.     case 'ed-t3.edghst.me':
  57.     case 'ed-t4.edghst.me':
  58.     case 'ed-n1.edghst.me':
  59.         case 'ed-c1.edghst.me':
  60.       return {
  61.         ...defaultHeaders,
  62.         'origin': 'https://www.nolive.me',
  63.         'referer': 'https://www.nolive.me/',
  64.                 'Accept-Encoding': 'identity'
  65.       };
  66.         case 'aes128.seckeyserv.me':
  67.             return {
  68.                 ...defaultHeaders,
  69.         'origin': 'https://www.nolive.me',
  70.         'referer': 'https://www.nolive.me/',
  71.                 'method': 'GET',
  72.                 'authority': 'aes128.seckeyserv.me'
  73.       };
  74.         case 's2.albula.xyz':
  75.             return {
  76.                 ...defaultHeaders,
  77.         'origin': 'https://www.sportshub.to',
  78.         'referer': 'https://www.sportshub.to/'
  79.       };
  80.         case 'nflarcadia.xyz':
  81.             return {
  82.                 ...defaultHeaders,
  83.         'origin': 'https://gamerarcades.com',
  84.         'referer': 'https://gamerarcades.com/'
  85.       };
  86.         case 'livenflstream.xyz':
  87.             return {
  88.                 ...defaultHeaders,
  89.         'origin': 'https://catchystream.com',
  90.         'referer': 'https://catchystream.com/'
  91.       };
  92.         case 's3.twoflow.xyz':
  93.         return {
  94.                 ...defaultHeaders,
  95.         'origin': 'https://bestreamsports.org',
  96.         'referer': 'https://bestreamsports.org/'
  97.       };
  98.         case 'n6.aliflailaaliflaila.com':
  99.         return {
  100.                 ...defaultHeaders,
  101.         'origin': 'https://fiveyardlab.com',
  102.         'referer': 'https://fiveyardlab.com/'
  103.       };
  104.         case 'jggk.9novel.to':
  105.         return {
  106.                 ...defaultHeaders,
  107.         'origin': 'https://vwrc.truyenxalo.com',
  108.         'referer': 'https://vwrc.truyenxalo.com/'
  109.       };
  110.         case 'ddh1.cdnbos.lol' :
  111.         case 'ddh2.cdnbos.lol' :
  112.         case 'ddh3.cdnbos.lol' :
  113.         case 'ddh4.cdnbos.lol' :
  114.         case 'ddh5.cdnbos.lol' :
  115.         case 'ddy1.cdnbos.lol' :
  116.         case 'ddy2.cdnbos.lol' :
  117.         case 'ddy3.cdnbos.lol' :
  118.         case 'ddy4.cdnbos.lol' :
  119.         case 'ddy5.cdnbos.lol' :
  120.         return {
  121.                 ...defaultHeaders,
  122.         'origin': 'https://ddolahdplay.xyz',
  123.         'referer': 'https://ddolahdplay.xyz/'
  124.       };
  125.     default:
  126.       return defaultHeaders;
  127.   }
  128. }
  129.  
  130. function appendQueryParameter(url, paramKey, paramValue) {
  131.     if (url.includes('?')) {
  132.         return `${url}&${paramKey}=${paramValue}`;
  133.     } else {
  134.         return `${url}?${paramKey}=${paramValue}`;
  135.     }
  136. }
  137. function delay(ms) {
  138.   return new Promise(resolve => setTimeout(resolve, ms));
  139. }
  140. // A new route for handling .m3u8 requests
  141. app.use('/proxy/', async (req, res, next) => {
  142.   const fullURL = req.protocol + '://' + req.get('host') + req.originalUrl;
  143.   const { pathname, search } = new URL(fullURL);
  144.   console.log(`Received request for URL: ${fullURL}`);
  145.   const targetURL = pathname.replace('/proxy/', 'https://') + search;
  146.   const domain = new URL(targetURL).hostname;
  147.   const parsedURL = new URL(targetURL);
  148.   const fileExtension = path.extname(parsedURL.pathname).toLowerCase();
  149.   if (fileExtension === '.m3u8') {
  150.     try {
  151.       const m3u8Response = await fetch(targetURL, { headers: getHeadersForDomain(domain)});
  152.       let m3u8Content = await m3u8Response.text();
  153.       m3u8Content = await Promise.all(m3u8Content.split('\n').map(async line => {
  154.         const segmentParsedURL = new URL(line, targetURL);
  155.         let segmentBaseURL;
  156.         if (segmentParsedURL.pathname.startsWith('/')) {
  157.           segmentBaseURL = parsedURL.origin;
  158.         } else {
  159.           segmentBaseURL = targetURL.substring(0, targetURL.lastIndexOf('/') + 1);
  160.         }
  161.         const segmentURL = line.startsWith('http') ? line : segmentBaseURL + segmentParsedURL.pathname + segmentParsedURL.search;
  162.         const segmentFileExtension = path.extname(segmentParsedURL.pathname).toLowerCase();
  163.         if (segmentFileExtension === '.ts' || segmentFileExtension === '.webp' || segmentFileExtension === '.js') {
  164.           const resolvedURL = await resolveRedirect(segmentURL, getHeadersForDomain(domain));
  165.           const segmentDomain = new URL(segmentURL).host;
  166.           return appendQueryParameter(getSegmentURL(resolvedURL), "originalDomain", segmentDomain);
  167.         } else if (line.match(/\.m3u8$/)) {
  168.           // Add the host domain to the url
  169.           const playlistDomain = new URL(segmentBaseURL).host;
  170.           const playlistURL = line.startsWith('http') ? line : segmentBaseURL + segmentParsedURL.pathname;
  171.           const resolvedURL = await resolveRedirect(playlistURL, getHeadersForDomain(domain));
  172.           return appendQueryParameter(getPlaylistURL(resolvedURL), "originalDomain", playlistDomain);
  173.         } else if (line.startsWith('#EXT-X-KEY')) {
  174.           const keyURLMatch = line.match(/URI="([^"]+)"/);
  175.           if (!keyURLMatch) {
  176.             return line;
  177.           }
  178.           const keyURL = keyURLMatch[1];
  179.           const segmentDomain = new URL(keyURL).host;
  180.           const modifiedKeyURL = appendQueryParameter(getKeyURL(keyURL), "originalDomain", segmentDomain);
  181.           return line.replace(/URI="([^"]+)"/, `URI="${modifiedKeyURL}"`);
  182.         } else {
  183.           return line;
  184.         }
  185.       }));
  186.       m3u8Content = m3u8Content.join('\n');
  187.       res.setHeader('Content-Type', 'application/vnd.apple.mpegurl');
  188.             res.setHeader('Access-Control-Allow-Origin', '*');
  189.       res.send(m3u8Content);
  190.     } catch (err) {
  191.       console.error('Failed to fetch m3u8:', err.message);
  192.       res.status(500).send('Proxy Error');
  193.     }
  194.     return;
  195.   }
  196. });
  197.  
  198.  
  199. async function resolveRedirect(url, headers) {
  200.   try {
  201.     const response = await fetch(url, { headers });
  202.     if (response.redirected) {
  203.       return response.url;
  204.     }
  205.     return url;
  206.   } catch (error) {
  207.     console.error('Failed to resolve redirect for', url, error.message);
  208.     return changeExtensionToJs(url);
  209.   }
  210. }
  211.  
  212. function changeExtensionToJs(url) {
  213.   const withoutExtension = url.substring(0, url.lastIndexOf('.'));
  214.   return `${withoutExtension}.js`;
  215. }
  216.  
  217. // A new route for handling .ts and .wbp requests
  218. app.use('/segment/*',(req, res) => {
  219.     const originalDomain = req.query.originalDomain;
  220.         delete req.query.originalDomain;
  221.     const headersForDomain = getHeadersForDomain(originalDomain);
  222.     const fullURL = req.protocol + '://' + req.get('host') + req.originalUrl;
  223.     console.log(`Received request for URL: ${fullURL}`);
  224.  
  225.     // Capture the segment path from the wildcard
  226.     const segmentPath = req.params[0];
  227.  
  228.     // Construct the targetURL with the captured segment path
  229.     const targetURL = 'https://' + segmentPath;
  230.  
  231.     // Create a proxyRequestOptions object with the headers copied from the original request
  232.     const proxyRequestOptions = {
  233.         url: targetURL,
  234.         headers: headersForDomain
  235.     };
  236.     const proxyRequest = request(proxyRequestOptions);
  237.  
  238.     proxyRequest.on('response', function (sourceResponse) {
  239.         res.setHeader('Access-Control-Allow-Origin', '*');
  240.         sourceResponse.pipe(res);
  241.     });
  242. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement