Merge pull request #1703 from iptv-org/update-dsmart.com.tr

Update dsmart.com.tr
This commit is contained in:
Aleksandr Statciuk 2023-01-17 13:49:49 +03:00 committed by GitHub
commit 2e915ec51d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 75 additions and 54 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,22 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<site site="dsmart.com.tr">
<channels>
<channel lang="en" xmltv_id="ANews.tr" site_id="59638e5fcfef0b43f0fd31b5">A News</channel>
<channel lang="en" xmltv_id="BabyTV.uk" site_id="58d29bb0eefad3db9c6062b7">Baby TV Europe</channel>
<channel lang="en" xmltv_id="BBCWorldNewsEurope.uk" site_id="58d29bb0eefad3db9c6062c6">BBC World News Europe</channel>
<channel lang="en" xmltv_id="CNNInternationalEurope.us" site_id="58d29bb0eefad3db9c6062b8">CNN International Europe</channel>
<channel lang="en" xmltv_id="FashionTVEurope.fr" site_id="59dca3b2cfef0b4d80a47b77">FashionTV HD Europe</channel>
<channel lang="en" xmltv_id="NBATV.us" site_id="58d29bb0eefad3db9c60626e">NBA TV</channel>
<channel lang="en" xmltv_id="TraceUrban.fr" site_id="58d29bb0eefad3db9c6062c5">Trace Urban</channel>
<channel lang="tr" xmltv_id="24KitchenTurkey.tr" site_id="58d29bb0eefad3db9c60627b">24 Kitchen Türkiye</channel>
<channel lang="tr" xmltv_id="24TV.tr" site_id="58d29bb0eefad3db9c60622e">24 TV</channel>
<channel lang="tr" xmltv_id="360.tr" site_id="58d29bb0eefad3db9c606236">360</channel>
<channel lang="tr" xmltv_id="AHaber.tr" site_id="58d29bb0eefad3db9c60625e">A Haber</channel>
<channel lang="tr" xmltv_id="ANews.tr" site_id="59638e5fcfef0b43f0fd31b5">A News</channel>
<channel lang="tr" xmltv_id="ASpor.tr" site_id="58d29bb0eefad3db9c6062b2">A Spor</channel>
<channel lang="tr" xmltv_id="ATV.tr" site_id="58d29bb0eefad3db9c60625f">ATV Türkiye</channel>
<channel lang="tr" xmltv_id="BabyTV.uk" site_id="58d29bb0eefad3db9c6062b7">Baby TV Europe</channel>
<channel lang="tr" xmltv_id="BBCEarthTurkey.tr" site_id="58d29bb0eefad3db9c6062bc">BBC Earth Türkiye</channel>
<channel lang="tr" xmltv_id="BBCWorldNewsEurope.uk" site_id="58d29bb0eefad3db9c6062c6">BBC World News Europe</channel>
<channel lang="tr" xmltv_id="BBNTurk.tr" site_id="5fd318b4cfef0b15932230d0">BBN Türk</channel>
<channel lang="tr" xmltv_id="BeyazTV.tr" site_id="58d29bb0eefad3db9c606298">Beyaz TV</channel>
<channel lang="tr" xmltv_id="BloombergHT.tr" site_id="58d29bb0eefad3db9c60623e">Bloomberg HT</channel>
<channel lang="tr" xmltv_id="BoomerangTurkey.tr" site_id="58d29bb0eefad3db9c6062b9">Boomerang Türkiye</channel>
<channel lang="tr" xmltv_id="CartoonNetworkTurkey.tr" site_id="58d29bb0eefad3db9c6062c8">Cartoon Network Türkiye</channel>
<channel lang="tr" xmltv_id="CNNInternationalEurope.us" site_id="58d29bb0eefad3db9c6062b8">CNN International Europe</channel>
<channel lang="tr" xmltv_id="CNNTurk.tr" site_id="59dca1f3cfef0b4d80a47a5f">CNN Türk</channel>
<channel lang="tr" xmltv_id="CocukSmart.tr" site_id="58d29bb0eefad3db9c6062b5">Çocuk Smart</channel>
<channel lang="tr" xmltv_id="DaVinci.de" site_id="58d29bb0eefad3db9c6062b6">Da Vinci</channel>
@ -31,7 +34,6 @@
<channel lang="tr" xmltv_id="EuroD.tr" site_id="59dcbfdccfef0b4d80a4974a">Euro D</channel>
<channel lang="tr" xmltv_id="Eurosport1.fr" site_id="58d29bb0eefad3db9c6062aa">Eurosport 1</channel>
<channel lang="tr" xmltv_id="Eurosport2.fr" site_id="58d29bb0eefad3db9c606281">Eurosport 2</channel>
<channel lang="tr" xmltv_id="FashionTVEurope.fr" site_id="59dca3b2cfef0b4d80a47b77">FashionTV HD Europe</channel>
<channel lang="tr" xmltv_id="FastFunBox.nl" site_id="58d29bb0eefad3db9c6062bf">Fast &amp; FunBox HD</channel>
<channel lang="tr" xmltv_id="FBTV.tr" site_id="58d29bb0eefad3db9c606235">FB TV</channel>
<channel lang="tr" xmltv_id="FightBox.nl" site_id="58d29bb0eefad3db9c6062b4">FightBox HD</channel>
@ -54,7 +56,6 @@
<channel lang="tr" xmltv_id="MovieSmartTurk.tr" site_id="58d29bb0eefad3db9c606299">MovieSmart Türk</channel>
<channel lang="tr" xmltv_id="NationalGeographicTurkey.tr" site_id="58d29bb0eefad3db9c6062a4">National Geographic Türkiye</channel>
<channel lang="tr" xmltv_id="NationalGeographicWildTurkey.tr" site_id="58d29bb0eefad3db9c6062a5">National Geographic Wild Türkiye</channel>
<channel lang="tr" xmltv_id="NBATV.us" site_id="58d29bb0eefad3db9c60626e">NBA TV</channel>
<channel lang="tr" xmltv_id="NTV.tr" site_id="58d29bb0eefad3db9c60623a">NTV</channel>
<channel lang="tr" xmltv_id="Number1Turk.tr" site_id="58d29bb0eefad3db9c606245">Number 1 Türk</channel>
<channel lang="tr" xmltv_id="Number1TV.tr" site_id="58d29bb0eefad3db9c60623c">Number 1 TV</channel>
@ -82,7 +83,6 @@
<channel lang="tr" xmltv_id="TGRTHaber.tr" site_id="58d29bb0eefad3db9c60623d">TGRT Haber</channel>
<channel lang="tr" xmltv_id="TLCTurkey.tr" site_id="58d29bb0eefad3db9c606238">TLC Türkiye</channel>
<channel lang="tr" xmltv_id="TMB.tr" site_id="58d29bb0eefad3db9c606272">TMB</channel>
<channel lang="tr" xmltv_id="TraceUrban.fr" site_id="58d29bb0eefad3db9c6062c5">Trace Urban</channel>
<channel lang="tr" xmltv_id="TRT1.tr" site_id="58d29bb0eefad3db9c606274">TRT 1</channel>
<channel lang="tr" xmltv_id="TRT2.tr" site_id="58d29bb0eefad3db9c606263">TRT 2</channel>
<channel lang="tr" xmltv_id="TRT3.tr" site_id="58d29bb0eefad3db9c606231">TRT 3</channel>

