add custom fix and credit fix authors properly
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				Build docker container / build (push) Successful in 6m20s
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	Build docker container / build (push) Successful in 6m20s
				
			This commit is contained in:
		| @@ -101,4 +101,6 @@ Sometimes a new version of this image will be bound to the same source commit. T | |||||||
| - 1.0.11  | - 1.0.11  | ||||||
|   [10-14-2024 17:34](https://github.com/iptv-org/epg/commit/7610f7b9f5cc1ccab8d17f3408a95d31b36ace7c) |   [10-14-2024 17:34](https://github.com/iptv-org/epg/commit/7610f7b9f5cc1ccab8d17f3408a95d31b36ace7c) | ||||||
| - 1.0.12 | - 1.0.12 | ||||||
|   [10-14-2024 17:34](https://github.com/iptv-org/epg/commit/7610f7b9f5cc1ccab8d17f3408a95d31b36ace7c)<br>Fix Pickx.be url |   [10-14-2024](https://github.com/iptv-org/epg/commit/7610f7b9f5cc1ccab8d17f3408a95d31b36ace7c)<br>Fix Pickx.be url | ||||||
|  | - 1.0.13 | ||||||
|  |   [10-14-2024](https://github.com/iptv-org/epg/commit/7610f7b9f5cc1ccab8d17f3408a95d31b36ace7c)<br>Add custom fix for web.magentatv.de | ||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | // credit for this fix goes to davidclaeysquinones for his PR on https://github.com/iptv-org/epg/pull/2440 | ||||||
|  |  | ||||||
| const { DateTime } = require('luxon') | const { DateTime } = require('luxon') | ||||||
|  |  | ||||||
| const API_PROD_ENDPOINT = 'https://www.movistarplus.es/programacion-tv' | const API_PROD_ENDPOINT = 'https://www.movistarplus.es/programacion-tv' | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | // credit for this fix goes to davidclaeysquinones for his PR on https://github.com/iptv-org/epg/pull/2430 | ||||||
|  |  | ||||||
| const axios = require('axios') | const axios = require('axios') | ||||||
| const dayjs = require('dayjs') | const dayjs = require('dayjs') | ||||||
| const utc = require('dayjs/plugin/utc') | const utc = require('dayjs/plugin/utc') | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | // credit for this fix goes to davidclaeysquinones for his PR on https://github.com/iptv-org/epg/pull/2429 | ||||||
|  |  | ||||||
| const axios = require('axios') | const axios = require('axios') | ||||||
| const dayjs = require('dayjs') | const dayjs = require('dayjs') | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										232
									
								
								fixes/web.magentatv.de/web.magentatv.de.config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										232
									
								
								fixes/web.magentatv.de/web.magentatv.de.config.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,232 @@ | |||||||
|  | // credit for this fix goes to klausellus-wallace for his PR on https://github.com/iptv-org/epg/pull/2458 | ||||||
|  |  | ||||||
|  | const axios = require('axios') | ||||||
|  | const dayjs = require('dayjs') | ||||||
|  | const utc = require('dayjs/plugin/utc') | ||||||
|  | const customParseFormat = require('dayjs/plugin/customParseFormat') | ||||||
|  | const fetch = require('node-fetch') | ||||||
|  | const { upperCase } = require('lodash') | ||||||
|  |  | ||||||
|  | let X_CSRFTOKEN | ||||||
|  | let COOKIE | ||||||
|  | const cookiesToExtract = ['JSESSIONID', 'CSESSIONID', 'CSRFSESSION'] | ||||||
|  | const extractedCookies = {} | ||||||
|  |  | ||||||
|  | dayjs.extend(utc) | ||||||
|  | dayjs.extend(customParseFormat) | ||||||
|  |  | ||||||
|  | module.exports = { | ||||||
|  |   site: 'web.magentatv.de', | ||||||
|  |   days: 2, | ||||||
|  |   url: 'https://api.prod.sngtv.magentatv.de/EPG/JSON/PlayBillList', | ||||||
|  |   request: { | ||||||
|  |     method: 'POST', | ||||||
|  |     headers: function () { | ||||||
|  |       return setHeaders() | ||||||
|  |     }, | ||||||
|  |  | ||||||
|  |     data({ channel, date }) { | ||||||
|  |       return { | ||||||
|  |         count: -1, | ||||||
|  |         isFillProgram: 1, | ||||||
|  |         offset: 0, | ||||||
|  |         properties: [ | ||||||
|  |           { | ||||||
|  |             include: 'endtime,genres,id,name,starttime,channelid,pictures,introduce,subName,seasonNum,subNum,cast,country,producedate,externalIds', | ||||||
|  |             name: 'playbill' | ||||||
|  |           } | ||||||
|  |         ], | ||||||
|  |         type: 2, | ||||||
|  |         begintime: date.format('YYYYMMDD000000'), | ||||||
|  |         channelid: channel.site_id, | ||||||
|  |         endtime: date.add(1, 'd').format('YYYYMMDD000000') | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   parser: function ({ content }) { | ||||||
|  |     let programs = [] | ||||||
|  |     const items = parseItems(content) | ||||||
|  |     items.forEach(item => { | ||||||
|  |       programs.push({ | ||||||
|  |         title: item.name, | ||||||
|  |         description: item.introduce, | ||||||
|  |         image: parseImage(item), | ||||||
|  |         category: parseCategory(item), | ||||||
|  |         start: parseStart(item), | ||||||
|  |         stop: parseStop(item), | ||||||
|  |         sub_title: item.subName, | ||||||
|  |         season: item.seasonNum, | ||||||
|  |         episode: item.subNum, | ||||||
|  |         directors: parseDirectors(item), | ||||||
|  |         producers: parseProducers(item), | ||||||
|  |         adapters: parseAdapters(item), | ||||||
|  |         country: upperCase(item.country), | ||||||
|  |         date: item.producedate, | ||||||
|  |         urls: parseUrls(item) | ||||||
|  |       }) | ||||||
|  |     }) | ||||||
|  |     return programs | ||||||
|  |   }, | ||||||
|  |   async channels() { | ||||||
|  |     const url = 'https://api.prod.sngtv.magentatv.de/EPG/JSON/AllChannel' | ||||||
|  |     const body = { | ||||||
|  |       channelNamespace: 2, | ||||||
|  |       filterlist: [ | ||||||
|  |         { | ||||||
|  |           key: 'IsHide', | ||||||
|  |           value: '-1' | ||||||
|  |         } | ||||||
|  |       ], | ||||||
|  |       metaDataVer: 'Channel/1.1', | ||||||
|  |       properties: [ | ||||||
|  |         { | ||||||
|  |           include: '/channellist/logicalChannel/contentId,/channellist/logicalChannel/name', | ||||||
|  |           name: 'logicalChannel' | ||||||
|  |         } | ||||||
|  |       ], | ||||||
|  |       returnSatChannel: 0 | ||||||
|  |     } | ||||||
|  |     const params = { | ||||||
|  |       headers: await setHeaders() | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     const data = await axios | ||||||
|  |       .post(url, body, params) | ||||||
|  |       .then(r => r.data) | ||||||
|  |       .catch(console.log) | ||||||
|  |  | ||||||
|  |     return data.channellist.map(item => { | ||||||
|  |       return { | ||||||
|  |         lang: 'de', | ||||||
|  |         site_id: item.contentId, | ||||||
|  |         name: item.name | ||||||
|  |       } | ||||||
|  |     }) | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function parseCategory(item) { | ||||||
|  |   return item.genres | ||||||
|  |     ? item.genres | ||||||
|  |         .replace('und', ',') | ||||||
|  |         .split(',') | ||||||
|  |         .map(i => i.trim()) | ||||||
|  |     : [] | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function parseDirectors(item) { | ||||||
|  |   if (!item.cast || !item.cast.director) return []; | ||||||
|  |   return item.cast.director | ||||||
|  |     .replace('und', ',') | ||||||
|  |     .split(',') | ||||||
|  |     .map(i => i.trim()); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function parseProducers(item) { | ||||||
|  |   if (!item.cast || !item.cast.producer) return []; | ||||||
|  |   return item.cast.producer | ||||||
|  |     .replace('und', ',') | ||||||
|  |     .split(',') | ||||||
|  |     .map(i => i.trim()) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function parseAdapters(item) { | ||||||
|  |   if (!item.cast || !item.cast.adaptor) return []; | ||||||
|  |   return item.cast.adaptor | ||||||
|  |     .replace('und', ',') | ||||||
|  |     .split(',') | ||||||
|  |     .map(i => i.trim()) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function parseUrls(item) { | ||||||
|  |   // currently only a imdb id is returned by the api, thus we can construct the url here | ||||||
|  |   if (!item.externalIds) return []; | ||||||
|  |   return JSON.parse(item.externalIds) | ||||||
|  |     .filter(externalId => externalId.type === 'imdb' && externalId.id) | ||||||
|  |     .map(externalId => ({ system: 'imdb', value: `https://www.imdb.com/title/${externalId.id}` })) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function parseImage(item) { | ||||||
|  |   if (!Array.isArray(item.pictures) || !item.pictures.length) return null | ||||||
|  |  | ||||||
|  |   return item.pictures[0].href | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function parseStart(item) { | ||||||
|  |   return dayjs.utc(item.starttime, 'YYYY-MM-DD HH:mm:ss') | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function parseStop(item) { | ||||||
|  |   return dayjs.utc(item.endtime, 'YYYY-MM-DD HH:mm:ss') | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function parseItems(content) { | ||||||
|  |   const data = JSON.parse(content) | ||||||
|  |   if (!data || !Array.isArray(data.playbilllist)) return [] | ||||||
|  |  | ||||||
|  |   return data.playbilllist | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Function to try to fetch COOKIE and X_CSRFTOKEN | ||||||
|  | function fetchCookieAndToken() { | ||||||
|  |   return fetch( | ||||||
|  |     'https://api.prod.sngtv.magentatv.de/EPG/JSON/Authenticate?SID=firstup&T=Windows_chrome_118', | ||||||
|  |     { | ||||||
|  |       headers: { | ||||||
|  |         accept: 'application/json, text/javascript, */*; q=0.01', | ||||||
|  |         'content-type': 'application/x-www-form-urlencoded; charset=UTF-8', | ||||||
|  |         'sec-fetch-dest': 'empty', | ||||||
|  |         'sec-fetch-mode': 'cors', | ||||||
|  |         'sec-fetch-site': 'same-origin', | ||||||
|  |         'x-requested-with': 'XMLHttpRequest', | ||||||
|  |         Referer: 'https://web.magentatv.de/', | ||||||
|  |         'Referrer-Policy': 'strict-origin-when-cross-origin' | ||||||
|  |       }, | ||||||
|  |       body: '{"terminalid":"00:00:00:00:00:00","mac":"00:00:00:00:00:00","terminaltype":"WEBTV","utcEnable":1,"timezone":"Etc/GMT0","userType":3,"terminalvendor":"Unknown"}', | ||||||
|  |       method: 'POST' | ||||||
|  |     } | ||||||
|  |   ) | ||||||
|  |     .then(response => { | ||||||
|  |       // Check if the response status is OK (2xx) | ||||||
|  |       if (!response.ok) { | ||||||
|  |         throw new Error('HTTP request failed') | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       // Extract the set-cookie header | ||||||
|  |       const setCookieHeader = response.headers.raw()['set-cookie'] | ||||||
|  |  | ||||||
|  |       // Extract the cookies specified in cookiesToExtract | ||||||
|  |       cookiesToExtract.forEach(cookieName => { | ||||||
|  |         const regex = new RegExp(`${cookieName}=(.+?)(;|$)`) | ||||||
|  |         const match = setCookieHeader.find(header => regex.test(header)) | ||||||
|  |  | ||||||
|  |         if (match) { | ||||||
|  |           const cookieValue = regex.exec(match)[1] | ||||||
|  |           extractedCookies[cookieName] = cookieValue | ||||||
|  |         } | ||||||
|  |       }) | ||||||
|  |  | ||||||
|  |       return response.json() | ||||||
|  |     }) | ||||||
|  |     .then(data => { | ||||||
|  |       if (data.csrfToken) { | ||||||
|  |         X_CSRFTOKEN = data.csrfToken | ||||||
|  |         COOKIE = `JSESSIONID=${extractedCookies.JSESSIONID}; CSESSIONID=${extractedCookies.CSESSIONID}; CSRFSESSION=${extractedCookies.CSRFSESSION}; JSESSIONID=${extractedCookies.JSESSIONID};` | ||||||
|  |       } else { | ||||||
|  |         console.log('csrfToken not found in the response.') | ||||||
|  |       } | ||||||
|  |     }) | ||||||
|  |     .catch(error => { | ||||||
|  |       console.error(error) | ||||||
|  |     }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function setHeaders() { | ||||||
|  |   return fetchCookieAndToken().then(() => { | ||||||
|  |     return { | ||||||
|  |       X_CSRFTOKEN: X_CSRFTOKEN, | ||||||
|  |       'Content-Type': 'application/json', | ||||||
|  |       Cookie: COOKIE | ||||||
|  |     } | ||||||
|  |   }) | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user