twdl
Version:
Downloads image and video tweets from Twitter
96 lines • 3.04 kB
JavaScript
import url from 'url';
import path from 'path';
export const SEPERATOR = '------------';
function getStatusId(tweetUrl) {
return tweetUrl.match(/status\/([0-9]+)/)[1];
}
export function getUsername(tweetUrl, options, mediaData) {
const usernameRegex = /([a-zA-Z0-9_]+)\/status/;
if (mediaData?.finalUrl && options?.redirect) {
return mediaData.username;
}
return tweetUrl.match(usernameRegex)[1];
}
export const DEFAULT_FORMAT = '#original#';
export function parseMediaUrl(mediaUrl) {
const parsed = url.parse(mediaUrl), data = {
original: mediaUrl,
extension: null,
downloadUrl: parsed.href,
basename: path.basename(parsed.pathname)
};
if (parsed.query !== null) {
try {
data.extension = parsed.query.match(/format=([a-z]+)/)[1];
data.downloadUrl = parsed.href.split('?')[0];
}
catch {
}
}
if (data.extension !== null) {
data.basename += '.' + data.extension;
data.downloadUrl += '.' + data.extension;
}
if (data.downloadUrl.indexOf('pbs.twimg.com/media/') > -1) {
data.downloadUrl += ':orig';
}
return data;
}
export function renderFormat(formatStr, parsedMedia, tweetData, mediaData, options) {
let extname = path.extname(parsedMedia.basename);
const basename_noext = parsedMedia.basename.replace(extname, '');
if (extname === '.m3u8') {
extname = '.mp4';
}
return formatStr
.replace(/#tweet_id#/gi, getStatusId(tweetData.finalUrl))
.replace(/#original#/gi, basename_noext)
.replace(/#username#/gi, getUsername(tweetData.finalUrl, options, mediaData))
+ extname;
}
export function newMediaData(mediaData) {
return Object.assign({
error: false,
}, mediaData);
}
export function newTweetData(tweetData) {
return Object.assign({
originalUrl: '',
finalUrl: '',
}, tweetData);
}
export function createEmbedData(tweetData, parsedMedia, mediaData, options) {
let embedData = '';
if (options.embed || options.text) {
embedData += `
Name: ${mediaData.name}
Username: ${mediaData.username}
ID: ${mediaData.userId}
Bio: ${mediaData.bio}
Website: ${mediaData.website}
Location: ${mediaData.location}
Birthday: ${mediaData.birthday}
Joined: ${mediaData.joined}
---
Text: ${mediaData.text}
Date: ${mediaData.dateFormat}
Original URL: ${tweetData.originalUrl}
Final URL: ${tweetData.finalUrl}
Media: ${parsedMedia.downloadUrl}
---`;
}
if (typeof options.data === 'string' && options.data.length > 0) {
embedData += `
Comment: ${options.data}
`;
}
return embedData.trim().replace(/\t*/g, '');
}
export function normalizeUrl(url) {
return Promise.resolve(url
.replace(/^(http(s)?:\/\/)?/i, 'http$2://')
.replace(/\/(photo|video)\/[1-4]$/i, ''));
}
export function noOp() {
}
//# sourceMappingURL=util.js.map