90 lines
3.6 KiB
Python
90 lines
3.6 KiB
Python
"""Main script to toot a new post"""
|
|
|
|
import time
|
|
from os import getenv, remove
|
|
from os.path import getsize
|
|
|
|
import praw
|
|
import wget
|
|
from dotenv import load_dotenv
|
|
from mastodon import Mastodon
|
|
from redvid import Downloader
|
|
|
|
# ----- load .env ----- #
|
|
|
|
load_dotenv()
|
|
|
|
# ----- initialization ----- #
|
|
|
|
# initialize reddit
|
|
reddit = praw.Reddit(
|
|
client_id = getenv("REDDIT_CLIENT_ID"),
|
|
client_secret = getenv("REDDIT_CLIENT_SECRET"),
|
|
redirect_uri = "http://localhost:8080", # does not matter what is here
|
|
user_agent = getenv("REDDIT_USER_AGENT")
|
|
)
|
|
|
|
# initialize mastodon
|
|
mastodon = Mastodon(
|
|
access_token = getenv("MASTODON_USER_SECRET"),
|
|
api_base_url = getenv("MASTODON_URL")
|
|
)
|
|
|
|
# ----- main script ----- #
|
|
|
|
# get recent posts to check for duplicates
|
|
last_posts = mastodon.account_statuses(getenv("MASTODON_USER_ID"), limit=15)
|
|
|
|
for submission in reddit.subreddit(str(getenv("REDDIT_SUBREDDIT"))).top(time_filter="day", limit=10):
|
|
# skip post if it is a stickied post
|
|
if (submission.stickied):
|
|
continue
|
|
|
|
# check if the post has been posted before
|
|
already_posted = False
|
|
for posted_submission in last_posts:
|
|
if submission.permalink in posted_submission["content"]:
|
|
already_posted = True
|
|
break
|
|
# abort download if the post has been posted already
|
|
if already_posted:
|
|
print("Skipping post: https://www.reddit.com" + submission.permalink)
|
|
continue
|
|
|
|
# check if text only
|
|
if submission.is_self:
|
|
status_text = submission.title + "\n\ngeposted von u/" + submission.author.name + "\n" + submission.permalink + "\n\n" + submission.selftext
|
|
mastodon.status_post(status_text, visibility="unlisted")
|
|
# check if reddit video
|
|
elif "v.redd.it" in submission.url:
|
|
filename = "video.mp4"
|
|
|
|
# download video with highest possible resolution while not exceeding 10MB
|
|
print("Downloading video post: https://www.reddit.com" + submission.permalink)
|
|
downloader = Downloader(url="https://www.reddit.com"+submission.permalink, filename=filename, max_s=10_000_000, auto_max=True)
|
|
return_val = downloader.download()
|
|
|
|
print("\nUploading video")
|
|
|
|
# check if video was downloaded successfully (digit return value if unsuccessful, otherwise string value containing the path to the video)
|
|
if str(return_val).isdigit():
|
|
status_text = submission.title + "\n\nDas gepostete Video ist leider zu groß für diesen Server. Das Video bzw. der Post kann über den untenstehenden Link aufgerufen werden. " + "\n\ngeposted von u/" + submission.author.name + "\nhttps://www.reddit.com" + submission.permalink
|
|
mastodon.status_post(status_text, visibility="unlisted")
|
|
else:
|
|
media = mastodon.media_post(filename)
|
|
time.sleep(60.0)
|
|
status_text = submission.title + "\n\ngeposted von u/" + submission.author.name + "\nhttps://www.reddit.com" + submission.permalink
|
|
mastodon.status_post(status_text, media_ids=media["id"], visibility="unlisted")
|
|
|
|
remove(filename)
|
|
else:
|
|
print("Downloading image post: https://www.reddit.com" + submission.permalink)
|
|
filename = wget.download(submission.url, out="image." + submission.url.split(".")[-1])
|
|
|
|
print("\nUploading image")
|
|
media = mastodon.media_post(filename)
|
|
status_text = submission.title + "\n\ngeposted von u/" + submission.author.name + "\nhttps://www.reddit.com" + submission.permalink
|
|
mastodon.status_post(status_text, media_ids=media["id"], visibility="unlisted")
|
|
|
|
remove(filename)
|
|
break
|