]> git.gir.st - subscriptionfeed.git/blob - app/templates/macros.imp.j2
reddit: textarea hack does't escape quotes
[subscriptionfeed.git] / app / templates / macros.imp.j2
1 {% set fallback_img = "data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 300 300' fill='%23fff'><circle r='30' cx='80' cy='150' fill='%23fff' stroke='%23000'/><circle r='30' cx='150' cy='150' fill='%23fff' stroke='%23000'/><circle r='30' cx='220' cy='150' fill='%23fff' stroke='%23000'/></svg>" %}
2
3 {% macro card_generic(link, thumbnail, title='', badge=None, pinned=False) -%}
4 <div class="card {{ "pinned" if pinned else "" }}">
5 <div class="card-main">
6 <a class="link-main" href="{{ link }}" title="{{ title | e }}">
7 <div class="thumb">
8 <img src="{{ thumbnail or fallback_img}}">
9 {% if badge is not none %}
10 <span class="badge">{{ badge | e }}</span>
11 {% endif %}
12 </div>
13 <div class="title">{{ title | e }}</div>
14 </a>
15 </div>
16 <div class="infobar">
17 {{ caller() }}
18 </div>
19 </div>
20 {%- endmacro %}
21
22 {% macro card(video_id, title='', advanced_text='', pinned="undefined", advanced_title='', post_url=None, badge=None, ts=None, list=None) -%}
23 {% set caller_ = caller %}
24 {% set pinned_ = False if pinned == "undefined" else pinned %}
25 {% set ts_ = '&t='~ts if ts else '' %}
26 {% set list_ = '&list='~list if list else '' %}
27 {% call card_generic("/watch?v="~video_id~ts_~list_, "https://i.ytimg.com/vi/"~video_id~"/mqdefault.jpg", title, badge, pinned_) %}
28 {{ caller_() }}
29 <details class="advanced"><summary title="{{advanced_title}}">{{ advanced_text }}</summary>
30 <div class="details">
31 {% if post_url %}
32 {{ emoji_link("comments", post_url, False) }}
33 {%endif%}
34 {% if pinned != "undefined" %}
35 {{ emoji_button("pin", video_id, pinned, False) }}
36 {{ emoji_button("hide", video_id, False, False) }}
37 {%endif%}
38 {{ emoji_link("audio", video_id, False) }}
39 {{ emoji_link("raw", video_id, False) }}
40 {{ emoji_link("json", video_id, False) }}
41 </div></details>
42 {% endcall %}
43 {%- endmacro %}
44
45 {% macro typed_card(params) -%}
46 {% set c = params.content %}
47 {% if params.type == 'VIDEO' %}
48 {% set pinned = c.pinned if c.pinned is defined else "undefined" %}
49 {% set badge = 'LIVE' if c.live else c.length %}
50 {% call card(c.video_id, c.title, c.published, pinned=pinned, badge=badge, list=c.playlist_id) %}
51 {{ infobar_subscriptions(c.video_id, c.channel_id, c.author) }}
52 {% endcall %}
53 {% elif params.type == 'CHANNEL' %}
54 {% call card_generic("/channel/"~c.channel_id~"/", c.icons[c.icons.largest] if 'icons' in c else '', c.title) %}
55 <span class=channel>Channel</span>
56 <span class=advanced>{{ c.subscribers }}</span>
57 {% endcall %}
58 {% elif params.type == 'PLAYLIST' %}
59 {% call card_generic("/playlist?list="~c.playlist_id, "https://i.ytimg.com/vi/"~c.video_id~"/mqdefault.jpg", c.title) %}
60 <span class=channel>{{ infobar_subscriptions(None, c.channel_id, c.author) }}</span>
61 <span class=advanced>{{ c.n_videos }} videos</span>
62 {% endcall %}
63 {% elif params.type == 'WEBSITE' %}
64 {% call card_generic(c.url, c.icons[c.icons.largest] if 'icons' in c else '', c.title) %}
65 <span class=channel>{{ c.domain }}</span>
66 {% endcall %}
67 {% endif %}
68 {%- endmacro %}
69
70 {% macro dummycard() -%}
71 {% for _ in range(4) %}
72 <div class="dummy card"></div>
73 {% endfor %}
74 {%- endmacro %}
75
76 {# TODO: remove video_id parameter (unused) #}
77 {% macro infobar_subscriptions(video_id, channel_id, author) -%}
78 {% if channel_id is defined and channel_id is not none %}
79 <a class="info-main" href="/channel/{{ channel_id }}/">{{ author | e }}</a>
80 {% else %}
81 <span class="info-main">{{ author | e }}</span>
82 {% endif %}
83 {%- endmacro %}
84
85 {% macro emoji_button(action, subject, reverse=False, text=False) -%}
86 {% set icons = {
87 'pin': ['&#x1f4cc;&#xFE0F;', '&#x1f4cc;&#xFE0F;&#8416;'],
88 'hide': ['&#x1f4a8;&#xFE0F;', ''],
89 'subscribe': ['&#128221;&#xFE0F;', '&#128465;&#xFE0F;'],
90 } %}
91 {% set texts = {
92 'pin': ['pin to subscription feed', 'unpin'],
93 'hide': ['hide video', ''],
94 'subscribe': ['subscribe', 'unsubscribe'],
95 } %}
96 {% set actions = {
97 'pin': 'youtube.feed_post',
98 'hide': 'youtube.feed_post',
99 'subscribe': 'youtube.manage_subscriptions',
100 } %}
101 <form method=post action="{{ url_for(actions[action]) }}" class="emoji-form">
102 <input type="hidden" name="{{ 'un' if reverse }}{{ action }}" value="{{ subject }}">
103 <label title="{{ texts[action][reverse] }}">
104 <input type="submit" hidden>
105 <span class="emoji">{{ icons[action][reverse] }}</span>{#
106 #}<span class="notemoji">{{ texts[action][reverse] if text }}</span>
107 </label>
108 </form>
109 {%- endmacro %}
110 {% macro emoji_link(action, subject, text=False) -%}
111 {% set icons = {
112 'raw': '&#x1F39E;&#xFE0F;',
113 'json': '&#x1f4a1;',
114 'meta': '&#x1F4DC',
115 'audio': '&#x1f3a7;',
116 'comments': '&#x1f4ac;',
117 'iv': '&#x1F53C;',
118 'yt': '&#x25B6;&#xFE0F;',
119 } %}
120 {% set texts = {
121 'raw': 'show raw video',
122 'json': 'view json metadata',
123 'meta': 'view additional metadata',
124 'audio': 'listen to audio only',
125 'comments': 'view comments',
126 'iv': 'watch on invidious',
127 'yt': 'youtu.be',
128 } %}
129 {% set actions = {
130 'raw': '/watch?v='~subject~'&show=raw',
131 'json': '/watch?v='~subject~'&show=json',
132 'meta': '/watch?v='~subject~'&show=meta',
133 'audio': '/watch?v='~subject~'&show=audio',
134 'comments': 'https://old.reddit.com'~subject,
135 'iv': 'https://redirect.invidious.io/watch?v='~subject,
136 'yt': 'https://youtu.be/'~subject,
137 } %}
138 <a href="{{ actions[action] }}" title="{{ texts[action] }}">{#
139 #}<span class="emoji">{{ icons[action] }}</span>{#
140 #}<span class="notemoji">{{ texts[action] if text }}</span>
141 </a>
142 {%- endmacro %}
143
144 {% macro more(fields) -%}
145 {% set request_args = dict(request.args) %}
146 {% set _nil = request_args.update(fields) %}
147 {% set new_qs = request_args|urlencode %}
148 <a href="?{{ new_qs }}" class="pagination next">more</a>
149 {%- endmacro %}
Imprint / Impressum