Replace LF line endings with CRLF

This commit is contained in:
freearhey
2025-09-28 17:55:05 +03:00
parent efc74efcf8
commit b6a589c62a
1192 changed files with 445631 additions and 445631 deletions

View File

@@ -1,110 +1,110 @@
const axios = require('axios')
const dayjs = require('dayjs')
const cheerio = require('cheerio')
const { DateTime } = require('luxon')
module.exports = {
site: 'bein.com',
days: 2,
request: {
cache: {
ttl: 60 * 60 * 1000 // 1 hour
}
},
url: function ({ date, channel }) {
const [category] = channel.site_id.split('#')
const postid = channel.lang === 'ar' ? '25344' : '25356'
return `https://www.bein.com/${
channel.lang
}/epg-ajax-template/?action=epg_fetch&category=${category}&cdate=${date.format(
'YYYY-MM-DD'
)}&language=${channel.lang.toUpperCase()}&loadindex=0&mins=00&offset=0&postid=${postid}&serviceidentity=bein.net`
},
parser: function ({ content, channel, date }) {
let programs = []
const items = parseItems(content, channel)
date = DateTime.fromMillis(date.valueOf()).minus({ days: 1 })
items.forEach(item => {
const $item = cheerio.load(item)
const title = parseTitle($item)
if (!title) return
const category = parseCategory($item)
const prev = programs[programs.length - 1]
let start = parseTime($item, date)
if (prev) {
if (start < prev.start) {
start = start.plus({ days: 1 })
date = date.plus({ days: 1 })
}
prev.stop = start
}
let stop = parseTime($item, start)
if (stop < start) {
stop = stop.plus({ days: 1 })
}
programs.push({
title,
category,
start,
stop
})
})
return programs
},
async channels({ lang }) {
const categories = ['entertainment', 'sports']
let channels = []
for (let category of categories) {
const url = `https://www.bein.com/en/epg-ajax-template/?action=epg_fetch&offset=0&category=${category}&serviceidentity=bein.net&mins=00&cdate=${dayjs().format(
'YYYY-MM-DD'
)}&language=${lang.toUpperCase()}&postid=25356&loadindex=0`
const data = await axios
.get(url)
.then(r => r.data)
.catch(console.log)
const $ = cheerio.load(data)
$('.container-tvguide > div').each((i, el) => {
const id = $(el).attr('id')
if (!id || !/^channels_\d+/.test(id)) return
const [, channelId] = id.split('_')
channels.push({
lang,
site_id: `${category}#${channelId}`,
name: channelId
})
})
}
return channels
}
}
function parseTitle($item) {
return $item('.title').text()
}
function parseCategory($item) {
return $item('.format').text()
}
function parseTime($item, date) {
let [, time] = $item('.time')
.text()
.match(/^(\d{2}:\d{2})/) || [null, null]
if (!time) return null
time = `${date.toFormat('yyyy-MM-dd')} ${time}`
return DateTime.fromFormat(time, 'yyyy-MM-dd HH:mm', { zone: 'Asia/Qatar' }).toUTC()
}
function parseItems(content, channel) {
const [, channelId] = channel.site_id.split('#')
const $ = cheerio.load(content)
return $(`#channels_${channelId} .slider > ul:first-child > li`).toArray()
}
const axios = require('axios')
const dayjs = require('dayjs')
const cheerio = require('cheerio')
const { DateTime } = require('luxon')
module.exports = {
site: 'bein.com',
days: 2,
request: {
cache: {
ttl: 60 * 60 * 1000 // 1 hour
}
},
url: function ({ date, channel }) {
const [category] = channel.site_id.split('#')
const postid = channel.lang === 'ar' ? '25344' : '25356'
return `https://www.bein.com/${
channel.lang
}/epg-ajax-template/?action=epg_fetch&category=${category}&cdate=${date.format(
'YYYY-MM-DD'
)}&language=${channel.lang.toUpperCase()}&loadindex=0&mins=00&offset=0&postid=${postid}&serviceidentity=bein.net`
},
parser: function ({ content, channel, date }) {
let programs = []
const items = parseItems(content, channel)
date = DateTime.fromMillis(date.valueOf()).minus({ days: 1 })
items.forEach(item => {
const $item = cheerio.load(item)
const title = parseTitle($item)
if (!title) return
const category = parseCategory($item)
const prev = programs[programs.length - 1]
let start = parseTime($item, date)
if (prev) {
if (start < prev.start) {
start = start.plus({ days: 1 })
date = date.plus({ days: 1 })
}
prev.stop = start
}
let stop = parseTime($item, start)
if (stop < start) {
stop = stop.plus({ days: 1 })
}
programs.push({
title,
category,
start,
stop
})
})
return programs
},
async channels({ lang }) {
const categories = ['entertainment', 'sports']
let channels = []
for (let category of categories) {
const url = `https://www.bein.com/en/epg-ajax-template/?action=epg_fetch&offset=0&category=${category}&serviceidentity=bein.net&mins=00&cdate=${dayjs().format(
'YYYY-MM-DD'
)}&language=${lang.toUpperCase()}&postid=25356&loadindex=0`
const data = await axios
.get(url)
.then(r => r.data)
.catch(console.log)
const $ = cheerio.load(data)
$('.container-tvguide > div').each((i, el) => {
const id = $(el).attr('id')
if (!id || !/^channels_\d+/.test(id)) return
const [, channelId] = id.split('_')
channels.push({
lang,
site_id: `${category}#${channelId}`,
name: channelId
})
})
}
return channels
}
}
function parseTitle($item) {
return $item('.title').text()
}
function parseCategory($item) {
return $item('.format').text()
}
function parseTime($item, date) {
let [, time] = $item('.time')
.text()
.match(/^(\d{2}:\d{2})/) || [null, null]
if (!time) return null
time = `${date.toFormat('yyyy-MM-dd')} ${time}`
return DateTime.fromFormat(time, 'yyyy-MM-dd HH:mm', { zone: 'Asia/Qatar' }).toUTC()
}
function parseItems(content, channel) {
const [, channelId] = channel.site_id.split('#')
const $ = cheerio.load(content)
return $(`#channels_${channelId} .slider > ul:first-child > li`).toArray()
}