View file

@ -1,7 +1,9 @@
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const customParseFormat = require('dayjs/plugin/customParseFormat')
dayjs.extend(utc)
dayjs.extend(customParseFormat)
module.exports = {
site: 'dsmart.com.tr',
@ -16,23 +18,27 @@ module.exports = {
'YYYY-MM-DD'
)}`
},
parser: function ({ content, channel, date }) {
parser: function ({ content, channel }) {
let offset = -1
let programs = []
const items = parseItems(content, channel)
items.forEach(item => {
let start = parseStart(item, date)
if (offset === -1 && start.hour() > 18) start = start.subtract(1, 'd')
let stop = parseStop(item, date)
if (offset === -1 && stop.hour() > 18) stop = stop.subtract(1, 'd')
if (start.hour() < 18 || stop.hour() < 18) offset = 0
items.forEach((item, i) => {
const prev = programs[programs.length - 1]
let start
if (prev) {
start = parseStart(item, prev.stop)
} else {
start = parseStart(item, dayjs.utc(item.day))
}
let duration = parseDuration(item)
let stop = start.add(duration, 's')
programs.push({
title: item.program_name,
category: item.genre,
description: item.description,
start: start.toJSON(),
stop: stop.toJSON()
description: item.description.trim(),
start,
stop
})
})
@ -41,22 +47,21 @@ module.exports = {
}
function parseStart(item, date) {
return dayjs.utc(item.start_date).set('date', date.get('date'))
const time = dayjs.utc(item.start_date)
return dayjs.utc(`${date.format('YYYY-MM-DD')} ${time.format('HH:mm:ss')}`, 'YYYY-MM-DD HH:mm:ss')
}
function parseStop(item, date) {
return dayjs.utc(item.end_date).set('date', date.get('date'))
}
function parseDuration(item) {
const [_, H, mm, ss] = item.duration.match(/(\d+):(\d+):(\d+)$/)
function parseContent(content, channel) {
const data = JSON.parse(content)
if (!data || !data.data || !Array.isArray(data.data.channels)) return null
return data.data.channels.find(i => i._id == channel.site_id)
return parseInt(H) * 3600 + parseInt(mm) * 60 + parseInt(ss)
}
function parseItems(content, channel) {
const data = parseContent(content, channel)
const data = JSON.parse(content)
if (!data || !data.data || !Array.isArray(data.data.channels)) return null
const channelData = data.data.channels.find(i => i._id == channel.site_id)
return data ? data.schedule : []
return channelData && Array.isArray(channelData.schedule) ? channelData.schedule : []
}

View file

@ -2,49 +2,63 @@
const { parser, url } = require('./dsmart.com.tr.config.js')
const dayjs = require('dayjs')
const fs = require('fs')
const path = require('path')
const utc = require('dayjs/plugin/utc')
const customParseFormat = require('dayjs/plugin/customParseFormat')
dayjs.extend(customParseFormat)
dayjs.extend(utc)
const date = dayjs.utc('2021-11-06', 'YYYY-MM-DD').startOf('d')
const date = dayjs.utc('2023-01-16', 'YYYY-MM-DD').startOf('d')
const channel = {
site_id: '58d29bb0eefad3db9c606290',
xmltv_id: 'MovieSmartPremium.tr'
site_id: '5fe07d7acfef0b1593275751',
xmltv_id: 'SinemaTV.tr'
}
const content = `{"meta": {"code": 200, "message": "OK"}, "data": {"total": 200, "channels": [{"rating": 3, "ch_id": 805, "logo": "59f97253cfef0b75f4723ded", "ch_no": 1, "is_hd": true, "genre": [1, 2], "packages": ["58cfc9c7e138237a591f9a61", "58cfc9c7e138237a591f9a62", "58cfc9c7e138237a591f9a5f", "58cfc9c7e138237a591f9a60"], "slug": "moviesmart-premium", "hd": true, "_id": "58d29bb0eefad3db9c606290", "order": 1, "channel_name": "MovieSmart Premium", "description": "", "schedule": [{"actor": "", "year": "2015", "id": "60488f69cfef0b15935d70d7", "subject": "Goosebumps: Canavarlar Firarda (Goosebumps) T\\u00fcr: Komedi - Macera Y\\u00f6netmen: Rob Letterman Oyuncular: Jack Black, Dylan Minnette, Odeya Rush", "audio_subtitles": 3, "start_date": "2021-11-03T21:15:00Z", "channel": "58d29bb0eefad3db9c606290", "description": "B\\u00fcy\\u00fck \\u015fehirden k\\u00fc\\u00e7\\u00fck bir kasabaya ta\\u015f\\u0131nd\\u0131\\u011f\\u0131 i\\u00e7in mutsuz olan Zach Cooper, ta\\u015f\\u0131nd\\u0131klar\\u0131 evin tam yan\\u0131ndaki evde ya\\u015fayan g\\u00fczel k\\u0131z Hannah ile kar\\u015f\\u0131la\\u015f\\u0131p, Champ ile de k\\u0131sa s\\u00fcrede arkada\\u015f olunca yeni bir hayat i\\u00e7in umutlan\\u0131r. Ancak Zach, Hannah'n\\u0131n gizemli babas\\u0131n\\u0131n Goosebumps kitaplar\\u0131n\\u0131n yazar\\u0131, R.L. Stine oldu\\u011funu \\u00f6\\u011frendi\\u011finde, olaylar\\u0131n normal gitmeyece\\u011fini anlar. (Dil:T\\u00fcrk\\u00e7e/Orijinal - Altyaz\\u0131:T\\u00fcrk\\u00e7e/\\u0130ngilizce)", "director": "", "end_date": "2021-11-03T23:55:00Z", "genre": "sinema/genel", "program_name": "Goosebumps: Canavarlar Firarda", "day": "2021-11-05T21:00:00Z", "episode": "", "screen_violence": 4, "_id": "6185a3f6cfef0b1593e44e63", "duration": "1:40:00"},{"actor": "", "year": "2015", "id": "60488f69cfef0b15935d70d7", "subject": "Goosebumps: Canavarlar Firarda (Goosebumps) T\\u00fcr: Komedi - Macera Y\\u00f6netmen: Rob Letterman Oyuncular: Jack Black, Dylan Minnette, Odeya Rush", "audio_subtitles": 3, "start_date": "2021-11-03T23:55:00Z", "channel": "58d29bb0eefad3db9c606290", "description": "B\\u00fcy\\u00fck \\u015fehirden k\\u00fc\\u00e7\\u00fck bir kasabaya ta\\u015f\\u0131nd\\u0131\\u011f\\u0131 i\\u00e7in mutsuz olan Zach Cooper, ta\\u015f\\u0131nd\\u0131klar\\u0131 evin tam yan\\u0131ndaki evde ya\\u015fayan g\\u00fczel k\\u0131z Hannah ile kar\\u015f\\u0131la\\u015f\\u0131p, Champ ile de k\\u0131sa s\\u00fcrede arkada\\u015f olunca yeni bir hayat i\\u00e7in umutlan\\u0131r. Ancak Zach, Hannah'n\\u0131n gizemli babas\\u0131n\\u0131n Goosebumps kitaplar\\u0131n\\u0131n yazar\\u0131, R.L. Stine oldu\\u011funu \\u00f6\\u011frendi\\u011finde, olaylar\\u0131n normal gitmeyece\\u011fini anlar. (Dil:T\\u00fcrk\\u00e7e/Orijinal - Altyaz\\u0131:T\\u00fcrk\\u00e7e/\\u0130ngilizce)", "director": "", "end_date": "2021-11-03T01:55:00Z", "genre": "sinema/genel", "program_name": "Goosebumps: Canavarlar Firarda", "day": "2021-11-05T21:00:00Z", "episode": "", "screen_violence": 4, "_id": "6185a3f6cfef0b1593e44e63", "duration": "1:40:00"}]}]}}`
it('can generate valid url', () => {
expect(url({ date, channel })).toBe(
'https://www.dsmart.com.tr/api/v1/public/epg/schedules?page=1&limit=500&day=2021-11-06'
'https://www.dsmart.com.tr/api/v1/public/epg/schedules?page=1&limit=500&day=2023-01-16'
)
})
it('can parse response', () => {
const result = parser({ date, channel, content })
expect(result).toMatchObject([
{
start: '2021-11-05T21:15:00.000Z',
stop: '2021-11-05T23:55:00.000Z',
title: 'Goosebumps: Canavarlar Firarda',
category: 'sinema/genel',
description: `Büyük şehirden küçük bir kasabaya taşındığı için mutsuz olan Zach Cooper, taşındıkları evin tam yanındaki evde yaşayan güzel kız Hannah ile karşılaşıp, Champ ile de kısa sürede arkadaş olunca yeni bir hayat için umutlanır. Ancak Zach, Hannah'nın gizemli babasının Goosebumps kitaplarının yazarı, R.L. Stine olduğunu öğrendiğinde, olayların normal gitmeyeceğini anlar. (Dil:Türkçe/Orijinal - Altyazı:Türkçe/İngilizce)`
},
{
start: '2021-11-05T23:55:00.000Z',
stop: '2021-11-06T01:55:00.000Z',
title: 'Goosebumps: Canavarlar Firarda',
category: 'sinema/genel',
description: `Büyük şehirden küçük bir kasabaya taşındığı için mutsuz olan Zach Cooper, taşındıkları evin tam yanındaki evde yaşayan güzel kız Hannah ile karşılaşıp, Champ ile de kısa sürede arkadaş olunca yeni bir hayat için umutlanır. Ancak Zach, Hannah'nın gizemli babasının Goosebumps kitaplarının yazarı, R.L. Stine olduğunu öğrendiğinde, olayların normal gitmeyeceğini anlar. (Dil:Türkçe/Orijinal - Altyazı:Türkçe/İngilizce)`
}
])
const content = fs.readFileSync(path.resolve(__dirname, '__data__/content.json'))
const results = parser({ channel, content }).map(p => {
p.start = p.start.toJSON()
p.stop = p.stop.toJSON()
return p
})
expect(results[0]).toMatchObject({
start: '2023-01-15T22:00:00.000Z',
stop: '2023-01-15T23:45:00.000Z',
title: 'Bizi Ayıran Her Şey',
category: 'sinema/genel',
description: `Issızlığın ortasında yer alan orta sınıf bir evde bir anne kız yaşamaktadır. Çevrelerindeki taşları insanlarla yaşadıkları çatışmalar, anne-kızın hayatını olumsuz yönde etkilemektedir. Kızının ansızın ortadan kaybolması, bu çatışmaların seviyesini artıracak ve anne, kızını bulmak için her türlü yola başvuracaktır.`
})
expect(results[1]).toMatchObject({
start: '2023-01-15T23:45:00.000Z',
stop: '2023-01-16T01:30:00.000Z',
title: 'Pixie',
category: 'sinema/genel',
description: `Annesinin intikamını almak isteyen Pixie, dahiyane bir soygun planlar. Fakat işler planladığı gibi gitmeyince kendini İrlandanın vahşi gangsterleri tarafından kovalanan iki adamla birlikte kaçarken bulur.`
})
expect(results[12]).toMatchObject({
start: '2023-01-16T20:30:00.000Z',
stop: '2023-01-16T22:30:00.000Z',
title: 'Seberg',
category: 'sinema/genel',
description: `Başrolünde ünlü yıldız Kristen Stewartın yer aldığı politik gerilim, 1960ların sonunda insan hakları aktivisti Hakim Jamal ile yaşadığı politik ve romantik ilişki sebebiyle FBI tarafından hedef alınan, Fransız Yeni Dalgasının sevilen yüzü ve Serseri Aşıkların yıldızı Jean Sebergün çarpıcı hikayesini anlatıyor.`
})
})
it('can handle empty guide', () => {
const result = parser({
date,
const results = parser({
channel,
content: `{"meta": {"code": 200, "message": "OK"}, "data": {"total": 200, "channels": []}}`
content: fs.readFileSync(path.resolve(__dirname, '__data__/no_content.json'))
})
expect(result).toMatchObject([])
expect(results).toMatchObject([])
})