]> git.gir.st - subscriptionfeed.git/blob - app/dangerous/__init__.py
implement channel search
[subscriptionfeed.git] / app / dangerous / __init__.py
1 # this is an alternative to proxying through invidious. the search endpoint has only been (loosely) tested by
2 #17:50 < perflyst[m]> appears to be working
3 #, so i hopeā„¢ this works. if not, that's why it's in the 'dangerous' blueprint
4 import requests
5 from flask import Blueprint, render_template, request, flash, g, url_for
6
7 from ..common.common import *
8 from ..common.innertube import *
9 from .lib import *
10 from .protobuf import make_sp, make_channel_params, make_playlist_params
11
12 frontend = Blueprint('dangerous', __name__,
13 template_folder='templates',
14 static_folder='static',
15 static_url_path='/static/ys')
16
17 @frontend.route('/search')
18 def search():
19 #token = getattr(current_user, 'token', 'guest')
20 q = request.args.get('q')
21 page = int(request.args.get('page', 1))
22
23 sp = make_sp(**{
24 k:v for k,v in request.args.items()
25 if k in ['sort','date','type','len']
26 }, extras=['dont_fix_spelling']*0) # extras disabled
27
28 if q:
29 yt_results = fetch_searchresults(q, page, sp)
30
31 results, extras = prepare_searchresults(yt_results)
32
33 for extra in extras:
34 flash(extra, 'info')
35 else:
36 results = None
37
38 return render_template('search.html.j2', rows=results, query=q, page=page)
39
40 # TODO: channels, playlists:
41 # https://github.com/iv-org/invidious/blob/452d1e8307d6344dd51c5437ccd032a566291c34/src/invidious/channels.cr#L399
42
43 @frontend.route('/channel/<channel_id>/')
44 @frontend.route('/channel/<channel_id>/<subpage>')
45 def channel(channel_id, subpage="videos"):
46 #TODO: if anything goes wrong, fall back to xmlfeed
47 if subpage == "videos":
48 page = int(request.args.get('page', 1))
49 sort_by = request.args.get('sort', "newest")
50 query = None
51 elif subpage == "playlists":
52 page = None # TODO: cursor
53 sort_by = request.args.get('sort', "modified")
54 query = None
55 elif subpage == "search":
56 query = request.args.get('q')
57 page = int(request.args.get('page', 1))
58 sort_by = None
59 else:
60 return "not found", 404
61
62 result = fetch_ajax(make_channel_params(channel_id, subpage, page, sort_by, query))
63
64 title, descr, thumb, rows, more = prepare_channel(result, channel_id)
65 # TODO: add is_pinned/is_hidden
66
67 return render_template('channel.html.j2',
68 title=title,
69 subpage=subpage,
70 rows=rows,
71 channel_id=channel_id,
72 channel_img=thumb,
73 channel_desc=descr,
74 page=page,
75 has_more=more)
76
77 @frontend.route('/playlist')
78 def playlist():
79 #TODO: if anything goes wrong, fall back to xmlfeed
80 playlist_id = request.args.get('list')
81 if not playlist_id:
82 return "bad list id", 400 # todo
83 page = int(request.args.get('page', 1))
84
85 offset = (page-1)*100 # each call returns 100 items
86 result = fetch_ajax(make_playlist_params(playlist_id, offset))
87
88 rows = prepare_playlist(result)
89
90 return render_template('playlist.html.j2',
91 title="playlist", # XXX: can't get playlist metadata from this, get from xmlfeed!
92 rows=rows,
93 page=page)
94
95 @frontend.before_app_request
96 def inject_button():
97 if not 'header_items' in g:
98 g.header_items = []
99 g.header_items.append({
100 'name': 'search',
101 'url': url_for('dangerous.search'),
102 'parent': frontend.name,
103 'priority': 15,
104 })
Imprint / Impressum