sonarr-rss/app.py

124 lines
3.6 KiB
Python

#----------------------------------------------------------------------------#
# Imports
#----------------------------------------------------------------------------#
from flask import Flask, render_template, request
import logging
from logging import Formatter, FileHandler
import os
from datetime import datetime
import pytz
import urllib
from dateutil import tz
import yaml
from feedgen.feed import FeedGenerator
utctz = pytz.utc
#----------------------------------------------------------------------------#
# App Config.
#----------------------------------------------------------------------------#
app = Flask(__name__)
app.config.from_object('config')
#----------------------------------------------------------------------------#
# Controllers.
#----------------------------------------------------------------------------#
@app.route('/feed')
def about():
feed_data = list()
with open('./feed.yaml', 'r') as f:
feed_data = yaml.safe_load(f.read())
fg = FeedGenerator()
fg.id('http://whatthefuck.computer/sonarr')
fg.title('Sonarr RSS Feeds')
fg.link(href='http://whatthefuck.computer/')
fg.description("rss feed of sonarr downloads")
# grab last ten entries in feed
feed_data = feed_data[-11:-1]
for entry in feed_data:
fe = entry_to_feed_entry(fg, entry)
return fg.rss_str(pretty=True)
def entry_to_feed_entry(generator, entry):
fe = generator.add_entry()
episodes = ' '.join(["{s}x{e}".format(s=e['seasonNumber'], e=e['episodeNumber']) for e in entry['episodes']])
title = "{title} {episodes}".format(
title=entry['series']['title'],
episodes=episodes
)
guid = "sonarr/{series}/{episodeid}".format(series=entry['series']['tvdbId'], episodeid=entry['episodeFile']['id'])
fe.guid(guid)
fe.id(guid)
fe.title(title)
basepath = entry['series']['path']
basepath = basepath.replace('/tv/', '/srv/files/Videos/')
relpath = entry['episodeFile']['relativePath'].encode('utf-8')
link = "{basepath}/{relpath}".format(basepath=basepath, relpath=relpath)
fe.link(href=link)
body = '<br/>'.join([title, link])
fe.description(body)
fe.content(body)
garbo = datetime.utcnow().replace(tzinfo=utctz).isoformat()
print garbo
fe.published(entry.get('ingestionDate') or garbo)
@app.route('/webhook', methods=["POST"])
def login():
post_data = request.json
post_data['ingestionDate'] = datetime.utcnow().replace(tzinfo=utctz).isoformat()
if post_data['eventType'] != 'Download':
print "Nothing to do here"
return 'nop'
feed_data = list()
with open('./feed.yaml', 'r') as f:
feed_data = yaml.safe_load(f.read())
feed_data.append(post_data)
with open('./feed.yaml', 'w') as f:
f.write(yaml.safe_dump(feed_data, default_flow_style=False))
print(request.form)
return ':)'
# Error handlers.
@app.errorhandler(500)
def internal_error(error):
return ":(", 500
@app.errorhandler(404)
def not_found_error(error):
return ":(", 404
if not app.debug:
file_handler = FileHandler('error.log')
file_handler.setFormatter(
Formatter('%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]')
)
app.logger.setLevel(logging.INFO)
file_handler.setLevel(logging.INFO)
app.logger.addHandler(file_handler)
app.logger.info('errors')
#----------------------------------------------------------------------------#
# Launch.
#----------------------------------------------------------------------------#
if __name__ == '__main__':
port = int(os.environ.get('PORT', 5000))
app.run(host='0.0.0.0', port=port)