UNPKG

twdl

Version:

Downloads image and video tweets from Twitter

96 lines 3.04 kB
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