@lzwme/m3u8-dl
Version:
Batch download of m3u8 files and convert to mp4
52 lines (51 loc) • 2.45 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DouyinParser = void 0;
const utils_js_1 = require("../../lib/utils.js");
const base_parser_1 = require("./base-parser");
class DouyinParser extends base_parser_1.BaseParser {
static getHeaders() {
return {
'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1 Edg/122.0.0.0',
};
}
static async parse(url) {
try {
const loc = await (0, utils_js_1.getLocation)(url);
const idMatch = loc.match(/[0-9]+/);
if (!idMatch)
return DouyinParser.error(400, '无法解析视频 ID');
const { data: res } = await utils_js_1.request.get(`https://www.iesdouyin.com/share/video/${idMatch[0]}`, null, DouyinParser.getHeaders());
const matches = res.match(/window\._ROUTER_DATA\s*=\s*(.*?)<\/script>/s);
if (!matches)
return DouyinParser.error(400, '无法解析视频数据');
const data = JSON.parse(matches[1].trim());
const item = data.loaderData['video_(id)/page'].videoInfoRes.item_list[0];
if (!item)
return DouyinParser.error(400, '解析视频信息失败');
const videoId = item.video.play_addr.uri;
if (!videoId)
return DouyinParser.error(201, '未找到视频URL');
const videoUrl = `https://www.iesdouyin.com/aweme/v1/play/?video_id=${videoId}&ratio=1080p&line=0`;
return DouyinParser.success({
author: item.author.nickname,
uid: item.author.unique_id,
avatar: item.author.avatar_medium.url_list[0],
like: item.statistics.digg_count,
time: item.create_time,
title: item.desc,
cover: item.video.cover.url_list[0],
url: await (0, utils_js_1.getLocation)(videoUrl),
referer: url,
music: {
author: item.music.author,
avatar: item.music.cover_large.url_list[0],
},
});
}
catch (error) {
return DouyinParser.error(500, `解析失败: ${error instanceof Error ? error.message : '未知错误'}`);
}
}
}
exports.DouyinParser = DouyinParser;