View File

@@ -1,58 +1,58 @@
const fs = require('fs')
const path = require('path')
const { parser, url } = require('./bein.com.config.js')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const customParseFormat = require('dayjs/plugin/customParseFormat')
dayjs.extend(customParseFormat)
dayjs.extend(utc)
const date = dayjs.utc('2023-01-19', 'YYYY-MM-DD').startOf('d')
const channel = { site_id: 'entertainment#1', xmltv_id: 'beINMovies1Premiere.qa', lang: 'en' }
it('can generate valid url', () => {
const result = url({ date, channel })
expect(result).toBe(
'https://www.bein.com/en/epg-ajax-template/?action=epg_fetch&category=entertainment&cdate=2023-01-19&language=EN&loadindex=0&mins=00&offset=0&postid=25356&serviceidentity=bein.net'
)
})
it('can parse response', () => {
const content = fs.readFileSync(path.resolve('sites/bein.com/__data__/content.html'))
const results = parser({ date, channel, content }).map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(results[0]).toMatchObject({
start: '2023-01-18T20:15:00.000Z',
stop: '2023-01-18T22:15:00.000Z',
title: 'The Walk',
category: 'Movies'
})
expect(results[1]).toMatchObject({
start: '2023-01-18T22:15:00.000Z',
stop: '2023-01-19T00:00:00.000Z',
title: 'Resident Evil: Welcome To Raccoon City',
category: 'Movies'
})
expect(results[10]).toMatchObject({
start: '2023-01-19T15:30:00.000Z',
stop: '2023-01-19T18:00:00.000Z',
title: 'Spider-Man: No Way Home',
category: 'Movies'
})
})
it('can handle empty guide', () => {
const noContent = fs.readFileSync(path.resolve('sites/bein.com/__data__/no-content.html'))
const result = parser({
date,
channel,
content: noContent
})
expect(result).toMatchObject([])
})
const fs = require('fs')
const path = require('path')
const { parser, url } = require('./bein.com.config.js')
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const customParseFormat = require('dayjs/plugin/customParseFormat')
dayjs.extend(customParseFormat)
dayjs.extend(utc)
const date = dayjs.utc('2023-01-19', 'YYYY-MM-DD').startOf('d')
const channel = { site_id: 'entertainment#1', xmltv_id: 'beINMovies1Premiere.qa', lang: 'en' }
it('can generate valid url', () => {
const result = url({ date, channel })
expect(result).toBe(
'https://www.bein.com/en/epg-ajax-template/?action=epg_fetch&category=entertainment&cdate=2023-01-19&language=EN&loadindex=0&mins=00&offset=0&postid=25356&serviceidentity=bein.net'
)
})
it('can parse response', () => {
const content = fs.readFileSync(path.resolve('sites/bein.com/__data__/content.html'))
const results = parser({ date, channel, content }).map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(results[0]).toMatchObject({
start: '2023-01-18T20:15:00.000Z',
stop: '2023-01-18T22:15:00.000Z',
title: 'The Walk',
category: 'Movies'
})
expect(results[1]).toMatchObject({
start: '2023-01-18T22:15:00.000Z',
stop: '2023-01-19T00:00:00.000Z',
title: 'Resident Evil: Welcome To Raccoon City',
category: 'Movies'
})
expect(results[10]).toMatchObject({
start: '2023-01-19T15:30:00.000Z',
stop: '2023-01-19T18:00:00.000Z',
title: 'Spider-Man: No Way Home',
category: 'Movies'
})
})
it('can handle empty guide', () => {
const noContent = fs.readFileSync(path.resolve('sites/bein.com/__data__/no-content.html'))
const result = parser({
date,
channel,
content: noContent
})
expect(result).toMatchObject([])
})

