jkiimm/youtube-playlist-views

View on GitHub
src/youtube-playlist-views.js

Summary

Maintainability
A
0 mins
Test Coverage
import R from 'ramda';
import request from 'request-promise';
import cheerio from 'cheerio';

async function getViewsText(pid) {
  const selector = '#pl-header .pl-header-details li';
  const options = {
    uri: 'https://www.youtube.com/playlist',
    headers: { 'accept-language': 'en' },
    qs: { list: pid },
    transform: (body) => cheerio.load(body)
  };

  const findViewsText = R.find(R.pipe(R.match(/view/), R.complement(R.isEmpty)));

  const $ = await request(options);
  const selText = $(selector).map((key, val) => $(val).text()).get();

  if (R.isEmpty(selText)) {
    throw new Error('playlist is not suitable');
  }

  return findViewsText(selText);
}

function viewsTextToNum(text) {
  const numPart = R.pipe(R.trim, R.split(' '), R.head);
  const ifEmptyToBeZero = R.when(R.equals('No'), R.always('0'));
  const toNumber = R.pipe(R.replace(/,/g, ''), parseInt);

  return R.pipe(numPart, ifEmptyToBeZero, toNumber)(text);
}

async function views(pid) {
  const viewsText = await getViewsText(pid);
  return viewsTextToNum(viewsText);
}

const playlist = { views, getViewsText, viewsTextToNum };

export default playlist;
export { views, getViewsText, viewsTextToNum };