易听音乐网

https://www.eev3.com

zpccool (13551) 16小时前 下载:290

音频 音乐 免费 MP3
易听音乐网-MP3音乐免费下载,流行音乐,网络新歌海量音乐在线试听
二维码导入(APP尚未完成该功能)
// @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;
}
广告