UNPKG

butter-provider-ccc

Version:
223 lines (192 loc) 6.06 kB
'use strict'; var Provider = require('butter-provider'); var querystring = require('querystring'); var Q = require('q'); var deferRequest = require('defer-request'); var inherits = require('util').inherits; var _ = require('lodash'); var moment = require('moment'); var URL = 'https://media.ccc.de/public'; var CCC = function (args) { CCC.super_.call(this); if (args && args.url) URL = args.url; }; inherits(CCC, Provider); CCC.prototype.config = { name: 'ccc', uniqueId: 'imdb_id', tabName: 'CCC' }; var queryTorrents = function (filters) { var params = {}; var genres = ''; params.sort = 'seeds'; params.limit = '50'; if (filters.keywords) { params.keywords = filters.keywords.replace(/\s/g, '% '); } if (filters.genre) { // filters.genres.forEach(function(g) { // genres += '&genre[]='+g; // }); // genres = genres.substring(0, genres.length - 1); // win.info('genres', genres); params.genre = filters.genres[0]; } if (filters.order) { params.order = filters.order; } if (filters.sorter && filters.sorter !== 'popularity') { params.sort = filters.sorter; } return deferRequest(URL + '/conferences') .then(function (data) { return data.conferences }) .catch(function (err) { console.error ('CCC', 'error', err) }) }; var formatElementForButter = function (data) { var id = data.url.split('/').pop(); var updated = moment(data.updated_at); var year = updated.year(); var img = data.logo_url; return deferRequest(data.url) .then(function (conf) { var days = {} var events = conf.events.map(function (event) { var day = getEventDate(event); days[day] = 1; return Object.assign({}, event, { first_aired: moment(event.date).unix(), day: day } ) }); days = Object.keys(days); return { type: Provider.ItemType.TVSHOW, _id: id, imdb_id: 'ccc' +id, tvdb_id: 'ccc-' + data.acronym, title: data.title, genres: ["Event", "Conference"], year: year, poster: img, backdrop: img, slug: data.slug, rating: { hated: 0, loved: 0, votes: 0, percentage: 0, watching: 0 }, num_seasons: days.length, days: days, raw_events: events, last_updated: updated.unix() } }) }; var formatForButter = function(data) { if (!data) return Q.reject("No Data !"); return Q.all(data.map(formatElementForButter)) .then(function (results) { return { results: results, hasMore: true } }) } var generateEventTorrents = function(data) { var recordings = data.recordings.filter(function (r) { return r.mime_type === "video/webm"; }) if (! recordings.lenth) { recordings = data.recordings.filter(function (r) { return r.mime_type === "video/mp4"; }) } return recordings.reduce(function (a, r) { var quality = r.height + 'p'; a[quality] = { size: r.size * 1000000, url: r.recording_url + '.torrent', peers: 0, seeds: 0 } return a; }, {}) } var formatEventForButter = function(event, idx, data) { return { torrents: generateEventTorrents(data), watched: { watched: false, }, date_based: false, overview: event.description || event.title, title: event.title, first_aired: moment(event.date).unix(), episode: idx, season: event.season, tvdb_id: event.slug, } } function getEventDate(event) { if (event.date) return event.date.split('T')[0]; return event.release_date; } function formatDetailsForButter(data) { var events = data.raw_events; var eventPromises = data.days.sort().reduce(function(a, d) { var dayEvents = events.filter(function(e) { return e.day === d }).map(function(event, idx) { var day = getEventDate(event); event.season = data.days.indexOf(day) + 1; console.log('day', day, event.season); return deferRequest(URL + '/events/' + event.guid) .then(function (data) { return formatEventForButter(event, idx, data) }) }) return a.concat(dayEvents) }, []) var updated = moment(data.updated) return Q.all(eventPromises) .then(function(events) { return { synopsis: "CCC's media group's recording for the " + data.title + " conference.", country: "", network: "CCC Media", status: "finished", runtime: 30, last_updated: updated.unix(), __v: 0, episodes: events } }) } // Single element query var queryTorrent = function (torrent_id, old_data, debug) { return formatDetailsForButter(old_data) .then(function (new_data) { return Object.assign(old_data, new_data) }).then(function (data) { delete data.raw_events; return data; }) }; CCC.prototype.fetch = function (filters) { return queryTorrents(filters) .then(formatForButter); }; CCC.prototype.detail = function (torrent_id, old_data, debug) { return queryTorrent(torrent_id, old_data, debug) }; module.exports = CCC;