易听音乐网
https://www.eev3.com
zpccool (13551) 16小时前 下载:290
音频 音乐 免费 MP3
易听音乐网-MP3音乐免费下载,流行音乐,网络新歌海量音乐在线试听
// @name 易听音乐网
// @uuid yitingyinyue
// @version 1.0.0
// @author AI
// @url https://www.eev3.com
// @logo https://www.eev3.com/favicon.ico
// @type music
// @enabled true
// @tags 音乐,免费,MP3
// @description 易听音乐网-MP3音乐免费下载,流行音乐,网络新歌海量音乐在线试听
// ─── 内置测试 ─────────────────────────────────────────────────────────────
async function TEST(type) {
if (type === '__list__') return ['explore', 'search'];
if (type === 'explore') {
var cats = await explore(1, 'GETALL');
if (!cats || cats.length < 1) return { passed: false, message: '发现页返回为空' };
var books = await explore(1, cats[0]);
if (!books || books.length < 1) return { passed: false, message: '发现页 [' + cats[0] + '] 返回为空' };
return { passed: true, message: '发现页 [' + cats[0] + ']: ' + books.length + ' 条结果' };
}
if (type === 'search') {
var results = await search('周深', 1);
if (!results || results.length < 1) return { passed: false, message: '搜索结果为空' };
return { passed: true, message: '搜索"周深"返回 ' + results.length + ' 条结果' };
}
return { passed: false, message: '未知测试类型: ' + type };
}
// ─── 配置 / 常量 ─────────────────────────────────────────────────────────
var BASE = 'https://www.eev3.com';
var EXPLORE_CATS = [
{ name: 'TOP榜单', url: '/list/top.html' },
{ name: '新歌榜', url: '/list/new.html' },
{ name: 'DJ舞曲', url: '/list/djwuqu.html' },
{ name: '抖音热歌榜', url: '/list/douyin.html' },
{ name: '快手热歌榜', url: '/list/kuaishou.html' },
{ name: '网络红歌榜', url: '/list/hot.html' },
{ name: '影视金曲榜', url: '/list/ystop.html' },
{ name: '粤语金曲榜', url: '/list/yytop.html' },
{ name: '欧美金曲榜', url: '/list/ustop.html' },
{ name: '古风音乐榜', url: '/list/gfhot.html' },
{ name: '网红新歌榜', url: '/list/wlhot.html' },
{ name: '80后热歌榜', url: '/list/blhot.html' },
{ name: '说唱先锋榜', url: '/list/sctop.html' },
{ name: '电音热歌榜', url: '/list/dytop.html' },
{ name: '车载歌曲榜', url: '/list/cztop.html' },
{ name: 'ACG新歌榜', url: '/list/newacg.html' },
{ name: '韩国排行榜', url: '/list/krtop.html' },
{ name: '日本排行榜', url: '/list/jptop.html' }
];
// ─── 工具函数 ────────────────────────────────────────────────────────────
function toAbs(href, baseUrl) {
if (!href) return '';
href = String(href).trim();
if (!href) return '';
if (href.indexOf('http://') === 0 || href.indexOf('https://') === 0) return href;
if (href.indexOf('//') === 0) return 'https:' + href;
var base = baseUrl || BASE;
if (href.charAt(0) === '/') {
var m = String(base).match(/^(https?:\/\/[^\/]+)/);
return (m ? m[1] : base) + href;
}
if (base.charAt(base.length - 1) !== '/') base += '/';
return base + href;
}
function cleanText(s) {
if (!s) return '';
return String(s).replace(/\u00a0/g, ' ').replace(/[ \t\r\n]+/g, ' ').trim();
}
function extractSongId(url) {
var m = String(url || '').match(/\/mp3\/([a-z]+)\.html/);
return m ? m[1] : '';
}
function parseSongTitle(title) {
var name = cleanText(title);
var author = '';
var nm = name.match(/^(.+?)《(.+?)》/);
if (nm) {
author = cleanText(nm[1]);
name = cleanText(nm[2]);
}
return { name: name, author: author };
}
// ─── 发现页 ───────────────────────────────────────────────────────────────
async function explore(page, category) {
page = page || 1;
legado.log('[explore] page=' + page + ' category=' + category);
if (!category || category === 'GETALL') {
var names = [];
for (var i = 0; i < EXPLORE_CATS.length; i++) {
names.push(EXPLORE_CATS[i].name);
}
legado.log('[explore] categories=' + names.length);
return names;
}
var cat = null;
for (var j = 0; j < EXPLORE_CATS.length; j++) {
if (EXPLORE_CATS[j].name === category) { cat = EXPLORE_CATS[j]; break; }
}
if (!cat) { legado.log('[explore] category not found: ' + category); return []; }
var url = BASE + cat.url;
if (page > 1) {
url = cat.url.replace('.html', '/' + page + '.html');
url = BASE + url;
}
legado.log('[explore] url=' + url);
var html = await legado.http.get(url);
legado.log('[explore] html length=' + (html ? html.length : 'null'));
if (!html || html.length < 50) {
legado.log('[explore] short/empty html');
return [];
}
var doc = legado.dom.parse(html);
var items = legado.dom.selectAll(doc, '.play_list ul li a[href^="/mp3/"]');
if (!items || items.length === 0) {
items = legado.dom.selectAll(doc, '.ilingkuplay_list ul li a[href^="/mp3/"]');
}
if (!items || items.length === 0) {
items = legado.dom.selectAll(doc, 'ul li a[href^="/mp3/"]');
}
var books = [];
var seen = {};
for (var k = 0; k < items.length; k++) {
var el = items[k];
var href = legado.dom.attr(el, 'href') || '';
var title = legado.dom.attr(el, 'title') || legado.dom.text(el) || '';
if (seen[href]) continue;
seen[href] = true;
var parsed = parseSongTitle(title);
books.push({
name: parsed.name || title,
author: parsed.author,
bookUrl: toAbs(href, BASE),
coverUrl: ''
});
}
legado.dom.free(doc);
legado.log('[explore] found=' + books.length);
return books;
}
// ─── 歌曲详情 ─────────────────────────────────────────────────────────────
async function bookInfo(bookUrl) {
legado.log('[bookInfo] url=' + bookUrl);
var html = await legado.http.get(bookUrl);
legado.log('[bookInfo] html length=' + (html ? html.length : 'null'));
var doc = legado.dom.parse(html);
var result = {};
var title = legado.dom.selectText(doc, 'title') || '';
title = title.replace(/\s*[-–—|]\s*易听音乐网.*$/, '').trim();
title = title.replace(/\[Mp3_Lrc\].*$/, '').trim();
var parsed = parseSongTitle(title);
var name = parsed.name;
var author = parsed.author;
var coverUrl = legado.dom.selectAttr(doc, '#mcover', 'src') || '';
if (!coverUrl) {
coverUrl = legado.dom.selectAttr(doc, '.djpic img', 'src') || '';
}
coverUrl = toAbs(coverUrl, bookUrl);
if (!author) {
author = cleanText(legado.dom.selectText(doc, '.play_singer .name a') || '');
}
var intro = '';
var smEls = legado.dom.selectAll(doc, '.sm');
if (smEls) {
for (var si = 0; si < smEls.length; si++) {
var st = cleanText(legado.dom.text(smEls[si]) || '');
if (st.indexOf('所属专辑') >= 0 || st.indexOf('专辑') >= 0) {
var albumLink = legado.dom.select(smEls[si], 'a');
if (albumLink) intro = cleanText(legado.dom.text(albumLink) || '');
break;
}
}
}
var updateTime = '';
if (smEls) {
for (var ti = 0; ti < smEls.length; ti++) {
var st2 = cleanText(legado.dom.text(smEls[ti]) || '');
if (st2.indexOf('更新时间') >= 0) {
updateTime = st2.replace(/^更新时间[::]\s*/, '');
break;
}
}
}
result.name = name || title;
result.author = author || '未知歌手';
result.coverUrl = coverUrl;
result.intro = intro;
result.lastChapter = updateTime || '';
result.latestChapter = result.lastChapter;
result.tocUrl = bookUrl;
result.kind = '音乐';
legado.dom.free(doc);
legado.log('[bookInfo] name=' + result.name + ' author=' + result.author);
return result;
}
// ─── 章节目录 ─────────────────────────────────────────────────────────────
async function chapterList(tocUrl) {
legado.log('[chapterList] url=' + tocUrl);
var songId = extractSongId(tocUrl);
if (!songId) {
legado.log('[chapterList] cannot extract song id');
return [];
}
var html = await legado.http.get(tocUrl);
var doc = legado.dom.parse(html);
var title = legado.dom.selectText(doc, 'title') || '';
title = title.replace(/\s*[-–—|]\s*易听音乐网.*$/, '').trim();
title = title.replace(/\[Mp3_Lrc\].*$/, '').trim();
legado.dom.free(doc);
var chapters = [{ name: title || '播放', url: tocUrl }];
legado.log('[chapterList] found=' + chapters.length);
return chapters;
}
// ─── 正文(音频URL) ──────────────────────────────────────────────────────
async function chapterContent(chapterUrl) {
legado.log('[chapterContent] url=' + chapterUrl);
var songId = extractSongId(chapterUrl);
if (!songId) {
legado.log('[chapterContent] cannot extract song id');
return '';
}
var body = 'id=' + songId + '&type=music';
var headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'Referer': BASE + '/'
};
var jsonStr = await legado.http.post(BASE + '/js/play.php', body, headers);
legado.log('[chapterContent] play.php response length=' + (jsonStr ? jsonStr.length : 0));
try {
var data = JSON.parse(jsonStr);
if (data && data.url) {
legado.log('[chapterContent] audio url=' + data.url.substring(0, 80));
return data.url;
}
} catch (e) {
legado.log('[chapterContent] JSON parse error: ' + e);
}
return '';
}
// ─── 搜索 ─────────────────────────────────────────────────────────────────
async function search(keyword, page) {
page = page || 1;
legado.log('[search] keyword=' + keyword + ' page=' + page);
// Site uses /so/KEYWORD.html (not /so.php?wd=KEYWORD)
// The JavaScript intercepts form submit and redirects
var searchUrl = BASE + '/so/' + keyword + '.html';
legado.log('[search] url=' + searchUrl);
var html = await legado.http.get(searchUrl);
legado.log('[search] html length=' + (html ? html.length : 0));
if (!html || html.length < 100) {
legado.log('[search] empty or short response');
return [];
}
var doc = legado.dom.parse(html);
var items = legado.dom.selectAll(doc, '.play_list ul li a[href^="/mp3/"]');
if (!items || items.length === 0) {
items = legado.dom.selectAll(doc, 'ul li a[href^="/mp3/"]');
}
if (!items || items.length === 0) {
items = legado.dom.selectAll(doc, '.lkmusic_list li a[href^="/mp3/"]');
}
var books = [];
var seen = {};
for (var i = 0; i < items.length; i++) {
var el = items[i];
var href = legado.dom.attr(el, 'href') || '';
var title = legado.dom.attr(el, 'title') || legado.dom.text(el) || '';
if (seen[href]) continue;
seen[href] = true;
var parsed = parseSongTitle(title);
books.push({
name: parsed.name || title,
author: parsed.author,
bookUrl: toAbs(href, BASE),
coverUrl: ''
});
}
legado.dom.free(doc);
legado.log('[search] found=' + books.length);
return books;
}