View File

@@ -1,70 +1,70 @@
<?xml version="1.0" encoding="UTF-8"?>
<channels>
<channel site="bein.com" lang="ar" xmltv_id="AlJazeeraDocumentary.qa" site_id="entertainment#26">26</channel>
<channel site="bein.com" lang="ar" xmltv_id="AlkassOne.qa" site_id="sports#34">34</channel>
<channel site="bein.com" lang="ar" xmltv_id="AlkassThree.qa" site_id="sports#33">33</channel>
<channel site="bein.com" lang="ar" xmltv_id="BabyTV.uk" site_id="entertainment#32">32</channel>
<channel site="bein.com" lang="ar" xmltv_id="Baraem.qa" site_id="entertainment#30">30</channel>
<channel site="bein.com" lang="ar" xmltv_id="BBCEarth.uk@MiddleEast" site_id="entertainment#25">25</channel>
<channel site="bein.com" lang="ar" xmltv_id="beIN4K.qa" site_id="sports#15">15</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINDrama1.qa" site_id="entertainment#10">10</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINGourmet.qa" site_id="entertainment#11">11</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINMovies1Premiere.qa" site_id="entertainment#1">1</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINMovies2Action.qa" site_id="entertainment#2">2</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINMovies3Drama.qa" site_id="entertainment#3">3</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINMovies4Family.qa" site_id="entertainment#4">4</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSeries1.qa" site_id="entertainment#8">8</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSeries2.qa" site_id="entertainment#9">9</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSports1.qa" site_id="sports#3">3</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSports2.qa" site_id="sports#4">4</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSports3.qa" site_id="sports#5">5</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSports4.qa" site_id="sports#6">6</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSports5.qa" site_id="sports#7">7</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSports6.qa" site_id="sports#8">8</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSports7.qa" site_id="sports#9">9</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSports.qa" site_id="sports#2">2</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsAFC1.qa" site_id="sports#17">17</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsAFC2.qa" site_id="sports#18">18</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsAFC3.qa" site_id="sports#19">19</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsAFC.qa" site_id="sports#16">16</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsEnglish1.qa" site_id="sports#20">20</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsEnglish2.qa" site_id="sports#21">21</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsEnglish3.qa" site_id="sports#22">22</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsFrench1.qa" site_id="sports#24">24</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsFrench2.qa" site_id="sports#25">25</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsFrench3.qa" site_id="sports#26">26</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsMax1.qa" site_id="sports#27">27</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsMax2.qa" site_id="sports#28">28</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsMax3.qa" site_id="sports#29">29</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsMax4.qa" site_id="sports#30">30</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsMax5.qa" site_id="sports#31">31</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsMax6.qa" site_id="sports#32">32</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsNBA.qa" site_id="sports#23">23</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsNews.qa" site_id="sports#1">1</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsPremium1.qa" site_id="sports#10">10</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsPremium2.qa" site_id="sports#11">11</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsPremium3.qa" site_id="sports#12">12</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsXtra1.qa" site_id="sports#13">13</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsXtra2.qa" site_id="sports#14">14</channel>
<channel site="bein.com" lang="ar" xmltv_id="BeJunior.qa" site_id="entertainment#21">21</channel>
<channel site="bein.com" lang="ar" xmltv_id="BloombergTV.us@MiddleEast" site_id="entertainment#22">22</channel>
<channel site="bein.com" lang="ar" xmltv_id="CartoonNetworkMENA.uk" site_id="entertainment#33">33</channel>
<channel site="bein.com" lang="ar" xmltv_id="CBeebiesMiddleEast.uk" site_id="entertainment#31">31</channel>
<channel site="bein.com" lang="ar" xmltv_id="ClubMTVEurope.uk" site_id="entertainment#20">20</channel>
<channel site="bein.com" lang="ar" xmltv_id="CNNArabic.ae" site_id="entertainment#27">27</channel>
<channel site="bein.com" lang="ar" xmltv_id="EuronewsEnglish.fr" site_id="entertainment#28">28</channel>
<channel site="bein.com" lang="ar" xmltv_id="Fatafeat.ae" site_id="entertainment#17">17</channel>
<channel site="bein.com" lang="ar" xmltv_id="FoodNetworkEMEA.us" site_id="entertainment#14">14</channel>
<channel site="bein.com" lang="ar" xmltv_id="FoxActionMoviesMENA.hk" site_id="entertainment#6">6</channel>
<channel site="bein.com" lang="ar" xmltv_id="FoxArabia.ae" site_id="entertainment#13">13</channel>
<channel site="bein.com" lang="ar" xmltv_id="FoxMoviesMiddleEast.us" site_id="entertainment#5">5</channel>
<channel site="bein.com" lang="ar" xmltv_id="HGTVArabia.us" site_id="entertainment#15">15</channel>
<channel site="bein.com" lang="ar" xmltv_id="JeemTV.qa" site_id="entertainment#29">29</channel>
<channel site="bein.com" lang="ar" xmltv_id="MTV80s.uk" site_id="entertainment#18">18</channel>
<channel site="bein.com" lang="ar" xmltv_id="MTV90s.uk" site_id="entertainment#19">19</channel>
<channel site="bein.com" lang="ar" xmltv_id="NationalGeographicMiddleEast.uk" site_id="entertainment#23">23</channel>
<channel site="bein.com" lang="ar" xmltv_id="NationalGeographicWildMiddleEast.uk" site_id="entertainment#24">24</channel>
<channel site="bein.com" lang="ar" xmltv_id="StarMoviesMiddleEast.ae" site_id="entertainment#7">7</channel>
<channel site="bein.com" lang="ar" xmltv_id="StarWorldMiddleEast.ae" site_id="entertainment#16">16</channel>
<channel site="bein.com" lang="ar" xmltv_id="TravelChannelEMEA.uk" site_id="entertainment#12">12</channel>
</channels>
<?xml version="1.0" encoding="UTF-8"?>
<channels>
<channel site="bein.com" lang="ar" xmltv_id="AlJazeeraDocumentary.qa" site_id="entertainment#26">26</channel>
<channel site="bein.com" lang="ar" xmltv_id="AlkassOne.qa" site_id="sports#34">34</channel>
<channel site="bein.com" lang="ar" xmltv_id="AlkassThree.qa" site_id="sports#33">33</channel>
<channel site="bein.com" lang="ar" xmltv_id="BabyTV.uk" site_id="entertainment#32">32</channel>
<channel site="bein.com" lang="ar" xmltv_id="Baraem.qa" site_id="entertainment#30">30</channel>
<channel site="bein.com" lang="ar" xmltv_id="BBCEarth.uk@MiddleEast" site_id="entertainment#25">25</channel>
<channel site="bein.com" lang="ar" xmltv_id="beIN4K.qa" site_id="sports#15">15</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINDrama1.qa" site_id="entertainment#10">10</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINGourmet.qa" site_id="entertainment#11">11</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINMovies1Premiere.qa" site_id="entertainment#1">1</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINMovies2Action.qa" site_id="entertainment#2">2</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINMovies3Drama.qa" site_id="entertainment#3">3</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINMovies4Family.qa" site_id="entertainment#4">4</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSeries1.qa" site_id="entertainment#8">8</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSeries2.qa" site_id="entertainment#9">9</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSports1.qa" site_id="sports#3">3</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSports2.qa" site_id="sports#4">4</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSports3.qa" site_id="sports#5">5</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSports4.qa" site_id="sports#6">6</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSports5.qa" site_id="sports#7">7</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSports6.qa" site_id="sports#8">8</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSports7.qa" site_id="sports#9">9</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSports.qa" site_id="sports#2">2</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsAFC1.qa" site_id="sports#17">17</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsAFC2.qa" site_id="sports#18">18</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsAFC3.qa" site_id="sports#19">19</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsAFC.qa" site_id="sports#16">16</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsEnglish1.qa" site_id="sports#20">20</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsEnglish2.qa" site_id="sports#21">21</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsEnglish3.qa" site_id="sports#22">22</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsFrench1.qa" site_id="sports#24">24</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsFrench2.qa" site_id="sports#25">25</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsFrench3.qa" site_id="sports#26">26</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsMax1.qa" site_id="sports#27">27</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsMax2.qa" site_id="sports#28">28</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsMax3.qa" site_id="sports#29">29</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsMax4.qa" site_id="sports#30">30</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsMax5.qa" site_id="sports#31">31</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsMax6.qa" site_id="sports#32">32</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsNBA.qa" site_id="sports#23">23</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsNews.qa" site_id="sports#1">1</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsPremium1.qa" site_id="sports#10">10</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsPremium2.qa" site_id="sports#11">11</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsPremium3.qa" site_id="sports#12">12</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsXtra1.qa" site_id="sports#13">13</channel>
<channel site="bein.com" lang="ar" xmltv_id="beINSportsXtra2.qa" site_id="sports#14">14</channel>
<channel site="bein.com" lang="ar" xmltv_id="BeJunior.qa" site_id="entertainment#21">21</channel>
<channel site="bein.com" lang="ar" xmltv_id="BloombergTV.us@MiddleEast" site_id="entertainment#22">22</channel>
<channel site="bein.com" lang="ar" xmltv_id="CartoonNetworkMENA.uk" site_id="entertainment#33">33</channel>
<channel site="bein.com" lang="ar" xmltv_id="CBeebiesMiddleEast.uk" site_id="entertainment#31">31</channel>
<channel site="bein.com" lang="ar" xmltv_id="ClubMTVEurope.uk" site_id="entertainment#20">20</channel>
<channel site="bein.com" lang="ar" xmltv_id="CNNArabic.ae" site_id="entertainment#27">27</channel>
<channel site="bein.com" lang="ar" xmltv_id="EuronewsEnglish.fr" site_id="entertainment#28">28</channel>
<channel site="bein.com" lang="ar" xmltv_id="Fatafeat.ae" site_id="entertainment#17">17</channel>
<channel site="bein.com" lang="ar" xmltv_id="FoodNetworkEMEA.us" site_id="entertainment#14">14</channel>
<channel site="bein.com" lang="ar" xmltv_id="FoxActionMoviesMENA.hk" site_id="entertainment#6">6</channel>
<channel site="bein.com" lang="ar" xmltv_id="FoxArabia.ae" site_id="entertainment#13">13</channel>
<channel site="bein.com" lang="ar" xmltv_id="FoxMoviesMiddleEast.us" site_id="entertainment#5">5</channel>
<channel site="bein.com" lang="ar" xmltv_id="HGTVArabia.us" site_id="entertainment#15">15</channel>
<channel site="bein.com" lang="ar" xmltv_id="JeemTV.qa" site_id="entertainment#29">29</channel>
<channel site="bein.com" lang="ar" xmltv_id="MTV80s.uk" site_id="entertainment#18">18</channel>
<channel site="bein.com" lang="ar" xmltv_id="MTV90s.uk" site_id="entertainment#19">19</channel>
<channel site="bein.com" lang="ar" xmltv_id="NationalGeographicMiddleEast.uk" site_id="entertainment#23">23</channel>
<channel site="bein.com" lang="ar" xmltv_id="NationalGeographicWildMiddleEast.uk" site_id="entertainment#24">24</channel>
<channel site="bein.com" lang="ar" xmltv_id="StarMoviesMiddleEast.ae" site_id="entertainment#7">7</channel>
<channel site="bein.com" lang="ar" xmltv_id="StarWorldMiddleEast.ae" site_id="entertainment#16">16</channel>
<channel site="bein.com" lang="ar" xmltv_id="TravelChannelEMEA.uk" site_id="entertainment#12">12</channel>
</channels>

