mirror of
https://github.com/wukko/cobalt.git
synced 2024-11-18 06:09:58 +00:00
twitter: fix videos only within affected time range
merge pull request #276 from wukko/fix-only-broken-twitter
This commit is contained in:
commit
a7eb548c2b
2 changed files with 35 additions and 9 deletions
|
@ -40,7 +40,6 @@ export default function(r, host, audioFormat, isAudioOnly, lang, isAudioMuted, d
|
||||||
case "bilibili":
|
case "bilibili":
|
||||||
params = { type: "render" };
|
params = { type: "render" };
|
||||||
break;
|
break;
|
||||||
case "twitter":
|
|
||||||
case "youtube":
|
case "youtube":
|
||||||
params = { type: r.type };
|
params = { type: r.type };
|
||||||
break;
|
break;
|
||||||
|
@ -56,6 +55,14 @@ export default function(r, host, audioFormat, isAudioOnly, lang, isAudioMuted, d
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case "twitter":
|
||||||
|
if (r.type === "remux") {
|
||||||
|
params = { type: r.type };
|
||||||
|
} else {
|
||||||
|
responseType = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case "vk":
|
case "vk":
|
||||||
case "douyin":
|
case "douyin":
|
||||||
case "tiktok":
|
case "tiktok":
|
||||||
|
|
|
@ -1,6 +1,19 @@
|
||||||
import { genericUserAgent } from "../../config.js";
|
import { genericUserAgent } from "../../config.js";
|
||||||
import { createStream } from "../../stream/manage.js";
|
import { createStream } from "../../stream/manage.js";
|
||||||
|
|
||||||
|
// fix all videos affected by the container bug in twitter muxer (took them over two weeks to fix it????)
|
||||||
|
const badContainerStart = new Date(1701446400000);
|
||||||
|
const badContainerEnd = new Date(1702605600000);
|
||||||
|
const TWITTER_EPOCH = 1288834974657n;
|
||||||
|
|
||||||
|
function needsFixing(media) {
|
||||||
|
const representativeId = media.source_status_id_str ?? media.id_str;
|
||||||
|
const mediaTimestamp = new Date(
|
||||||
|
Number((BigInt(representativeId) >> 22n) + TWITTER_EPOCH)
|
||||||
|
)
|
||||||
|
return mediaTimestamp > badContainerStart && mediaTimestamp < badContainerEnd;
|
||||||
|
}
|
||||||
|
|
||||||
function bestQuality(arr) {
|
function bestQuality(arr) {
|
||||||
return arr.filter(v => v["content_type"] === "video/mp4").sort((a, b) => Number(b.bitrate) - Number(a.bitrate))[0]["url"]
|
return arr.filter(v => v["content_type"] === "video/mp4").sort((a, b) => Number(b.bitrate) - Number(a.bitrate))[0]["url"]
|
||||||
}
|
}
|
||||||
|
@ -60,28 +73,34 @@ export default async function(obj) {
|
||||||
let single, multiple = [], media = baseMedia["media"];
|
let single, multiple = [], media = baseMedia["media"];
|
||||||
media = media.filter((i) => { if (i["type"] === "video" || i["type"] === "animated_gif") return true });
|
media = media.filter((i) => { if (i["type"] === "video" || i["type"] === "animated_gif") return true });
|
||||||
|
|
||||||
|
if (media.length === 0) {
|
||||||
|
return { error: 'ErrorNoVideosInTweet' }
|
||||||
|
}
|
||||||
|
|
||||||
if (media.length > 1) {
|
if (media.length > 1) {
|
||||||
for (let i in media) {
|
for (let i in media) {
|
||||||
multiple.push({
|
let downloadUrl = bestQuality(media[i]["video_info"]["variants"]);
|
||||||
type: "video",
|
if (needsFixing(media[i])) {
|
||||||
thumb: media[i]["media_url_https"],
|
downloadUrl = createStream({
|
||||||
url: createStream({
|
|
||||||
service: "twitter",
|
service: "twitter",
|
||||||
type: "remux",
|
type: "remux",
|
||||||
u: bestQuality(media[i]["video_info"]["variants"]),
|
u: bestQuality(media[i]["video_info"]["variants"]),
|
||||||
filename: `twitter_${obj.id}_${Number(i) + 1}.mp4`
|
filename: `twitter_${obj.id}_${Number(i) + 1}.mp4`
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
multiple.push({
|
||||||
|
type: "video",
|
||||||
|
thumb: media[i]["media_url_https"],
|
||||||
|
url: downloadUrl
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
} else if (media.length === 1) {
|
|
||||||
single = bestQuality(media[0]["video_info"]["variants"])
|
|
||||||
} else {
|
} else {
|
||||||
return { error: 'ErrorNoVideosInTweet' }
|
single = bestQuality(media[0]["video_info"]["variants"])
|
||||||
}
|
}
|
||||||
|
|
||||||
if (single) {
|
if (single) {
|
||||||
return {
|
return {
|
||||||
type: "remux",
|
type: needsFixing(media[0]) ? "remux" : "normal",
|
||||||
urls: single,
|
urls: single,
|
||||||
filename: `twitter_${obj.id}.mp4`,
|
filename: `twitter_${obj.id}.mp4`,
|
||||||
audioFilename: `twitter_${obj.id}_audio`
|
audioFilename: `twitter_${obj.id}_audio`
|
||||||
|
|
Loading…
Reference in a new issue