UNPKG

node-yt-search

Version:
53 lines (49 loc) 1.47 kB
const qs = require('querystring'); let xhr = require('xhr'); if (!xhr.open) xhr = require('request'); const SEARCH = 'https://www.googleapis.com/youtube/v3/search?'; const VIDEO = 'https://www.googleapis.com/youtube/v3/videos?'; const videos = (params, fn) => { xhr({ url: `${VIDEO}${qs.stringify(params)}`, methods: 'GET', }, (err, res, body) => { if (err) return fn(err); try { const data = JSON.parse(body); if (data.error) return fn(data.error); return fn(null, data); } catch (err) { return fn(err); } }); }; module.exports = (term, opts, fn) => { let params = { q: term, pageToken: opts.pageToken || '', part: opts.part || 'snippet', }; params = Object.assign(params, opts); xhr({ url: `${SEARCH}${qs.stringify(params)}`, method: 'GET', }, (err, res, body) => { if (err) return fn(err); try { const data = JSON.parse(body); if (data.error) return fn(data.error); const pageInfo = { totalResults: data.pageInfo.totalResults, resultsPerPage: data.pageInfo.resultsPerPage, nextPageToken: data.nextPageToken, prevPageToken: data.prevPageToken, }; params.part = params.videoPart || 'snippet,contentDetails,statistics'; params.id = data.items.map(item => (item.id.videoId)).toString(); videos(params, (err, results) => fn(err, results, pageInfo)); } catch (err) { return fn(err); } }); };