UNPKG

voc-cli

Version:

download and play English vocabularies' audio via command line

85 lines (66 loc) 2.28 kB
'use strict'; var _async_ = require('co').wrap; var fetch = require('node-fetch'); var cheerio = require('cheerio'); var normalize = require('../lib/normalize'); module.exports = _async_(regeneratorRuntime.mark(function _callee(word) { var url, res, err, set, html, $, list, _err; return regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: word = normalize(word); url = 'https://www.merriam-webster.com/dictionary/' + word; _context.next = 4; return fetch(url, { timeout: 10 * 1000 }); case 4: res = _context.sent; if (!(res.status !== 200)) { _context.next = 9; break; } err = new Error('\'' + word + '\' is not found from webster'); err.code = 'ENOENT'; throw err; case 9: set = {}; _context.next = 12; return res.text(); case 12: html = _context.sent; $ = cheerio.load(html); $('.play-pron').each(function (index, element) { var ele = $(element); var term = ele.prev().text().toLowerCase(); var lang = ele.attr('data-lang').replace(/_/g, '/'); var dir = ele.attr('data-dir'); var file = ele.attr('data-file'); var audio = 'https://media.merriam-webster.com/audio/prons/' + lang + '/mp3/' + dir + '/' + file + '.mp3'; if (word === term) { set[audio] = true; } }); list = Object.keys(set); if (!(list.length === 0)) { _context.next = 20; break; } _err = new Error('\'' + word + '\' has no audio from webster'); _err.code = 'ENOENT'; throw _err; case 20: // show all the audio url if (list.length > 1) { list.forEach(function (audio, i) { console.log(i + 1 + '. ' + audio); }); } // return the first audio from list return _context.abrupt('return', list[0]); case 22: case 'end': return _context.stop(); } } }, _callee, this); }));