"茶杯狐"
"https://www.cupfox.in/"
zpccool (13551) 16小时前 下载:312
视频
"茶杯狐视频"
// @name "茶杯狐"
// @uuid chabeihu
// @version 1.0.0
// @author AI
// @url "https://www.cupfox.in/"
// @enabled true
// @description "茶杯狐视频"
// @group "影视"
// @type video
var BASE = "https://www.cupfox.in/";
function fixUrl(u) {
if (!u) return "";
if (/^https?:\/\//i.test(u)) return u;
if (u.charAt(0) === '/') u = u.substring(1);
return BASE.replace(/\/$/, '') + '/' + u;
}
async function search(keyword, page) {
var url = BASE + 'search?q=' + encodeURIComponent(keyword);
if (page > 1) url += '&page=' + page;
var html = await legado.http.get(url);
var doc = legado.dom.parse(html);
var items = legado.dom.selectAll(doc, '.movie-list-item');
var list = [];
for (var i = 0; i < items.length; i++) {
var item = items[i];
var name = legado.dom.selectText(item, '.movie-title');
var bookUrl = legado.dom.selectAttr(item, '.movie-post-wrapper a', 'href');
var coverUrl = legado.dom.selectAttr(item, '.movie-post-wrapper img', 'src');
if (name && bookUrl) {
list.push({
name: name,
bookUrl: fixUrl(bookUrl),
coverUrl: fixUrl(coverUrl),
author: '',
kind: ''
});
}
}
legado.dom.free(doc);
return list;
}
async function bookInfo(bookUrl) {
var html = await legado.http.get(bookUrl);
var doc = legado.dom.parse(html);
var name = '';
var titleEl = legado.dom.select(doc, 'h1');
if (titleEl) name = legado.dom.text(titleEl);
if (!name) {
var titleMatch = html.match(/<title>([^<]+)<\/title>/);
if (titleMatch) {
name = titleMatch[1].replace('在线观看 - 茶杯狐 Cupfox', '').trim();
name = name.replace('茶杯狐 Cupfox', '').trim();
}
}
if (!name) {
var titleEl2 = legado.dom.select(doc, '.movie-title');
if (titleEl2) name = legado.dom.text(titleEl2);
}
if (!name) {
var titleEl3 = legado.dom.select(doc, '.title');
if (titleEl3) name = legado.dom.text(titleEl3);
}
var coverUrl = '';
var coverMatch = html.match(/<img[^>]*src="([^"]*\/uimg\/[^"]+)"[^>]*>/);
if (coverMatch) coverUrl = coverMatch[1];
if (!coverUrl) {
var imgEl = legado.dom.select(doc, 'img[src*="/uimg/"]');
if (imgEl) coverUrl = legado.dom.attr(imgEl, 'src');
}
if (!coverUrl) {
var imgEl2 = legado.dom.select(doc, 'img[src*="/simg/"]');
if (imgEl2) coverUrl = legado.dom.attr(imgEl2, 'src');
}
var intro = '';
var descEl = legado.dom.select(doc, '.subject-desc');
if (descEl) {
intro = legado.dom.text(descEl).replace(/简介[::]?/g, '').trim();
}
if (!intro) {
var descEl2 = legado.dom.select(doc, '.desc');
if (descEl2) {
intro = legado.dom.text(descEl2).replace(/简介[::]?/g, '').trim();
}
}
legado.dom.free(doc);
return {
name: name,
author: '',
bookUrl: bookUrl,
tocUrl: bookUrl,
coverUrl: fixUrl(coverUrl),
intro: intro,
latestChapter: '',
kind: ''
};
}
async function chapterList(tocUrl) {
var html = await legado.http.get(tocUrl);
var doc = legado.dom.parse(html);
var list = [];
var items = legado.dom.selectAll(doc, '[ep_slug]');
for (var i = 0; i < items.length; i++) {
var item = items[i];
var slug = legado.dom.attr(item, 'ep_slug');
var name = legado.dom.text(item);
if (name) {
list.push({
name: name,
url: tocUrl + '#ep' + slug
});
}
}
legado.dom.free(doc);
return list;
}
async function chapterContent(chapterUrl) {
var match = chapterUrl.match(/\/vod-detail\/(\d+)\.html/);
if (!match || !match[1]) return '';
var hash = chapterUrl.match(/#(.+)/);
var slug = '';
if (hash && hash[1]) slug = hash[1].replace('ep', '');
var api = BASE + 'tea/' + match[1];
if (slug) api = BASE + 'tea/' + match[1] + '-' + slug;
var resp = await legado.http.get(api);
var playMatch = resp.match(/"play_data":"([^"]+)"/);
if (playMatch && playMatch[1]) {
var url = decodeURIComponent(playMatch[1]);
if (url.indexOf('http') === 0) return url;
}
var m3u8 = resp.match(/https:\/\/[^"'\s]+\.m3u8/);
if (m3u8 && m3u8.length > 0) return m3u8[0];
return '';
}
async function explore(page, category) {
if (!category || category === "GETALL") {
return ["剧集", "电影", "动漫", "综艺"];
}
var type = "";
if (category === "剧集") type = "tv";
else if (category === "电影") type = "movie";
else if (category === "综艺") type = "show";
else if (category === "动漫") type = "anime";
else type = category.toLowerCase();
var url = BASE + 'type/' + type + '/';
if (page > 1) url += 'page/' + page + '/';
var html = await legado.http.get(url);
var doc = legado.dom.parse(html);
var items = legado.dom.selectAll(doc, '.movie-list-item');
var list = [];
for (var i = 0; i < items.length; i++) {
var item = items[i];
var name = legado.dom.selectText(item, '.movie-title');
var bookUrl = legado.dom.selectAttr(item, '.movie-post-wrapper a', 'href');
var coverUrl = legado.dom.selectAttr(item, '.movie-post-wrapper img', 'src');
if (name && bookUrl) {
list.push({
name: name,
bookUrl: fixUrl(bookUrl),
coverUrl: fixUrl(coverUrl),
author: '',
kind: category
});
}
}
legado.dom.free(doc);
return list;
}
function categories() {
return [
{ name: '剧集', url: '/type/tv/' },
{ name: '电影', url: '/type/movie/' },
{ name: '动漫', url: '/type/anime/' },
{ name: '综艺', url: '/type/show/' }
];
}
async function TEST(type) {
if (type === '__list__') return ['explore', 'bookInfo', 'chapterList', 'chapterContent', 'search'];
if (type === 'explore') {
var cats = await explore(1);
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: '发现页空' };
return { passed: true, message: '发现页成功' };
}
if (type === 'bookInfo') {
var info = await bookInfo('https://www.cupfox.in/vod-detail/202365557.html');
if (!info || !info.name) return { passed: false, message: 'bookInfo空' };
return { passed: true, message: 'name=' + info.name };
}
if (type === 'chapterList') {
var chs = await chapterList('https://www.cupfox.in/vod-detail/202365557.html');
if (!chs || chs.length < 1) return { passed: false, message: '章节空' };
return { passed: true, message: '共' + chs.length + '集' };
}
if (type === 'chapterContent') {
var url = await chapterContent('https://www.cupfox.in/vod-detail/202365557.html#zheng_pian');
if (!url) return { passed: false, message: '播放地址空' };
return { passed: true, message: '播放地址成功' };
}
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: '未知' };
}