import Path from "path" import { createSource, createSourceOptions, extractImages, downloadImages, getPostIdFromPathname, fetchChannel } from "../lib.js" let nitter = {} export const fetchChannelFromInstances = async (source) => { let index = 0 let instances = source.instances let cachedLink = source.cache.link let channel if(cachedLink) { instances.unshift(cachedLink.hostname) } while(!channel && index != instances.length) { source.hostname = instances[index] channel = await fetchChannel(source) if(source.errored) { console.error(`Failed to fetch ${source.name} from ${source.hostname}: `, source.error) index++ } else { break } } return channel } nitter.createSource = (user, options, instances, postReducerCallback, cache) => { let source = { type: 'nitter', description: `Aggregate feed for @${user} on twitter.com`, instances, pathname: user + '/rss', name: `nitter-${user}`, displayName: user, user, ...createSourceOptions(options) } return createSource(source, fetchChannelFromInstances, postReducerCallback, cache) } nitter.isRepost = (post) => { let creator = post.item.getElementsByTagName('dc:creator')[0] return creator.innerHTML.slice(1) !== post.source.user } nitter.pullImages = async (post, view, imageMirrorDomain, discardPostIfNoImages = false, getPostId = getPostIdFromPathname) => { let images = extractImages(post) const mirrorImage = nitter.createImageMirrorer(post, imageMirrorDomain) if(!discardPostIfNoImages || images.length > 0) { post.images = await downloadImages( images.map(mirrorImage), post.source, getPostId(post), view ) return post } } nitter.createImageMirrorer =(post, imageMirrorDomain) => { let mirrorUrl = new URL(imageMirrorDomain) let basePathname = new URL(post.guid).pathname return (image, index, images) => { mirrorUrl.pathname = Path.join(basePathname, 'photo', (index + 1).toString()) return mirrorUrl.href } } export default nitter