2022-03-07 13:52:39 +01:00
from flask import Flask , render_template , request , redirect , Response , send_from_directory , url_for , send_file , make_response , jsonify
from flask_cors import CORS
2021-07-04 01:52:30 +02:00
import youtube_dl
2021-07-12 22:48:21 +02:00
import textwrap
2021-07-12 10:49:07 +02:00
import twitter
import pymongo
2022-01-18 00:36:43 +01:00
import requests
2021-07-04 11:40:22 +02:00
import json
2021-07-04 03:41:47 +02:00
import re
2021-07-11 22:48:17 +02:00
import os
2021-08-03 03:52:13 +02:00
import urllib . parse
2022-01-18 00:36:43 +01:00
import urllib . request
2022-03-07 13:52:39 +01:00
from datetime import date
2021-07-04 01:52:30 +02:00
app = Flask ( __name__ )
2022-03-07 13:52:39 +01:00
CORS ( app )
2021-10-01 23:59:20 +02:00
pathregex = re . compile ( " \\ w { 1,15} \\ /(status|statuses) \\ / \\ d { 2,20} " )
2022-02-20 23:13:18 +01:00
generate_embed_user_agents = [
2022-05-11 01:40:09 +02:00
" facebookexternalhit/1.1 " ,
" Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36 " ,
" Mozilla/5.0 (Windows; U; Windows NT 10.0; en-US; Valve Steam Client/default/1596241936; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36 " ,
" Mozilla/5.0 (Windows; U; Windows NT 10.0; en-US; Valve Steam Client/default/0; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36 " ,
2022-02-20 23:13:18 +01:00
" Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/601.2.4 (KHTML, like Gecko) Version/9.0.1 Safari/601.2.4 facebookexternalhit/1.1 Facebot Twitterbot/1.0 " ,
2022-05-11 01:40:09 +02:00
" facebookexternalhit/1.1 " ,
" Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; Valve Steam FriendsUI Tenfoot/0; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36 " ,
2022-02-20 23:13:18 +01:00
" Slackbot-LinkExpanding 1.0 (+https://api.slack.com/robots) " ,
" Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:38.0) Gecko/20100101 Firefox/38.0 " ,
" Mozilla/5.0 (compatible; Discordbot/2.0; +https://discordapp.com) " ,
" TelegramBot (like TwitterBot) " ,
" Mozilla/5.0 (compatible; January/1.0; +https://gitlab.insrt.uk/revolt/january) " ,
" test " ]
2021-07-04 01:52:30 +02:00
2021-07-13 19:18:50 +02:00
# Read config from config.json. If it does not exist, create new.
2021-07-11 22:48:17 +02:00
if not os . path . exists ( " config.json " ) :
with open ( " config.json " , " w " ) as outfile :
2022-02-20 23:13:18 +01:00
default_config = {
" config " : {
" link_cache " : " json " ,
" database " : " [url to mongo database goes here] " ,
2022-03-07 13:52:39 +01:00
" table " : " TwiFix " ,
2022-02-20 23:13:18 +01:00
" method " : " youtube-dl " ,
" color " : " #43B581 " ,
2022-05-13 20:50:39 +02:00
" appname " : " vxTwitter " ,
" repo " : " https://github.com/dylanpdx/BetterTwitFix " ,
" url " : " https://vxtwitter.com "
2022-02-20 23:13:18 +01:00
} ,
" api " : { " api_key " : " [api_key goes here] " ,
" api_secret " : " [api_secret goes here] " ,
" access_token " : " [access_token goes here] " ,
" access_secret " : " [access_secret goes here] "
}
}
2021-07-13 19:18:50 +02:00
json . dump ( default_config , outfile , indent = 4 , sort_keys = True )
2021-07-11 22:48:17 +02:00
2021-07-13 19:18:50 +02:00
config = default_config
else :
f = open ( " config.json " )
config = json . load ( f )
f . close ( )
2021-07-11 22:48:17 +02:00
2021-07-13 20:57:09 +02:00
# If method is set to API or Hybrid, attempt to auth with the Twitter API
2021-07-12 21:49:29 +02:00
if config [ ' config ' ] [ ' method ' ] in ( ' api ' , ' hybrid ' ) :
2021-07-12 10:49:07 +02:00
auth = twitter . oauth . OAuth ( config [ ' api ' ] [ ' access_token ' ] , config [ ' api ' ] [ ' access_secret ' ] , config [ ' api ' ] [ ' api_key ' ] , config [ ' api ' ] [ ' api_secret ' ] )
twitter_api = twitter . Twitter ( auth = auth )
link_cache_system = config [ ' config ' ] [ ' link_cache ' ]
2021-07-08 05:17:23 +02:00
if link_cache_system == " json " :
link_cache = { }
2021-07-11 22:48:17 +02:00
if not os . path . exists ( " config.json " ) :
with open ( " config.json " , " w " ) as outfile :
2021-07-13 19:18:50 +02:00
default_link_cache = { " test " : " test " }
json . dump ( default_link_cache , outfile , indent = 4 , sort_keys = True )
2021-07-11 22:48:17 +02:00
2021-07-08 05:17:23 +02:00
f = open ( ' links.json ' , )
link_cache = json . load ( f )
f . close ( )
elif link_cache_system == " db " :
2021-07-11 22:48:17 +02:00
client = pymongo . MongoClient ( config [ ' config ' ] [ ' database ' ] , connect = False )
2022-03-07 13:52:39 +01:00
table = config [ ' config ' ] [ ' table ' ]
db = client [ table ]
2021-07-04 11:40:22 +02:00
2021-07-14 10:33:46 +02:00
@app.route ( ' / ' ) # If the useragent is discord, return the embed, if not, redirect to configured repo directly
2021-07-06 05:30:16 +02:00
def default ( ) :
2021-07-14 10:33:46 +02:00
user_agent = request . headers . get ( ' user-agent ' )
2021-08-03 03:52:13 +02:00
if user_agent in generate_embed_user_agents :
2021-07-14 10:33:46 +02:00
return message ( " TwitFix is an attempt to fix twitter video embeds in discord! created by Robin Universe :) \n \n 💖 \n \n Click me to be redirected to the repo! " )
else :
return redirect ( config [ ' config ' ] [ ' repo ' ] , 301 )
2021-07-06 05:30:16 +02:00
2022-01-18 00:36:43 +01:00
@app.route ( ' /oembed.json ' ) #oEmbed endpoint
2021-07-09 12:32:04 +02:00
def oembedend ( ) :
2022-02-20 23:13:18 +01:00
desc = request . args . get ( " desc " , None )
user = request . args . get ( " user " , None )
link = request . args . get ( " link " , None )
ttype = request . args . get ( " ttype " , None )
return oEmbedGen ( desc , user , link , ttype )
2021-07-09 12:32:04 +02:00
2022-01-18 00:36:43 +01:00
@app.route ( ' /<path:sub_path> ' ) # Default endpoint used by everything
2021-07-13 19:18:50 +02:00
def twitfix ( sub_path ) :
2021-07-13 02:45:30 +02:00
user_agent = request . headers . get ( ' user-agent ' )
2021-07-13 19:18:50 +02:00
match = pathregex . search ( sub_path )
2022-03-07 13:52:39 +01:00
print ( request . url )
2022-01-18 00:36:43 +01:00
2022-05-13 21:04:27 +02:00
if request . url . startswith ( " https://d.vx " ) : # Matches d.fx? Try to give the user a direct link
2022-01-18 00:36:43 +01:00
if user_agent in generate_embed_user_agents :
2022-05-13 21:04:27 +02:00
print ( " ➤ [ D ] d.vx link shown to discord user-agent! " )
2022-01-18 00:36:43 +01:00
if request . url . endswith ( " .mp4 " ) and " ? " not in request . url :
return dl ( sub_path )
else :
return message ( " To use a direct MP4 link in discord, remove anything past ' ? ' and put ' .mp4 ' at the end " )
else :
print ( " ➤ [ R ] Redirect to MP4 using d.fxtwitter.com " )
return dir ( sub_path )
2022-03-07 13:52:39 +01:00
elif request . url . endswith ( " .mp4 " ) or request . url . endswith ( " %2E mp4 " ) :
twitter_url = " https://twitter.com/ " + sub_path
2022-01-18 00:36:43 +01:00
if " ? " not in request . url :
2022-03-07 13:52:39 +01:00
clean = twitter_url [ : - 4 ]
2022-01-18 00:36:43 +01:00
else :
2022-03-07 13:52:39 +01:00
clean = twitter_url
return dl ( clean )
2022-05-13 21:04:27 +02:00
# elif request.url.endswith(".json") or request.url.endswith("%2Ejson"):
# twitter_url = "https://twitter.com/" + sub_path
2022-05-11 01:40:09 +02:00
2022-05-13 21:04:27 +02:00
# if "?" not in request.url:
# clean = twitter_url[:-5]
# else:
# clean = twitter_url
2022-05-11 01:40:09 +02:00
2022-05-13 21:04:27 +02:00
# print( " ➤ [ API ] VNF Json api hit!")
2022-05-11 01:40:09 +02:00
2022-05-13 21:04:27 +02:00
# vnf = link_to_vnf_from_api(clean.replace(".json",""))
2022-05-11 01:40:09 +02:00
2022-05-13 21:04:27 +02:00
# if user_agent in generate_embed_user_agents:
# return message("VNF Data: ( discord useragent preview )\n\n"+ json.dumps(vnf, default=str))
# else:
# return Response(response=json.dumps(vnf, default=str), status=200, mimetype="application/json")
2022-05-11 01:40:09 +02:00
2022-03-07 13:52:39 +01:00
elif request . url . endswith ( " /1 " ) or request . url . endswith ( " /2 " ) or request . url . endswith ( " /3 " ) or request . url . endswith ( " /4 " ) or request . url . endswith ( " %2F 1 " ) or request . url . endswith ( " %2F 2 " ) or request . url . endswith ( " %2F 3 " ) or request . url . endswith ( " %2F 4 " ) :
twitter_url = " https://twitter.com/ " + sub_path
2022-01-18 00:36:43 +01:00
2022-03-07 13:52:39 +01:00
if " ? " not in request . url :
clean = twitter_url [ : - 2 ]
else :
clean = twitter_url
image = ( int ( request . url [ - 1 ] ) - 1 )
return embed_video ( clean , image )
2021-07-13 08:32:25 +02:00
if match is not None :
2021-07-13 19:18:50 +02:00
twitter_url = sub_path
2021-07-04 03:41:47 +02:00
2021-07-13 08:32:25 +02:00
if match . start ( ) == 0 :
2021-07-13 19:18:50 +02:00
twitter_url = " https://twitter.com/ " + sub_path
2021-07-04 03:41:47 +02:00
2021-08-03 03:52:13 +02:00
if user_agent in generate_embed_user_agents :
2021-07-16 22:25:43 +02:00
res = embed_video ( twitter_url )
return res
2021-08-03 03:52:13 +02:00
2021-07-13 02:45:30 +02:00
else :
2022-01-18 00:36:43 +01:00
print ( " ➤ [ R ] Redirect to " + twitter_url )
2021-07-13 08:32:25 +02:00
return redirect ( twitter_url , 301 )
2021-07-04 01:52:30 +02:00
else :
2021-07-21 23:36:05 +02:00
return message ( " This doesn ' t appear to be a twitter URL " )
2021-07-04 01:52:30 +02:00
2022-03-07 13:52:39 +01:00
2022-01-18 00:36:43 +01:00
@app.route ( ' /dir/<path:sub_path> ' ) # Try to return a direct link to the MP4 on twitters servers
2021-07-21 23:36:05 +02:00
def dir ( sub_path ) :
user_agent = request . headers . get ( ' user-agent ' )
2022-02-20 23:13:18 +01:00
url = sub_path
2021-07-21 23:36:05 +02:00
match = pathregex . search ( url )
if match is not None :
twitter_url = url
if match . start ( ) == 0 :
twitter_url = " https://twitter.com/ " + url
2021-08-03 03:52:13 +02:00
if user_agent in generate_embed_user_agents :
2021-10-01 23:59:20 +02:00
res = embed_video ( twitter_url )
2021-07-21 23:36:05 +02:00
return res
2021-08-03 03:52:13 +02:00
2021-07-21 23:36:05 +02:00
else :
2022-01-18 00:36:43 +01:00
print ( " ➤ [ R ] Redirect to direct MP4 URL " )
2021-07-21 23:36:05 +02:00
return direct_video ( twitter_url )
else :
return redirect ( url , 301 )
2022-01-18 00:36:43 +01:00
@app.route ( ' /favicon.ico ' ) # This shit don't work
def favicon ( ) :
return send_from_directory ( os . path . join ( app . root_path , ' static ' ) ,
' favicon.ico ' , mimetype = ' image/vnd.microsoft.icon ' )
2021-07-21 23:36:05 +02:00
def direct_video ( video_link ) : # Just get a redirect to a MP4 link from any tweet link
2022-02-20 23:13:18 +01:00
cached_vnf = getVnfFromLinkCache ( video_link )
2021-07-21 23:36:05 +02:00
if cached_vnf == None :
try :
vnf = link_to_vnf ( video_link )
2022-02-20 23:13:18 +01:00
addVnfToLinkCache ( video_link , vnf )
2021-07-21 23:36:05 +02:00
return redirect ( vnf [ ' url ' ] , 301 )
2022-01-18 00:36:43 +01:00
print ( " ➤ [ D ] Redirecting to direct URL: " + vnf [ ' url ' ] )
2021-07-21 23:36:05 +02:00
except Exception as e :
print ( e )
return message ( " Failed to scan your link! " )
else :
return redirect ( cached_vnf [ ' url ' ] , 301 )
2022-01-18 00:36:43 +01:00
print ( " ➤ [ D ] Redirecting to direct URL: " + vnf [ ' url ' ] )
def direct_video_link ( video_link ) : # Just get a redirect to a MP4 link from any tweet link
2022-02-20 23:13:18 +01:00
cached_vnf = getVnfFromLinkCache ( video_link )
2022-01-18 00:36:43 +01:00
if cached_vnf == None :
try :
vnf = link_to_vnf ( video_link )
2022-02-20 23:13:18 +01:00
addVnfToLinkCache ( video_link , vnf )
2022-01-18 00:36:43 +01:00
return vnf [ ' url ' ]
print ( " ➤ [ D ] Redirecting to direct URL: " + vnf [ ' url ' ] )
except Exception as e :
print ( e )
return message ( " Failed to scan your link! " )
else :
return cached_vnf [ ' url ' ]
print ( " ➤ [ D ] Redirecting to direct URL: " + vnf [ ' url ' ] )
2021-07-21 23:36:05 +02:00
2022-03-07 13:52:39 +01:00
def embed_video ( video_link , image = 0 ) : # Return Embed from any tweet link
2022-02-20 23:13:18 +01:00
cached_vnf = getVnfFromLinkCache ( video_link )
2021-07-08 05:17:23 +02:00
2021-07-12 10:49:07 +02:00
if cached_vnf == None :
2021-07-08 05:17:23 +02:00
try :
2021-07-13 19:19:24 +02:00
vnf = link_to_vnf ( video_link )
2022-02-20 23:13:18 +01:00
addVnfToLinkCache ( video_link , vnf )
2022-03-07 13:52:39 +01:00
return embed ( video_link , vnf , image )
2021-07-21 23:36:05 +02:00
2021-07-12 10:49:07 +02:00
except Exception as e :
print ( e )
2021-07-14 10:33:46 +02:00
return message ( " Failed to scan your link! " )
2021-07-12 10:49:07 +02:00
else :
2022-03-07 13:52:39 +01:00
return embed ( video_link , cached_vnf , image )
2021-07-05 18:02:17 +02:00
2022-05-11 01:40:09 +02:00
def tweetInfo ( url , tweet = " " , desc = " " , thumb = " " , uploader = " " , screen_name = " " , pfp = " " , tweetType = " " , images = " " , hits = 0 , likes = 0 , rts = 0 , time = " " , qrt = { } , nsfw = False ) : # Return a dict of video info with default values
2021-07-05 18:02:17 +02:00
vnf = {
2022-02-20 23:13:18 +01:00
" tweet " : tweet ,
" url " : url ,
" description " : desc ,
" thumbnail " : thumb ,
" uploader " : uploader ,
" screen_name " : screen_name ,
" pfp " : pfp ,
" type " : tweetType ,
2022-03-07 13:52:39 +01:00
" images " : images ,
2022-02-20 23:13:18 +01:00
" hits " : hits ,
" likes " : likes ,
" rts " : rts ,
" time " : time ,
2022-05-11 01:40:09 +02:00
" qrt " : qrt ,
" nsfw " : nsfw
2021-07-05 18:02:17 +02:00
}
return vnf
2021-07-13 19:19:24 +02:00
def link_to_vnf_from_api ( video_link ) :
2022-01-18 00:36:43 +01:00
print ( " ➤ [ + ] Attempting to download tweet info from Twitter API " )
2021-07-13 19:19:24 +02:00
twid = int ( re . sub ( r ' \ ?.*$ ' , ' ' , video_link . rsplit ( " / " , 1 ) [ - 1 ] ) ) # gets the tweet ID as a int from the passed url
2021-07-12 20:49:19 +02:00
tweet = twitter_api . statuses . show ( _id = twid , tweet_mode = " extended " )
2022-05-11 01:40:09 +02:00
# For when I need to poke around and see what a tweet looks like
#print(tweet)
imgs = [ " " , " " , " " , " " , " " ]
2022-02-20 23:13:18 +01:00
print ( " ➤ [ + ] Tweet Type: " + tweetType ( tweet ) )
2021-07-15 02:15:06 +02:00
# Check to see if tweet has a video, if not, make the url passed to the VNF the first t.co link in the tweet
2022-02-20 23:13:18 +01:00
if tweetType ( tweet ) == " Video " :
2022-03-20 01:37:28 +01:00
if tweet [ ' extended_entities ' ] [ ' media ' ] [ 0 ] [ ' video_info ' ] [ ' variants ' ] :
best_bitrate = 0
2022-02-20 23:13:18 +01:00
thumb = tweet [ ' extended_entities ' ] [ ' media ' ] [ 0 ] [ ' media_url ' ]
2022-03-20 01:37:28 +01:00
for video in tweet [ ' extended_entities ' ] [ ' media ' ] [ 0 ] [ ' video_info ' ] [ ' variants ' ] :
2022-05-03 16:37:15 +02:00
if video [ ' content_type ' ] == " video/mp4 " and video [ ' bitrate ' ] > best_bitrate :
url = video [ ' url ' ]
2022-02-20 23:13:18 +01:00
elif tweetType ( tweet ) == " Text " :
url = " "
thumb = " "
2021-07-12 20:49:19 +02:00
else :
2022-05-11 01:40:09 +02:00
imgs = [ " " , " " , " " , " " , " " ]
2022-03-07 13:52:39 +01:00
i = 0
for media in tweet [ ' extended_entities ' ] [ ' media ' ] :
imgs [ i ] = media [ ' media_url_https ' ]
i = i + 1
#print(imgs)
2022-05-11 01:40:09 +02:00
imgs [ 4 ] = str ( i )
2022-02-20 23:13:18 +01:00
url = " "
2022-05-11 01:40:09 +02:00
images = imgs
2022-03-07 13:52:39 +01:00
thumb = tweet [ ' extended_entities ' ] [ ' media ' ] [ 0 ] [ ' media_url_https ' ]
2021-07-12 23:41:07 +02:00
2022-02-20 23:13:18 +01:00
qrt = { }
2021-07-12 23:41:07 +02:00
2022-02-20 23:13:18 +01:00
if ' quoted_status ' in tweet :
qrt [ ' desc ' ] = tweet [ ' quoted_status ' ] [ ' full_text ' ]
qrt [ ' handle ' ] = tweet [ ' quoted_status ' ] [ ' user ' ] [ ' name ' ]
2022-05-03 16:37:15 +02:00
qrt [ ' screen_name ' ] = tweet [ ' quoted_status ' ] [ ' user ' ] [ ' screen_name ' ]
2022-02-20 23:13:18 +01:00
text = tweet [ ' full_text ' ]
2022-05-11 01:40:09 +02:00
if ' possibly_sensitive ' in tweet :
nsfw = tweet [ ' possibly_sensitive ' ]
else :
nsfw = False
vnf = tweetInfo (
url ,
video_link ,
text , thumb ,
tweet [ ' user ' ] [ ' name ' ] ,
tweet [ ' user ' ] [ ' screen_name ' ] ,
tweet [ ' user ' ] [ ' profile_image_url ' ] ,
tweetType ( tweet ) ,
likes = tweet [ ' favorite_count ' ] ,
rts = tweet [ ' retweet_count ' ] ,
time = tweet [ ' created_at ' ] ,
qrt = qrt ,
images = imgs ,
nsfw = nsfw
)
2021-07-12 20:49:19 +02:00
return vnf
2021-07-13 19:19:24 +02:00
def link_to_vnf_from_youtubedl ( video_link ) :
2022-01-18 00:36:43 +01:00
print ( " ➤ [ X ] Attempting to download tweet info via YoutubeDL: " + video_link )
2021-07-12 20:49:19 +02:00
with youtube_dl . YoutubeDL ( { ' outtmpl ' : ' %(id)s . %(ext)s ' } ) as ydl :
2021-07-13 19:19:24 +02:00
result = ydl . extract_info ( video_link , download = False )
2022-02-20 23:13:18 +01:00
vnf = tweetInfo ( result [ ' url ' ] , video_link , result [ ' description ' ] . rsplit ( ' ' , 1 ) [ 0 ] , result [ ' thumbnail ' ] , result [ ' uploader ' ] )
2021-07-12 10:49:07 +02:00
return vnf
2021-07-12 20:49:19 +02:00
2021-07-13 19:19:24 +02:00
def link_to_vnf ( video_link ) : # Return a VideoInfo object or die trying
2021-07-12 20:49:19 +02:00
if config [ ' config ' ] [ ' method ' ] == ' hybrid ' :
try :
2021-07-13 19:19:24 +02:00
return link_to_vnf_from_api ( video_link )
2021-07-12 21:49:29 +02:00
except Exception as e :
2022-01-18 00:36:43 +01:00
print ( " ➤ [ !!! ] API Failed " )
2021-07-12 21:49:29 +02:00
print ( e )
2021-07-13 19:19:24 +02:00
return link_to_vnf_from_youtubedl ( video_link )
2021-07-12 20:49:19 +02:00
elif config [ ' config ' ] [ ' method ' ] == ' api ' :
try :
2021-07-13 19:19:24 +02:00
return link_to_vnf_from_api ( video_link )
2021-07-12 20:49:19 +02:00
except Exception as e :
2022-01-18 00:36:43 +01:00
print ( " ➤ [ X ] API Failed " )
2021-07-12 20:49:19 +02:00
print ( e )
return None
elif config [ ' config ' ] [ ' method ' ] == ' youtube-dl ' :
try :
2021-07-13 19:19:24 +02:00
return link_to_vnf_from_youtubedl ( video_link )
2021-07-12 20:49:19 +02:00
except Exception as e :
2022-01-18 00:36:43 +01:00
print ( " ➤ [ X ] Youtube-DL Failed " )
2021-07-12 20:49:19 +02:00
print ( e )
return None
else :
print ( " Please set the method key in your config file to ' api ' ' youtube-dl ' or ' hybrid ' " )
return None
2022-02-20 23:13:18 +01:00
def getVnfFromLinkCache ( video_link ) :
2021-07-12 10:49:07 +02:00
if link_cache_system == " db " :
collection = db . linkCache
2022-02-20 23:13:18 +01:00
vnf = collection . find_one ( { ' tweet ' : video_link } )
# print(vnf)
2022-01-18 00:36:43 +01:00
if vnf != None :
2022-02-20 23:13:18 +01:00
hits = ( vnf [ ' hits ' ] + 1 )
print ( " ➤ [ ✔ ] Link located in DB cache. " + " hits on this link so far: [ " + str ( hits ) + " ] " )
query = { ' tweet ' : video_link }
change = { " $set " : { " hits " : hits } }
out = db . linkCache . update_one ( query , change )
2021-07-12 10:49:07 +02:00
return vnf
else :
2022-01-18 00:36:43 +01:00
print ( " ➤ [ X ] Link not in DB cache " )
2021-07-12 10:49:07 +02:00
return None
elif link_cache_system == " json " :
2021-07-13 19:18:50 +02:00
if video_link in link_cache :
2021-07-12 10:49:07 +02:00
print ( " Link located in json cache " )
2021-07-13 19:18:50 +02:00
vnf = link_cache [ video_link ]
2021-07-12 10:49:07 +02:00
return vnf
else :
2022-01-18 00:36:43 +01:00
print ( " ➤ [ X ] Link not in json cache " )
2021-07-12 10:49:07 +02:00
return None
2022-02-20 23:13:18 +01:00
def addVnfToLinkCache ( video_link , vnf ) :
2021-07-12 10:49:07 +02:00
if link_cache_system == " db " :
try :
out = db . linkCache . insert_one ( vnf )
2022-01-18 00:36:43 +01:00
print ( " ➤ [ + ] Link added to DB cache " )
2021-07-12 10:49:07 +02:00
return True
except Exception :
2022-01-18 00:36:43 +01:00
print ( " ➤ [ X ] Failed to add link to DB cache " )
2021-07-12 10:49:07 +02:00
return None
elif link_cache_system == " json " :
2021-07-13 19:18:50 +02:00
link_cache [ video_link ] = vnf
2022-01-18 00:36:43 +01:00
with open ( " links.json " , " w " ) as outfile :
2021-07-12 10:49:07 +02:00
json . dump ( link_cache , outfile , indent = 4 , sort_keys = True )
return None
2021-07-14 10:33:46 +02:00
def message ( text ) :
2022-02-20 23:13:18 +01:00
return render_template (
' default.html ' ,
message = text ,
color = config [ ' config ' ] [ ' color ' ] ,
appname = config [ ' config ' ] [ ' appname ' ] ,
repo = config [ ' config ' ] [ ' repo ' ] ,
url = config [ ' config ' ] [ ' url ' ] )
2021-07-14 10:33:46 +02:00
2022-03-07 13:52:39 +01:00
def embed ( video_link , vnf , image ) :
2022-02-20 23:13:18 +01:00
print ( " ➤ [ E ] Embedding " + vnf [ ' type ' ] + " : " + vnf [ ' url ' ] )
desc = re . sub ( r ' http.*t \ .co \ S+ ' , ' ' , vnf [ ' description ' ] )
urlUser = urllib . parse . quote ( vnf [ ' uploader ' ] )
urlDesc = urllib . parse . quote ( desc )
urlLink = urllib . parse . quote ( video_link )
2022-05-11 01:40:09 +02:00
likeDisplay = ( " \n \n 💖 " + str ( vnf [ ' likes ' ] ) + " 🔁 " + str ( vnf [ ' rts ' ] ) + " \n " )
2022-02-20 23:13:18 +01:00
try :
2022-05-11 01:40:09 +02:00
if vnf [ ' type ' ] == " " :
desc = desc
elif vnf [ ' type ' ] == " Video " :
2022-02-20 23:13:18 +01:00
desc = desc
elif vnf [ ' qrt ' ] == { } : # Check if this is a QRT and modify the description
desc = ( desc + likeDisplay )
else :
2022-05-03 16:37:15 +02:00
qrtDisplay = ( " \n ───────────── \n ➤ QRT of " + vnf [ ' qrt ' ] [ ' handle ' ] + " (@ " + vnf [ ' qrt ' ] [ ' screen_name ' ] + " ): \n ───────────── \n ' " + vnf [ ' qrt ' ] [ ' desc ' ] + " ' " )
2022-02-20 23:13:18 +01:00
desc = ( desc + qrtDisplay + likeDisplay )
except :
vnf [ ' likes ' ] = 0 ; vnf [ ' rts ' ] = 0 ; vnf [ ' time ' ] = 0
print ( ' ➤ [ X ] Failed QRT check - old VNF object ' )
if vnf [ ' type ' ] == " Text " : # Change the template based on tweet type
template = ' text.html '
if vnf [ ' type ' ] == " Image " :
2022-03-07 13:52:39 +01:00
image = vnf [ ' images ' ] [ image ]
2022-02-20 23:13:18 +01:00
template = ' image.html '
if vnf [ ' type ' ] == " Video " :
urlDesc = urllib . parse . quote ( textwrap . shorten ( desc , width = 220 , placeholder = " ... " ) )
template = ' video.html '
2022-03-07 13:52:39 +01:00
if vnf [ ' type ' ] == " " :
urlDesc = urllib . parse . quote ( textwrap . shorten ( desc , width = 220 , placeholder = " ... " ) )
template = ' video.html '
2022-05-11 01:40:09 +02:00
color = " #7FFFD4 " # Green
if vnf [ ' nsfw ' ] == True :
color = " #800020 " # Red
2022-02-20 23:13:18 +01:00
return render_template (
template ,
likes = vnf [ ' likes ' ] ,
rts = vnf [ ' rts ' ] ,
time = vnf [ ' time ' ] ,
screenName = vnf [ ' screen_name ' ] ,
vidlink = vnf [ ' url ' ] ,
pfp = vnf [ ' pfp ' ] ,
vidurl = vnf [ ' url ' ] ,
desc = desc ,
2022-03-07 13:52:39 +01:00
pic = image ,
2022-02-20 23:13:18 +01:00
user = vnf [ ' uploader ' ] ,
video_link = video_link ,
2022-05-11 01:40:09 +02:00
color = color ,
2022-02-20 23:13:18 +01:00
appname = config [ ' config ' ] [ ' appname ' ] ,
repo = config [ ' config ' ] [ ' repo ' ] ,
url = config [ ' config ' ] [ ' url ' ] ,
urlDesc = urlDesc ,
urlUser = urlUser ,
2022-05-15 02:47:20 +02:00
urlLink = urlLink ,
tweetLink = vnf [ ' tweet ' ] )
2022-02-20 23:13:18 +01:00
def tweetType ( tweet ) : # Are we dealing with a Video, Image, or Text tweet?
if ' extended_entities ' in tweet :
if ' video_info ' in tweet [ ' extended_entities ' ] [ ' media ' ] [ 0 ] :
out = " Video "
else :
out = " Image "
2021-07-15 02:15:06 +02:00
else :
2022-02-20 23:13:18 +01:00
out = " Text "
return out
2021-07-12 10:49:07 +02:00
2022-02-20 23:13:18 +01:00
def oEmbedGen ( description , user , video_link , ttype ) :
2021-07-09 12:32:04 +02:00
out = {
2022-02-20 23:13:18 +01:00
" type " : ttype ,
" version " : " 1.0 " ,
" provider_name " : config [ ' config ' ] [ ' appname ' ] ,
" provider_url " : config [ ' config ' ] [ ' repo ' ] ,
" title " : description ,
" author_name " : user ,
" author_url " : video_link
2021-07-09 12:32:04 +02:00
}
return out
2021-07-04 01:52:30 +02:00
if __name__ == " __main__ " :
2022-01-18 00:36:43 +01:00
app . config [ ' SERVER_NAME ' ] = ' localhost:80 '
2021-07-08 05:17:23 +02:00
app . run ( host = ' 0.0.0.0 ' )