From 2d51ac1671614d0f463296254740e62b960dab54 Mon Sep 17 00:00:00 2001 From: Dylan Date: Thu, 2 May 2024 19:42:21 +0100 Subject: [PATCH] More bugfixes --- msgs.py | 10 ++++++---- templates/video.html | 2 +- test_vx_embeds.py | 13 ++++++++++++- twitfix.py | 15 ++++++++------- utils.py | 12 ++++++++++-- vxApi.py | 4 +++- 6 files changed, 40 insertions(+), 16 deletions(-) diff --git a/msgs.py b/msgs.py index 9704de8..35c67eb 100644 --- a/msgs.py +++ b/msgs.py @@ -22,11 +22,11 @@ def genQrtDisplay(qrt): def genPollDisplay(poll): pctSplit=10 output="\n\n" - for choice in poll["choices"]: - output+=choice["text"]+"\n"+("█"*int(choice["percent"]/pctSplit)) +" "+str(choice["percent"])+"%\n" + for choice in poll["options"]: + output+=choice["name"]+"\n"+("█"*int(choice["percent"]/pctSplit)) +" "+str(choice["percent"])+"%\n" return output -def formatEmbedDesc(type,body,qrt,pollDisplay,likesDisplay): +def formatEmbedDesc(type,body,qrt,pollData,likesDisplay): # Trim the embed description to 248 characters, prioritizing poll and likes qrtType=None @@ -36,8 +36,10 @@ def formatEmbedDesc(type,body,qrt,pollDisplay,likesDisplay): limit = videoDescLimit if type=="Text" or type=="Video" or (qrt!=None and (qrtType=="Text" or qrtType=="Video")) else tweetDescLimit output = "" - if pollDisplay==None: + if pollData==None: pollDisplay="" + else: + pollDisplay=genPollDisplay(pollData) if qrt!=None: diff --git a/templates/video.html b/templates/video.html index 04fa08a..48ec6e4 100644 --- a/templates/video.html +++ b/templates/video.html @@ -18,5 +18,5 @@ - + {% endblock %} {% block body %} Redirecting you to the tweet in a moment. Or click here. {% endblock %} \ No newline at end of file diff --git a/test_vx_embeds.py b/test_vx_embeds.py index 278045b..df8c437 100644 --- a/test_vx_embeds.py +++ b/test_vx_embeds.py @@ -158,4 +158,15 @@ def test_embed_mixedMedia(): assert img1 in str(resp.data) and img2 not in str(resp.data) resp = client.get(testMixedMediaTweet.replace("https://twitter.com","")+"/2",headers={"User-Agent":"test"}) assert resp.status_code==200 - assert img1 not in str(resp.data) and img2 in str(resp.data) \ No newline at end of file + assert img1 not in str(resp.data) and img2 in str(resp.data) + +def test_embed_poll(): + resp = client.get(testPollTweet.replace("https://twitter.com",""),headers={"User-Agent":"test"}) + assert resp.status_code==200 + assert "Mean one thing" in str(resp.data) + assert "78.82%" in str(resp.data) + +def test_embed_stripLastUrl(): + resp = client.get(testMediaTweet.replace("https://twitter.com",""),headers={"User-Agent":"test"}) + assert resp.status_code==200 + assert "HgLAbiXw2E" not in str(resp.data) \ No newline at end of file diff --git a/twitfix.py b/twitfix.py index f60ec04..45b2637 100644 --- a/twitfix.py +++ b/twitfix.py @@ -4,7 +4,8 @@ from flask_cors import CORS import re import os import combineImg -from io import BytesIO, StringIO +from io import BytesIO +import urllib import msgs import twExtract as twExtract from configHandler import config @@ -54,38 +55,38 @@ def message(text): def renderImageTweetEmbed(tweetData,image,appnameSuffix=""): qrt = tweetData['qrt'] - pollData = None - embedDesc = msgs.formatEmbedDesc("Image",tweetData['text'],qrt,pollData,msgs.genLikesDisplay(tweetData)) + embedDesc = msgs.formatEmbedDesc("Image",tweetData['text'],qrt,tweetData['pollData'],msgs.genLikesDisplay(tweetData)) return render_template("image.html", tweet=tweetData, pic=[image], host=config['config']['url'], desc=embedDesc, + urlEncodedDesc=urllib.parse.quote(embedDesc), tweetLink=f'https://twitter.com/{tweetData["user_screen_name"]}/status/{tweetData["tweetID"]}', appname=config['config']['appname']+appnameSuffix, ) def renderVideoTweetEmbed(tweetData,mediaInfo,appnameSuffix=""): qrt = tweetData['qrt'] - pollData = None - embedDesc = msgs.formatEmbedDesc("Video",tweetData['text'],qrt,pollData,msgs.genLikesDisplay(tweetData)) + embedDesc = msgs.formatEmbedDesc("Video",tweetData['text'],qrt,tweetData['pollData'],msgs.genLikesDisplay(tweetData)) return render_template("video.html", tweet=tweetData, media=mediaInfo, host=config['config']['url'], desc=embedDesc, + urlEncodedDesc=urllib.parse.quote(embedDesc), tweetLink=f'https://twitter.com/{tweetData["user_screen_name"]}/status/{tweetData["tweetID"]}', appname=config['config']['appname']+appnameSuffix, ) def renderTextTweetEmbed(tweetData,appnameSuffix=""): qrt = tweetData['qrt'] - pollData = None - embedDesc = msgs.formatEmbedDesc("Text",tweetData['text'],qrt,pollData,msgs.genLikesDisplay(tweetData)) + embedDesc = msgs.formatEmbedDesc("Text",tweetData['text'],qrt,tweetData['pollData'],msgs.genLikesDisplay(tweetData)) return render_template("text.html", tweet=tweetData, host=config['config']['url'], desc=embedDesc, + urlEncodedDesc=urllib.parse.quote(embedDesc), tweetLink=f'https://twitter.com/{tweetData["user_screen_name"]}/status/{tweetData["tweetID"]}', appname=config['config']['appname']+appnameSuffix, ) diff --git a/utils.py b/utils.py index 5d2418e..d0b89d1 100644 --- a/utils.py +++ b/utils.py @@ -1,11 +1,19 @@ import re pathregex = re.compile("\\w{1,15}\\/(status|statuses)\\/(\\d{2,20})") - +endTCOregex = re.compile("(^.*?) +https:\/\/t.co\/.*?$") def getTweetIdFromUrl(url): match = pathregex.search(url) if match is not None: return match.group(2) else: - return None \ No newline at end of file + return None + +def stripEndTCO(text): + # remove t.co links at the end of a string + match = endTCOregex.search(text) + if match is not None: + return match.group(1) + else: + return text \ No newline at end of file diff --git a/vxApi.py b/vxApi.py index 7a3d39d..4b8b724 100644 --- a/vxApi.py +++ b/vxApi.py @@ -1,6 +1,7 @@ import html from datetime import datetime from configHandler import config +from utils import stripEndTCO def getApiResponse(tweet,include_txt=False,include_zip=False): tweetL = tweet["legacy"] @@ -89,6 +90,7 @@ def getApiResponse(tweet,include_txt=False,include_zip=False): twText = twText.replace(eurl["url"], "") else: twText = twText.replace(eurl["url"],eurl["expanded_url"]) + twText = stripEndTCO(twText) # check if all extended media are the same type sameMedia = False @@ -102,7 +104,7 @@ def getApiResponse(tweet,include_txt=False,include_zip=False): sameMedia = True combinedMediaUrl = None - if sameMedia and media_extended[0]["type"] == "image" and len(media) > 1: + if len(media_extended) > 0 and sameMedia and media_extended[0]["type"] == "image" and len(media) > 1: host=config['config']['url'] combinedMediaUrl = f'{host}/rendercombined.jpg?imgs=' for i in media: