124 lines
3.6 KiB
Python
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)
|