wip
This commit is contained in:
		
							parent
							
								
									cc54269b6b
								
							
						
					
					
						commit
						436bea6761
					
				| 
						 | 
					@ -1,13 +1,13 @@
 | 
				
			||||||
class Channel {
 | 
					class Channel {
 | 
				
			||||||
	constructor(c) {
 | 
						constructor(c) {
 | 
				
			||||||
		const data = {
 | 
							const data = {
 | 
				
			||||||
			id: c.xmltv_id,
 | 
								id: c.id || c.xmltv_id,
 | 
				
			||||||
			name: c.name,
 | 
								name: c.name,
 | 
				
			||||||
			site: c.site || '',
 | 
								site: c.site || '',
 | 
				
			||||||
			site_id: c.site_id,
 | 
								site_id: c.site_id,
 | 
				
			||||||
			lang: c.lang || '',
 | 
								lang: c.lang || '',
 | 
				
			||||||
			logo: c.logo || '',
 | 
								logo: c.logo || '',
 | 
				
			||||||
			url: c.site ? `https://${c.site}` : ''
 | 
								url: c.url || toURL(c.site)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		for (let key in data) {
 | 
							for (let key in data) {
 | 
				
			||||||
| 
						 | 
					@ -17,3 +17,7 @@ class Channel {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module.exports = Channel
 | 
					module.exports = Channel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function toURL(site) {
 | 
				
			||||||
 | 
						return site ? `https://${site}` : ''
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,18 +2,18 @@ const { padStart } = require('lodash')
 | 
				
			||||||
const { toArray, toUnix, parseNumber } = require('./utils')
 | 
					const { toArray, toUnix, parseNumber } = require('./utils')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Program {
 | 
					class Program {
 | 
				
			||||||
	constructor(p, c) {
 | 
						constructor(p) {
 | 
				
			||||||
		const data = {
 | 
							const data = {
 | 
				
			||||||
			channel: c.id,
 | 
								channel: p.channel,
 | 
				
			||||||
			title: p.title,
 | 
								title: p.title,
 | 
				
			||||||
			sub_title: p.sub_title || '',
 | 
								sub_title: p.sub_title || '',
 | 
				
			||||||
			description: p.description || p.desc,
 | 
								description: [p.description, p.desc, ''].find(i => i !== undefined),
 | 
				
			||||||
			icon: toIconObject(p.icon),
 | 
								icon: toIconObject(p.icon),
 | 
				
			||||||
			episodeNumbers: getEpisodeNumbers(p.season, p.episode),
 | 
								episodeNumbers: getEpisodeNumbers(p.season, p.episode),
 | 
				
			||||||
			date: p.date ? toUnix(p.date) : null,
 | 
								date: p.date ? toUnix(p.date) : null,
 | 
				
			||||||
			start: toUnix(p.start),
 | 
								start: toUnix(p.start),
 | 
				
			||||||
			stop: toUnix(p.stop),
 | 
								stop: toUnix(p.stop),
 | 
				
			||||||
			urls: toArray(p.url).map(toUrlObject),
 | 
								urls: toArray(p.urls || p.url).map(toUrlObject),
 | 
				
			||||||
			ratings: toArray(p.ratings || p.rating).map(toRatingObject),
 | 
								ratings: toArray(p.ratings || p.rating).map(toRatingObject),
 | 
				
			||||||
			categories: toArray(p.categories || p.category),
 | 
								categories: toArray(p.categories || p.category),
 | 
				
			||||||
			directors: toArray(p.directors || p.director).map(toPersonObject),
 | 
								directors: toArray(p.directors || p.director).map(toPersonObject),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,12 +18,12 @@ function parseChannels(xml) {
 | 
				
			||||||
  const channels = channelsTag.elements
 | 
					  const channels = channelsTag.elements
 | 
				
			||||||
    .filter(el => el.name === 'channel')
 | 
					    .filter(el => el.name === 'channel')
 | 
				
			||||||
    .map(el => {
 | 
					    .map(el => {
 | 
				
			||||||
      const data = el.attributes
 | 
					      const c = el.attributes
 | 
				
			||||||
      data.name = el.elements.find(el => el.type === 'text').text
 | 
					      c.name = el.elements.find(el => el.type === 'text').text
 | 
				
			||||||
      data.site = data.site || rootSite
 | 
					      c.site = c.site || rootSite
 | 
				
			||||||
      if (!data.name) throw new Error(`Channel '${data.xmltv_id}' has no valid name`)
 | 
					      if (!c.name) throw new Error(`Channel '${c.xmltv_id}' has no valid name`)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      return new Channel(data)
 | 
					      return new Channel(c)
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return { site: rootSite, channels }
 | 
					  return { site: rootSite, channels }
 | 
				
			||||||
| 
						 | 
					@ -41,5 +41,11 @@ async function parsePrograms(data) {
 | 
				
			||||||
    throw new Error('Parser should return an array')
 | 
					    throw new Error('Parser should return an array')
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return programs.filter(i => i).map(p => new Program(p, channel))
 | 
					  return programs
 | 
				
			||||||
 | 
					    .filter(i => i)
 | 
				
			||||||
 | 
					    .map(p => {
 | 
				
			||||||
 | 
					      p.channel = p.channel || channel.id
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return new Program(p)
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -64,7 +64,8 @@ function createElements(channels, programs, date) {
 | 
				
			||||||
					]
 | 
										]
 | 
				
			||||||
				)
 | 
									)
 | 
				
			||||||
			)
 | 
								)
 | 
				
			||||||
		})
 | 
							}),
 | 
				
			||||||
 | 
							'\r\n'
 | 
				
			||||||
	])
 | 
						])
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,3 +20,24 @@ it('can create new Channel', () => {
 | 
				
			||||||
    logo: 'https://example.com/logos/1TV.png'
 | 
					    logo: 'https://example.com/logos/1TV.png'
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					it('can create channel from exist object', () => {
 | 
				
			||||||
 | 
					  const channel = new Channel({
 | 
				
			||||||
 | 
					    name: '1 TV',
 | 
				
			||||||
 | 
					    id: '1TV.com',
 | 
				
			||||||
 | 
					    site_id: '1',
 | 
				
			||||||
 | 
					    site: 'example.com',
 | 
				
			||||||
 | 
					    lang: 'fr',
 | 
				
			||||||
 | 
					    logo: 'https://example.com/logos/1TV.png'
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  expect(channel).toMatchObject({
 | 
				
			||||||
 | 
					    name: '1 TV',
 | 
				
			||||||
 | 
					    id: '1TV.com',
 | 
				
			||||||
 | 
					    site_id: '1',
 | 
				
			||||||
 | 
					    site: 'example.com',
 | 
				
			||||||
 | 
					    url: 'https://example.com',
 | 
				
			||||||
 | 
					    lang: 'fr',
 | 
				
			||||||
 | 
					    logo: 'https://example.com/logos/1TV.png'
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,50 +4,48 @@ import Program from '../src/Program'
 | 
				
			||||||
const channel = new Channel({ xmltv_id: '1tv', lang: 'en' })
 | 
					const channel = new Channel({ xmltv_id: '1tv', lang: 'en' })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
it('can create new Program', () => {
 | 
					it('can create new Program', () => {
 | 
				
			||||||
  const program = new Program(
 | 
					  const program = new Program({
 | 
				
			||||||
    {
 | 
					    channel: channel.id,
 | 
				
			||||||
      title: 'Title',
 | 
					    title: 'Title',
 | 
				
			||||||
      sub_title: 'Subtitle',
 | 
					    sub_title: 'Subtitle',
 | 
				
			||||||
      description: 'Description',
 | 
					    description: 'Description',
 | 
				
			||||||
      icon: 'https://example.com/image.jpg',
 | 
					    icon: 'https://example.com/image.jpg',
 | 
				
			||||||
      season: 9,
 | 
					    season: 9,
 | 
				
			||||||
      episode: 238,
 | 
					    episode: 238,
 | 
				
			||||||
      date: '20220506',
 | 
					    date: '20220506',
 | 
				
			||||||
      start: 1616133600000,
 | 
					    start: 1616133600000,
 | 
				
			||||||
      stop: '2021-03-19T06:30:00.000Z',
 | 
					    stop: '2021-03-19T06:30:00.000Z',
 | 
				
			||||||
      url: 'http://example.com/title.html',
 | 
					    url: 'http://example.com/title.html',
 | 
				
			||||||
      category: ['Category1', 'Category2'],
 | 
					    category: ['Category1', 'Category2'],
 | 
				
			||||||
      rating: {
 | 
					    rating: {
 | 
				
			||||||
        system: 'MPAA',
 | 
					      system: 'MPAA',
 | 
				
			||||||
        value: 'PG',
 | 
					      value: 'PG',
 | 
				
			||||||
        icon: 'http://example.com/pg_symbol.png'
 | 
					      icon: 'http://example.com/pg_symbol.png'
 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      directors: 'Director1',
 | 
					 | 
				
			||||||
      actors: [
 | 
					 | 
				
			||||||
        'Actor1',
 | 
					 | 
				
			||||||
        { value: 'Actor2', url: 'http://actor2.com', image: 'http://actor2.com/image.png' }
 | 
					 | 
				
			||||||
      ],
 | 
					 | 
				
			||||||
      writer: {
 | 
					 | 
				
			||||||
        value: 'Writer1',
 | 
					 | 
				
			||||||
        url: { system: 'imdb', value: 'http://imdb.com/p/writer1' },
 | 
					 | 
				
			||||||
        image: {
 | 
					 | 
				
			||||||
          value: 'https://example.com/image.jpg',
 | 
					 | 
				
			||||||
          type: 'person',
 | 
					 | 
				
			||||||
          size: '2',
 | 
					 | 
				
			||||||
          system: 'TestSystem',
 | 
					 | 
				
			||||||
          orient: 'P'
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      },
 | 
					 | 
				
			||||||
      adapters: [
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          value: 'Adapter1',
 | 
					 | 
				
			||||||
          url: ['http://imdb.com/p/adapter1', 'http://imdb.com/p/adapter2'],
 | 
					 | 
				
			||||||
          image: ['https://example.com/image1.jpg', 'https://example.com/image2.jpg']
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      ]
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    channel
 | 
					    directors: 'Director1',
 | 
				
			||||||
  )
 | 
					    actors: [
 | 
				
			||||||
 | 
					      'Actor1',
 | 
				
			||||||
 | 
					      { value: 'Actor2', url: 'http://actor2.com', image: 'http://actor2.com/image.png' }
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    writer: {
 | 
				
			||||||
 | 
					      value: 'Writer1',
 | 
				
			||||||
 | 
					      url: { system: 'imdb', value: 'http://imdb.com/p/writer1' },
 | 
				
			||||||
 | 
					      image: {
 | 
				
			||||||
 | 
					        value: 'https://example.com/image.jpg',
 | 
				
			||||||
 | 
					        type: 'person',
 | 
				
			||||||
 | 
					        size: '2',
 | 
				
			||||||
 | 
					        system: 'TestSystem',
 | 
				
			||||||
 | 
					        orient: 'P'
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    adapters: [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        value: 'Adapter1',
 | 
				
			||||||
 | 
					        url: ['http://imdb.com/p/adapter1', 'http://imdb.com/p/adapter2'],
 | 
				
			||||||
 | 
					        image: ['https://example.com/image1.jpg', 'https://example.com/image2.jpg']
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  expect(program).toMatchObject({
 | 
					  expect(program).toMatchObject({
 | 
				
			||||||
    channel: '1tv',
 | 
					    channel: '1tv',
 | 
				
			||||||
| 
						 | 
					@ -131,16 +129,60 @@ it('can create new Program', () => {
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
it('can create program without season number', () => {
 | 
					it('can create program from exist object', () => {
 | 
				
			||||||
  const program = new Program(
 | 
					  const program = new Program({
 | 
				
			||||||
    {
 | 
					    channel: channel.id,
 | 
				
			||||||
      title: 'Program 1',
 | 
					    title: 'Program 1',
 | 
				
			||||||
      start: '2021-03-19T06:00:00.000Z',
 | 
					    start: '2021-03-19T06:00:00.000Z',
 | 
				
			||||||
      stop: '2021-03-19T06:30:00.000Z',
 | 
					    stop: '2021-03-19T06:30:00.000Z',
 | 
				
			||||||
      episode: 238
 | 
					    ratings: {
 | 
				
			||||||
 | 
					      system: 'MPAA',
 | 
				
			||||||
 | 
					      value: 'PG',
 | 
				
			||||||
 | 
					      icon: 'http://example.com/pg_symbol.png'
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    channel
 | 
					    actors: [{ value: 'Actor1', url: [], image: [] }]
 | 
				
			||||||
  )
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  expect(program).toMatchObject({
 | 
				
			||||||
 | 
					    channel: '1tv',
 | 
				
			||||||
 | 
					    title: 'Program 1',
 | 
				
			||||||
 | 
					    sub_title: '',
 | 
				
			||||||
 | 
					    description: '',
 | 
				
			||||||
 | 
					    urls: [],
 | 
				
			||||||
 | 
					    categories: [],
 | 
				
			||||||
 | 
					    icon: {},
 | 
				
			||||||
 | 
					    episodeNumbers: [],
 | 
				
			||||||
 | 
					    date: null,
 | 
				
			||||||
 | 
					    start: 1616133600000,
 | 
				
			||||||
 | 
					    stop: 1616135400000,
 | 
				
			||||||
 | 
					    ratings: [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        system: 'MPAA',
 | 
				
			||||||
 | 
					        value: 'PG',
 | 
				
			||||||
 | 
					        icon: 'http://example.com/pg_symbol.png'
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    directors: [],
 | 
				
			||||||
 | 
					    actors: [{ value: 'Actor1', url: [], image: [] }],
 | 
				
			||||||
 | 
					    writers: [],
 | 
				
			||||||
 | 
					    adapters: [],
 | 
				
			||||||
 | 
					    producers: [],
 | 
				
			||||||
 | 
					    composers: [],
 | 
				
			||||||
 | 
					    editors: [],
 | 
				
			||||||
 | 
					    presenters: [],
 | 
				
			||||||
 | 
					    commentators: [],
 | 
				
			||||||
 | 
					    guests: []
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					it('can create program without season number', () => {
 | 
				
			||||||
 | 
					  const program = new Program({
 | 
				
			||||||
 | 
					    channel: channel.id,
 | 
				
			||||||
 | 
					    title: 'Program 1',
 | 
				
			||||||
 | 
					    start: '2021-03-19T06:00:00.000Z',
 | 
				
			||||||
 | 
					    stop: '2021-03-19T06:30:00.000Z',
 | 
				
			||||||
 | 
					    episode: 238
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  expect(program.episodeNumbers).toMatchObject([
 | 
					  expect(program.episodeNumbers).toMatchObject([
 | 
				
			||||||
    { system: 'xmltv_ns', value: '0.237.0/1' },
 | 
					    { system: 'xmltv_ns', value: '0.237.0/1' },
 | 
				
			||||||
| 
						 | 
					@ -149,15 +191,13 @@ it('can create program without season number', () => {
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
it('can create program without episode number', () => {
 | 
					it('can create program without episode number', () => {
 | 
				
			||||||
  const program = new Program(
 | 
					  const program = new Program({
 | 
				
			||||||
    {
 | 
					    channel: channel.id,
 | 
				
			||||||
      title: 'Program 1',
 | 
					    title: 'Program 1',
 | 
				
			||||||
      start: '2021-03-19T06:00:00.000Z',
 | 
					    start: '2021-03-19T06:00:00.000Z',
 | 
				
			||||||
      stop: '2021-03-19T06:30:00.000Z',
 | 
					    stop: '2021-03-19T06:30:00.000Z',
 | 
				
			||||||
      season: 3
 | 
					    season: 3
 | 
				
			||||||
    },
 | 
					  })
 | 
				
			||||||
    channel
 | 
					 | 
				
			||||||
  )
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  expect(program.episodeNumbers).toMatchObject([])
 | 
					  expect(program.episodeNumbers).toMatchObject([])
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -66,6 +66,6 @@ fit('can generate xmltv', () => {
 | 
				
			||||||
  const output = xmltv.generate({ channels, programs })
 | 
					  const output = xmltv.generate({ channels, programs })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  expect(output).toBe(
 | 
					  expect(output).toBe(
 | 
				
			||||||
    '<?xml version="1.0" encoding="UTF-8" ?><tv date="20220505">\r\n<channel id="1TV.co"><display-name>1 TV</display-name><icon src="https://example.com/logos/1TV.png"/><url>https://example.com</url></channel>\r\n<channel id="2TV.co"><display-name>2 TV</display-name><url>https://example.com</url></channel>\r\n<programme start="20210319060000 +0000" stop="20210319063000 +0000" channel="1TV.co"><title>Program 1</title><sub-title>Sub-title & 1</sub-title><desc>Description for Program 1</desc><credits><director>Director 1<url system="TestSystem">http://example.com/director1.html</url><image>https://example.com/image1.jpg</image><image type="person" size="2" orient="P" system="TestSystem">https://example.com/image2.jpg</image></director><director>Director 2</director><actor>Actor 1</actor><actor>Actor 2</actor><writer>Writer 1</writer></credits><date>20220506</date><category>Test</category><icon src="https://example.com/images/Program1.png?x=шеллы&sid=777"/><url>http://example.com/title.html</url><episode-num system="xmltv_ns">8.238.0/1</episode-num><episode-num system="onscreen">S09E239</episode-num><rating system="MPAA"><value>PG</value><icon src="http://example.com/pg_symbol.png"/></rating></programme></tv>'
 | 
					    '<?xml version="1.0" encoding="UTF-8" ?><tv date="20220505">\r\n<channel id="1TV.co"><display-name>1 TV</display-name><icon src="https://example.com/logos/1TV.png"/><url>https://example.com</url></channel>\r\n<channel id="2TV.co"><display-name>2 TV</display-name><url>https://example.com</url></channel>\r\n<programme start="20210319060000 +0000" stop="20210319063000 +0000" channel="1TV.co"><title>Program 1</title><sub-title>Sub-title & 1</sub-title><desc>Description for Program 1</desc><credits><director>Director 1<url system="TestSystem">http://example.com/director1.html</url><image>https://example.com/image1.jpg</image><image type="person" size="2" orient="P" system="TestSystem">https://example.com/image2.jpg</image></director><director>Director 2</director><actor>Actor 1</actor><actor>Actor 2</actor><writer>Writer 1</writer></credits><date>20220506</date><category>Test</category><icon src="https://example.com/images/Program1.png?x=шеллы&sid=777"/><url>http://example.com/title.html</url><episode-num system="xmltv_ns">8.238.0/1</episode-num><episode-num system="onscreen">S09E239</episode-num><rating system="MPAA"><value>PG</value><icon src="http://example.com/pg_symbol.png"/></rating></programme>\r\n</tv>'
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue