termice
Version:
Simple terminal icecast player
59 lines (58 loc) • 2.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.search_xiph = void 0;
const util_1 = require("./util");
function search_xiph(search) {
return new Promise(resolve => {
const options = {
method: 'GET',
url: 'http://dir.xiph.org/search?q=' + search.split(' ').join('+')
};
require('request')(options, (err, _, body) => {
if (err)
resolve([(0, util_1.error_entry)(err, 'Icecast')]);
else
resolve(parse_xiph(body));
});
});
}
exports.search_xiph = search_xiph;
function parse_xiph(body) {
const JSDOM = require('jsdom').JSDOM;
const host = 'http://dir.xiph.org';
let document;
try {
document = new JSDOM(body).window.document;
}
catch (err) {
return [(0, util_1.error_entry)('Couldn\'t parse XIPH', 'Icecast')];
}
const rows = document.querySelectorAll('.card');
if (rows === null)
return [];
else
return Array.from(rows).map((entry) => {
const sel_name_hp = entry.querySelector('.card-title');
const sel_playing = entry.querySelector('.card-subtitle');
const sel_description = entry.querySelector('.card-text');
const sel_url = entry.querySelector('.card-footer > div :last-child');
const sel_listeners = entry.querySelector('.card-footer');
return {
name: sel_name_hp ? sel_name_hp.innerHTML
: 'Null',
homepage: 'Null',
listeners: sel_listeners ? sel_listeners.textContent.trim().split(' ')[0]
: 'Null',
description: sel_description ? sel_description.innerHTML.trim()
: '',
playing: sel_playing ? sel_playing.innerHTML.substr(8)
: '',
url: sel_url ? host + sel_url.href
: 'Null',
bitrate: 'Null',
src: 'Icecast',
is_playlist: true,
entry: entry.innerHTML
};
}).sort((entry1, entry2) => entry2.listeners - entry1.listeners);
}