View File

@@ -1,70 +1,70 @@
<?xml version="1.0" encoding="UTF-8"?>
<channels>
<channel site="bein.com" lang="en" xmltv_id="AlkassOne.qa" site_id="sports#33">33</channel>
<channel site="bein.com" lang="en" xmltv_id="AlkassTwo.qa" site_id="sports#34">34</channel>
<channel site="bein.com" lang="en" xmltv_id="Baraem.qa" site_id="entertainment#31">31</channel>
<channel site="bein.com" lang="en" xmltv_id="BBCEarth.uk@MiddleEast" site_id="entertainment#25">25</channel>
<channel site="bein.com" lang="en" xmltv_id="beIN4K.qa" site_id="sports#15">15</channel>
<channel site="bein.com" lang="en" xmltv_id="beINDrama1.qa" site_id="entertainment#10">10</channel>
<channel site="bein.com" lang="en" xmltv_id="beINGourmet.qa" site_id="entertainment#11">11</channel>
<channel site="bein.com" lang="en" xmltv_id="beINMovies1Premiere.qa" site_id="entertainment#1">1</channel>
<channel site="bein.com" lang="en" xmltv_id="beINMovies2Action.qa" site_id="entertainment#2">2</channel>
<channel site="bein.com" lang="en" xmltv_id="beINMovies3Drama.qa" site_id="entertainment#3">3</channel>
<channel site="bein.com" lang="en" xmltv_id="beINMovies4Family.qa" site_id="entertainment#4">4</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSeries1.qa" site_id="entertainment#8">8</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSeries2.qa" site_id="entertainment#9">9</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSports1.qa" site_id="sports#3">3</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSports2.qa" site_id="sports#4">4</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSports3.qa" site_id="sports#5">5</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSports4.qa" site_id="sports#6">6</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSports5.qa" site_id="sports#7">7</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSports6.qa" site_id="sports#8">8</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSports7.qa" site_id="sports#9">9</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSports.qa" site_id="sports#2">2</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsAFC1.qa" site_id="sports#17">17</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsAFC2.qa" site_id="sports#18">18</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsAFC3.qa" site_id="sports#19">19</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsAFC.qa" site_id="sports#16">16</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsEnglish1.qa" site_id="sports#20">20</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsEnglish2.qa" site_id="sports#21">21</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsEnglish3.qa" site_id="sports#22">22</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsFrench1.qa" site_id="sports#24">24</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsFrench2.qa" site_id="sports#25">25</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsFrench3.qa" site_id="sports#26">26</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsMax1.qa" site_id="sports#27">27</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsMax2.qa" site_id="sports#28">28</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsMax3.qa" site_id="sports#29">29</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsMax4.qa" site_id="sports#30">30</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsMax5.qa" site_id="sports#31">31</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsMax6.qa" site_id="sports#32">32</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsNBA.qa" site_id="sports#23">23</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsNews.qa" site_id="sports#1">1</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsPremium1.qa" site_id="sports#10">10</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsPremium2.qa" site_id="sports#11">11</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsPremium3.qa" site_id="sports#12">12</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsXtra1.qa" site_id="sports#13">13</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsXtra2.qa" site_id="sports#14">14</channel>
<channel site="bein.com" lang="en" xmltv_id="BeJunior.qa" site_id="entertainment#29">29</channel>
<channel site="bein.com" lang="en" xmltv_id="BloombergTV.us@MiddleEast" site_id="entertainment#22">22</channel>
<channel site="bein.com" lang="en" xmltv_id="CartoonNetworkArabic.ae" site_id="entertainment#33">33</channel>
<channel site="bein.com" lang="en" xmltv_id="CartoonNetworkMENA.uk" site_id="entertainment#32">32</channel>
<channel site="bein.com" lang="en" xmltv_id="ClubMTVEurope.uk" site_id="entertainment#21">21</channel>
<channel site="bein.com" lang="en" xmltv_id="CNNArabic.ae" site_id="entertainment#26">26</channel>
<channel site="bein.com" lang="en" xmltv_id="DiscoveryChannelMiddleEastAfrica.us" site_id="entertainment#28">28</channel>
<channel site="bein.com" lang="en" xmltv_id="EuronewsEnglish.fr" site_id="entertainment#27">27</channel>
<channel site="bein.com" lang="en" xmltv_id="Fatafeat.ae" site_id="entertainment#17">17</channel>
<channel site="bein.com" lang="en" xmltv_id="FoodNetworkEMEA.us" site_id="entertainment#14">14</channel>
<channel site="bein.com" lang="en" xmltv_id="FoxActionMoviesMENA.hk" site_id="entertainment#6">6</channel>
<channel site="bein.com" lang="en" xmltv_id="FoxArabia.ae" site_id="entertainment#13">13</channel>
<channel site="bein.com" lang="en" xmltv_id="FoxLifeMiddleEast.ae" site_id="entertainment#18">18</channel>
<channel site="bein.com" lang="en" xmltv_id="FoxMoviesMiddleEast.us" site_id="entertainment#5">5</channel>
<channel site="bein.com" lang="en" xmltv_id="HGTVArabia.us" site_id="entertainment#15">15</channel>
<channel site="bein.com" lang="en" xmltv_id="JeemTV.qa" site_id="entertainment#30">30</channel>
<channel site="bein.com" lang="en" xmltv_id="MTV80s.uk" site_id="entertainment#19">19</channel>
<channel site="bein.com" lang="en" xmltv_id="MTV90s.uk" site_id="entertainment#20">20</channel>
<channel site="bein.com" lang="en" xmltv_id="NationalGeographicMiddleEast.uk" site_id="entertainment#23">23</channel>
<channel site="bein.com" lang="en" xmltv_id="NationalGeographicWildMiddleEast.uk" site_id="entertainment#24">24</channel>
<channel site="bein.com" lang="en" xmltv_id="StarMoviesMiddleEast.ae" site_id="entertainment#7">7</channel>
<channel site="bein.com" lang="en" xmltv_id="StarWorldMiddleEast.ae" site_id="entertainment#16">16</channel>
<channel site="bein.com" lang="en" xmltv_id="TravelChannelEMEA.uk" site_id="entertainment#12">12</channel>
</channels>
<?xml version="1.0" encoding="UTF-8"?>
<channels>
<channel site="bein.com" lang="en" xmltv_id="AlkassOne.qa" site_id="sports#33">33</channel>
<channel site="bein.com" lang="en" xmltv_id="AlkassTwo.qa" site_id="sports#34">34</channel>
<channel site="bein.com" lang="en" xmltv_id="Baraem.qa" site_id="entertainment#31">31</channel>
<channel site="bein.com" lang="en" xmltv_id="BBCEarth.uk@MiddleEast" site_id="entertainment#25">25</channel>
<channel site="bein.com" lang="en" xmltv_id="beIN4K.qa" site_id="sports#15">15</channel>
<channel site="bein.com" lang="en" xmltv_id="beINDrama1.qa" site_id="entertainment#10">10</channel>
<channel site="bein.com" lang="en" xmltv_id="beINGourmet.qa" site_id="entertainment#11">11</channel>
<channel site="bein.com" lang="en" xmltv_id="beINMovies1Premiere.qa" site_id="entertainment#1">1</channel>
<channel site="bein.com" lang="en" xmltv_id="beINMovies2Action.qa" site_id="entertainment#2">2</channel>
<channel site="bein.com" lang="en" xmltv_id="beINMovies3Drama.qa" site_id="entertainment#3">3</channel>
<channel site="bein.com" lang="en" xmltv_id="beINMovies4Family.qa" site_id="entertainment#4">4</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSeries1.qa" site_id="entertainment#8">8</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSeries2.qa" site_id="entertainment#9">9</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSports1.qa" site_id="sports#3">3</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSports2.qa" site_id="sports#4">4</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSports3.qa" site_id="sports#5">5</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSports4.qa" site_id="sports#6">6</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSports5.qa" site_id="sports#7">7</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSports6.qa" site_id="sports#8">8</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSports7.qa" site_id="sports#9">9</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSports.qa" site_id="sports#2">2</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsAFC1.qa" site_id="sports#17">17</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsAFC2.qa" site_id="sports#18">18</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsAFC3.qa" site_id="sports#19">19</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsAFC.qa" site_id="sports#16">16</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsEnglish1.qa" site_id="sports#20">20</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsEnglish2.qa" site_id="sports#21">21</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsEnglish3.qa" site_id="sports#22">22</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsFrench1.qa" site_id="sports#24">24</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsFrench2.qa" site_id="sports#25">25</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsFrench3.qa" site_id="sports#26">26</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsMax1.qa" site_id="sports#27">27</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsMax2.qa" site_id="sports#28">28</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsMax3.qa" site_id="sports#29">29</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsMax4.qa" site_id="sports#30">30</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsMax5.qa" site_id="sports#31">31</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsMax6.qa" site_id="sports#32">32</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsNBA.qa" site_id="sports#23">23</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsNews.qa" site_id="sports#1">1</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsPremium1.qa" site_id="sports#10">10</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsPremium2.qa" site_id="sports#11">11</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsPremium3.qa" site_id="sports#12">12</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsXtra1.qa" site_id="sports#13">13</channel>
<channel site="bein.com" lang="en" xmltv_id="beINSportsXtra2.qa" site_id="sports#14">14</channel>
<channel site="bein.com" lang="en" xmltv_id="BeJunior.qa" site_id="entertainment#29">29</channel>
<channel site="bein.com" lang="en" xmltv_id="BloombergTV.us@MiddleEast" site_id="entertainment#22">22</channel>
<channel site="bein.com" lang="en" xmltv_id="CartoonNetworkArabic.ae" site_id="entertainment#33">33</channel>
<channel site="bein.com" lang="en" xmltv_id="CartoonNetworkMENA.uk" site_id="entertainment#32">32</channel>
<channel site="bein.com" lang="en" xmltv_id="ClubMTVEurope.uk" site_id="entertainment#21">21</channel>
<channel site="bein.com" lang="en" xmltv_id="CNNArabic.ae" site_id="entertainment#26">26</channel>
<channel site="bein.com" lang="en" xmltv_id="DiscoveryChannelMiddleEastAfrica.us" site_id="entertainment#28">28</channel>
<channel site="bein.com" lang="en" xmltv_id="EuronewsEnglish.fr" site_id="entertainment#27">27</channel>
<channel site="bein.com" lang="en" xmltv_id="Fatafeat.ae" site_id="entertainment#17">17</channel>
<channel site="bein.com" lang="en" xmltv_id="FoodNetworkEMEA.us" site_id="entertainment#14">14</channel>
<channel site="bein.com" lang="en" xmltv_id="FoxActionMoviesMENA.hk" site_id="entertainment#6">6</channel>
<channel site="bein.com" lang="en" xmltv_id="FoxArabia.ae" site_id="entertainment#13">13</channel>
<channel site="bein.com" lang="en" xmltv_id="FoxLifeMiddleEast.ae" site_id="entertainment#18">18</channel>
<channel site="bein.com" lang="en" xmltv_id="FoxMoviesMiddleEast.us" site_id="entertainment#5">5</channel>
<channel site="bein.com" lang="en" xmltv_id="HGTVArabia.us" site_id="entertainment#15">15</channel>
<channel site="bein.com" lang="en" xmltv_id="JeemTV.qa" site_id="entertainment#30">30</channel>
<channel site="bein.com" lang="en" xmltv_id="MTV80s.uk" site_id="entertainment#19">19</channel>
<channel site="bein.com" lang="en" xmltv_id="MTV90s.uk" site_id="entertainment#20">20</channel>
<channel site="bein.com" lang="en" xmltv_id="NationalGeographicMiddleEast.uk" site_id="entertainment#23">23</channel>
<channel site="bein.com" lang="en" xmltv_id="NationalGeographicWildMiddleEast.uk" site_id="entertainment#24">24</channel>
<channel site="bein.com" lang="en" xmltv_id="StarMoviesMiddleEast.ae" site_id="entertainment#7">7</channel>
<channel site="bein.com" lang="en" xmltv_id="StarWorldMiddleEast.ae" site_id="entertainment#16">16</channel>
<channel site="bein.com" lang="en" xmltv_id="TravelChannelEMEA.uk" site_id="entertainment#12">12</channel>
</channels>

