wip
This commit is contained in:
		@@ -1,119 +1,23 @@
 | 
			
		||||
const { create: createPlaylist } = require('./playlist')
 | 
			
		||||
const store = require('./store')
 | 
			
		||||
const file = require('./file')
 | 
			
		||||
const logger = require('./logger')
 | 
			
		||||
const db = require('./db')
 | 
			
		||||
const _ = require('lodash')
 | 
			
		||||
const generators = require('../generators')
 | 
			
		||||
 | 
			
		||||
const LOGS_DIR = process.env.LOGS_DIR || 'scripts/logs/generators'
 | 
			
		||||
 | 
			
		||||
const generator = {}
 | 
			
		||||
 | 
			
		||||
generator.generate = async function (filepath, query = {}, options = {}) {
 | 
			
		||||
  options = {
 | 
			
		||||
    ...{
 | 
			
		||||
      format: 'm3u',
 | 
			
		||||
      saveEmpty: false,
 | 
			
		||||
      includeNSFW: false,
 | 
			
		||||
      includeGuides: true,
 | 
			
		||||
      includeBroken: false,
 | 
			
		||||
      onLoad: r => r,
 | 
			
		||||
      uniqBy: item => item.id || _.uniqueId(),
 | 
			
		||||
      sortBy: null
 | 
			
		||||
    },
 | 
			
		||||
    ...options
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  query['is_nsfw'] = options.includeNSFW ? { $in: [true, false] } : false
 | 
			
		||||
  query['is_broken'] = options.includeBroken ? { $in: [true, false] } : false
 | 
			
		||||
 | 
			
		||||
  let items = await db
 | 
			
		||||
    .find(query)
 | 
			
		||||
    .sort({ name: 1, 'status.level': 1, 'resolution.height': -1, url: 1 })
 | 
			
		||||
 | 
			
		||||
  items = _.uniqBy(items, 'url')
 | 
			
		||||
  if (!options.saveEmpty && !items.length) return { filepath, query, options, count: 0 }
 | 
			
		||||
  if (options.uniqBy) items = _.uniqBy(items, options.uniqBy)
 | 
			
		||||
 | 
			
		||||
  items = options.onLoad(items)
 | 
			
		||||
 | 
			
		||||
  if (options.sortBy) items = _.sortBy(items, options.sortBy)
 | 
			
		||||
 | 
			
		||||
  switch (options.format) {
 | 
			
		||||
    case 'json':
 | 
			
		||||
      await saveAsJSON(filepath, items, options)
 | 
			
		||||
      break
 | 
			
		||||
    case 'm3u':
 | 
			
		||||
    default:
 | 
			
		||||
      await saveAsM3U(filepath, items, options)
 | 
			
		||||
      break
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return { filepath, query, options, count: items.length }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function saveAsM3U(filepath, items, options = {}) {
 | 
			
		||||
  const playlist = await createPlaylist(filepath)
 | 
			
		||||
 | 
			
		||||
  const header = {}
 | 
			
		||||
  if (options.public) {
 | 
			
		||||
    let guides = items.map(item => item.guides)
 | 
			
		||||
    guides = _.uniq(_.flatten(guides)).sort().join(',')
 | 
			
		||||
 | 
			
		||||
    header['x-tvg-url'] = guides
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  await playlist.header(header)
 | 
			
		||||
  for (const item of items) {
 | 
			
		||||
    const stream = store.create(item)
 | 
			
		||||
 | 
			
		||||
    let attrs
 | 
			
		||||
    if (options.public) {
 | 
			
		||||
      attrs = {
 | 
			
		||||
        'tvg-id': stream.get('tvg_id'),
 | 
			
		||||
        'tvg-country': stream.get('tvg_country'),
 | 
			
		||||
        'tvg-language': stream.get('tvg_language'),
 | 
			
		||||
        'tvg-logo': stream.get('tvg_logo'),
 | 
			
		||||
        'user-agent': stream.get('http.user-agent') || undefined,
 | 
			
		||||
        'group-title': stream.get('group_title')
 | 
			
		||||
      }
 | 
			
		||||
    } else {
 | 
			
		||||
      attrs = {
 | 
			
		||||
        'tvg-id': stream.get('tvg_id'),
 | 
			
		||||
        'user-agent': stream.get('http.user-agent') || undefined
 | 
			
		||||
      }
 | 
			
		||||
generator.generate = async function (name, items = []) {
 | 
			
		||||
  if (typeof generators[name] === 'function') {
 | 
			
		||||
    try {
 | 
			
		||||
      const logs = await generators[name].bind()(items)
 | 
			
		||||
      await file.create(`${LOGS_DIR}/${name}.log`, logs.map(toJSON).join('\n'))
 | 
			
		||||
    } catch (error) {
 | 
			
		||||
      logger.error(`generators/${name}.js: ${error.message}`)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    await playlist.link(stream.get('url'), stream.get('display_name'), attrs, {
 | 
			
		||||
      'http-referrer': stream.get('http.referrer') || undefined,
 | 
			
		||||
      'http-user-agent': stream.get('http.user-agent') || undefined
 | 
			
		||||
    })
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function saveAsJSON(filepath, items, options) {
 | 
			
		||||
  const output = items.map(item => {
 | 
			
		||||
    const stream = store.create(item)
 | 
			
		||||
    const categories = stream.get('categories').map(c => ({ name: c.name, slug: c.slug }))
 | 
			
		||||
    const countries = stream.get('countries').map(c => ({ name: c.name, code: c.code }))
 | 
			
		||||
 | 
			
		||||
    return {
 | 
			
		||||
      name: stream.get('name'),
 | 
			
		||||
      logo: stream.get('logo'),
 | 
			
		||||
      url: stream.get('url'),
 | 
			
		||||
      categories,
 | 
			
		||||
      countries,
 | 
			
		||||
      languages: stream.get('languages'),
 | 
			
		||||
      tvg: {
 | 
			
		||||
        id: stream.get('tvg_id'),
 | 
			
		||||
        name: stream.get('name'),
 | 
			
		||||
        url: stream.get('tvg_url')
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  await file.create(filepath, JSON.stringify(output))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
generator.saveAsM3U = saveAsM3U
 | 
			
		||||
generator.saveAsJSON = saveAsJSON
 | 
			
		||||
 | 
			
		||||
module.exports = generator
 | 
			
		||||
 | 
			
		||||
function toJSON(item) {
 | 
			
		||||
  return JSON.stringify(item)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user