from server import * def gen_atomid(s): return 'urn:md5:'+hashlib.md5(s.encode('utf-8')).hexdigest().upper() def fixdate(d): if not isinstance(d, datetime): return datetime(MINYEAR, 1, 1) return d @app.route('/feed') @app.route('/<handle>/feed') @handle_errors(None, 'Diese Veranstaltung existiert nicht!', 404, IndexError) def feed(handle=None): id = None course = {'id': None, 'title': 'Neueste Videos', 'time_created': None, 'time_updated': None} course['atomid'] = gen_atomid('FROM videos SELECT *') if handle: course = query('SELECT * FROM courses WHERE handle = ? AND visible', handle)[0] course['atomid'] = gen_atomid('Video AG, courses['+str(course['id'])+']: '+course['handle']) id = course['id'] entries = query(''' SELECT lectures.*, "video" AS sep, videos.*, formats.description AS format_description, formats.prio, "course" AS sep, courses.* FROM lectures JOIN courses ON (courses.id = lectures.course_id) JOIN videos ON (lectures.id = videos.lecture_id) JOIN formats ON (formats.id = videos.video_format) WHERE ((? IS NULL AND courses.listed) OR course_id = ?) AND courses.visible AND lectures.visible AND videos.visible ORDER BY videos.time_created DESC, prio ASC LIMIT 100''', course['id'], course['id']) updated = max(course['time_updated'], course['time_created'], key=fixdate) for entry in entries: entry['updated'] = max(entry['video']['time_created'], entry['video']['time_updated'], entry['time_created'], entry['time_updated'], key=fixdate) if len(entry['video']['hash']) != 32: entry['atomid'] = gen_atomid('Video AG, videos['+str(entry['video']['id'])+']') else: entry['atomid'] = 'urn:md5:'+(entry['video']['hash'].upper()) updated = max(updated, entry['updated'], key=fixdate) course['updated'] = updated return Response(render_template('feed.atom', course=course, entries=entries), 200, {'Content-Type': 'application/atom+xml'}) @app.route('/<handle>/rss') @handle_errors(None, 'Die Veranstaltung oder das Format existiert nicht!', 404, IndexError) def rss_feed(handle): course = query('SELECT * FROM courses WHERE handle = ? AND visible', handle)[0] formats = query('''SELECT formats.* FROM formats JOIN videos ON videos.video_format = formats.id JOIN lectures ON lectures.id = videos.lecture_id WHERE lectures.course_id = ? GROUP BY formats.id ORDER BY formats.player_prio DESC''', course['id']) if not formats: formats = query('SELECT * FROM formats WHERE id = 4 OR id = 5 OR id = 10') # 360p, 720p, 1080p if 'format_id' not in request.values: return redirect(url_for('rss_feed', handle=handle, format_id=formats[0]['id'])) fmt = query('SELECT * FROM formats WHERE id = ?', request.values.get('format_id', request.values['format_id']))[0] items = query('''SELECT lectures.*, "video" AS sep, videos.* FROM lectures JOIN courses ON courses.id = lectures.course_id JOIN videos ON lectures.id = videos.lecture_id WHERE courses.id = ? AND videos.video_format = ? AND courses.visible AND lectures.visible AND videos.visible ORDER BY lectures.time DESC LIMIT 100''', course['id'], fmt['id']) chapters = query('SELECT chapters.* FROM chapters JOIN lectures ON lectures.id = chapters.lecture_id WHERE lectures.course_id = ? AND NOT chapters.deleted AND chapters.visible ORDER BY time ASC', course['id']) for item in items: item['updated'] = max(item['video']['time_created'], item['video']['time_updated'], item['time_created'], item['time_updated'], key=fixdate) return Response(render_template('feed.rss', course=course, format=fmt, formats=formats, items=items, chapters=chapters), 200, {'Content-Type': 'application/rss+xml; charset=UTF-8'}) @app.route('/courses/feed') def courses_feed(): courses = query('SELECT * FROM courses WHERE visible AND listed ORDER BY time_created DESC LIMIT 100') atomid = gen_atomid('Video AG, courses') updated = None for course in courses: course['updated'] = max(course['time_created'], course['time_updated'], key=fixdate) course['atomid'] = gen_atomid('Video AG, courses['+str(course['id'])+']: '+course['handle']) updated = max(updated, course['updated'], key=fixdate) return Response(render_template('courses_feed.atom', updated=updated, atomid=atomid, courses=courses), 200, {'Content-Type': 'application/atom+xml'})