View File

@@ -1,39 +1,39 @@
# bein.com
https://www.bein.com/ar/%D8%AC%D8%AF%D9%88%D9%84-%D8%A7%D9%84%D8%A8%D8%AB/ (Arabic)
https://www.bein.com/en/tv-guide/ (English)
### Download the guide
Arabic:
```sh
npm run grab --- --site=bein.com --lang=ar
```
English:
```sh
npm run grab --- --site=bein.com --lang=en
```
### Update channel list
Arabic:
```sh
npm run channels:parse --- --config=./sites/bein.com/bein.com.config.js --output=./sites/bein.com/bein.com_ar.channels.xml --set=lang:ar
```
English:
```sh
npm run channels:parse --- --config=./sites/bein.com/bein.com.config.js --output=./sites/bein.com/bein.com_en.channels.xml --set=lang:en
```
### Test
```sh
npm test --- bein.com
```
# bein.com
https://www.bein.com/ar/%D8%AC%D8%AF%D9%88%D9%84-%D8%A7%D9%84%D8%A8%D8%AB/ (Arabic)
https://www.bein.com/en/tv-guide/ (English)
### Download the guide
Arabic:
```sh
npm run grab --- --site=bein.com --lang=ar
```
English:
```sh
npm run grab --- --site=bein.com --lang=en
```
### Update channel list
Arabic:
```sh
npm run channels:parse --- --config=./sites/bein.com/bein.com.config.js --output=./sites/bein.com/bein.com_ar.channels.xml --set=lang:ar
```
English:
```sh
npm run channels:parse --- --config=./sites/bein.com/bein.com.config.js --output=./sites/bein.com/bein.com_en.channels.xml --set=lang:en
```
### Test
```sh
npm test --- bein.com
```