Browse Source

Added support for media download/upload.

master
Trey Del Bonis 2 years ago
parent
commit
4e032008e9
1 changed files with 60 additions and 30 deletions
  1. 60
    30
      main.py

+ 60
- 30
main.py View File

import sys import sys


import json import json
import re
import tempfile
from urllib.parse import urlparse


import requests import requests
from mastodon import Mastodon from mastodon import Mastodon
baseurl = 'https://%s' % config['hostname'] baseurl = 'https://%s' % config['hostname']
return Mastodon(access_token=config['token'], api_base_url=baseurl) return Mastodon(access_token=config['token'], api_base_url=baseurl)


def download_file(url, destdir):
resp = requests.get(url)
resp.raise_for_status()

fname = None
if 'content-disposition' in resp.headers:
# Taken from: https://stackoverflow.com/questions/31804799/
d = resp.headers['content-disposition']
fname = re.findall("filename=(.+)", d)[0]
else:
u = urlparse(url)
fname = u.path.rsplit('/', 1)[-1]

destpath = os.path.join(destdir, fname)

with open(destpath, 'wb') as f:
f.write(resp.content)

return destpath

def make_post(masto, data): def make_post(masto, data):
body = '%s\n\nby /u/%s at https://old.reddit.com/%s' % (data['title'], data['username'], data['rid'])
with tempfile.TemporaryDirectory(prefix='mastoreddit.', dir='/tmp') as td:
os.makedirs(td, exist_ok=True)


#if len(data['attachments']) > 4:
# data['attachments'] = data['attachments'][:4]
if len(data['media']) > 4:
data['media'] = data['media'][:4]


image_resps = None
#if data['attachments'] is not None:
# for a in data['attachments']:
# res = masto.media_post(a)
# res.raise_for_status()
# image_resps.append(res)
#else:
# image_resps = None
image_resps = None
if data['media'] is not None and len(data['media']) > 0:
image_resps = []
for a in data['media']:
dlpath = download_file(a, td)
res = masto.media_post(dlpath)
image_resps.append(res)


masto.status_post(body, media_ids=image_resps)
body = '%s\n\nby /u/%s at https://old.reddit.com/%s' % (data['title'], data['username'], data['rid'])
masto.status_post(body, media_ids=image_resps)


def extract_media_urls(data): def extract_media_urls(data):

if 'selftext' in data: if 'selftext' in data:
return []
st = data['selftext']
if st is not None and len(st) > 0:
return []


if 'post_hint' not in data: if 'post_hint' not in data:
if 'gallery_data' in data: if 'gallery_data' in data:


raise ValueError('unknown hint type ' + hint) raise ValueError('unknown hint type ' + hint)


def process_post(post):
d = post['data']

media = []
try:
media = extract_media_urls(d)
except Exception as e:
print('error processing ' + d['id'] + ': ' + str(e))

return {
'rid': d['id'],
'title': d['title'],
'username': d['author'],
'score': d['ups'],
'media': media
}

def query_tops(config): def query_tops(config):
url = 'https://www.reddit.com/r/%s/top.json?sort=top&t=day' % config['subreddit'] url = 'https://www.reddit.com/r/%s/top.json?sort=top&t=day' % config['subreddit']
resp = requests.get(url, headers = {'User-agent': 'mastoreddit'}) resp = requests.get(url, headers = {'User-agent': 'mastoreddit'})
for post in j['data']['children']: for post in j['data']['children']:
if post['kind'] != 't3': if post['kind'] != 't3':
print('found post of kind', post['kind']) print('found post of kind', post['kind'])
d = post['data']

media = None
try:
media = extract_media_urls(d)
except Exception as e:
print('error processing ' + d['id'] + ': ' + str(e))

posts.append({
'rid': d['id'],
'title': d['title'],
'username': d['author'],
'score': d['ups'],
'media': media
})
posts.append(process_post(post))


return posts return posts


masto = make_masto(config) masto = make_masto(config)
# make_post(masto, {'title': sys.argv[1], 'username': 'nobody', 'rid': 'none', 'attachments': [sys.argv[2]]}) # make_post(masto, {'title': sys.argv[1], 'username': 'nobody', 'rid': 'none', 'attachments': [sys.argv[2]]})
res = query_tops(config) res = query_tops(config)
for r in res[:5]:
print('posting', r['rid'], '-', r['title'])
for r in res:
print('posting', r['rid'], '-', r['title'], '=====', r)
make_post(masto, r) make_post(masto, r)


if __name__ == '__main__': if __name__ == '__main__':

Loading…
Cancel
Save