aboutsummaryrefslogtreecommitdiff
path: root/TODO
blob: fa6e76044c98c5954e73b810f96734b7709be6d1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
Somehow deal with youtube banning ip when searching too often.
When continuing to read manga from a different page from the first and there is no cache for the chapter, then start downloading from the current page instead of page 1.
Show progress of manga in the history tab (current chapter out of total chapters).
Animate page navigation.
Add support for special formatting for posts by admins on imageboards.
For image boards, track (You)'s and show notification when somebody replies to your post.
Make code blocks on matrix and 4chan have a background of a different color.
Allow deleting watch history with delete key (and show confirmation).
Add navigation to nyaa.si submitter torrents.
Create a large texture and add downloaded images to it. This will save memory usage because sfml has to use power of two textures (and so does opengl internally) for textures, so if you have multiple textures they will use more memory than one large texture with the same texture data.
Use fallback cjk font for regular mgl::Text as well (search, tabs, chapter name when viewing a page, path in file-manager, etc). That should also result in better performance on pinephone.
Fix some japanese characters not rendering (half width alphanumeric?).
Extract thumbnail from images that are being downloaded, while its downloading and show that while the full image is downloading (upscaled, or with blurhash).
Add setting to disable sending typing events to the server (matrix).
Take code from dchat to support gifs (inline in text) and support animated webp (either animated or as a static thumbnail).
Scrolling in images still messes up the |current| page sometimes, need a way to fix this.
Show filename at the bottom when viewing an image/video on 4chan.
Use https://github.com/simdjson/simdjson as a json library in other parts than matrix.
Sanitize check: do not allow pasting more than 2gb of text.
Add autocomplete for matrix commands.
Add option to disable autosearch and search when pressing enter instead or something? this would be needed for mobile phones where typing is slow. Or mobile should have longer timeout for all searches.
Render view to a rendertexture and render that instead of redrawing every time every time.
Provide a way to specify when notifications should be received (using matrix api) and also read the notification config from matrix. Also provide a way to disable notifications globally.
Use quickmedia to show image in matrix rooms, instead of mpv.
Add command to ban users.
Support peertube (works with mpv, but need to implement search and related videos).
Add a tab for common directories and recently accessed files/directories (the directories would be the directory of used files).
Provide a way to go to the first unread message in matrix and also show a marker in the body (maybe a red line?) where the first unread message is.
Cleanup keybindings. Some require ctrl, some dont.
Set the icon of the window to be the icon of the plugin. Nice for KDE, GNOME, etc with titlebars.
If --no-audio is used then music should be played with a lightweight music player instead. MPV is heavy even for music (60mb RAM). Maybe use sfml audio functions?
Update 4chan thread in real time, just like 4chan-x.
Add url preview for matrix (using matrix api, fallback to client url preview (using our own url preview project) if disabled by the homeserver).
IMPORTANT: Cleanup old messages in matrix (from matrix plugin), and instead either save them to disk or refetch them from server when going up to read old messages. (High memory usage, high disk space)
Do not try to reload/redownload thumbnail that fails to download after its cleared when its no longer visible on screen and then becomes visible.
Show google recaptcha on youtube when search/play fails, which can happen when using tor. Also required for readm (which was removed because of that).
Show notifications when we receive a message in a matrix room even if we are not mentioned. This happens when we have set to receive notifications for all messages.
If there are multiple users with the same name in a matrix room, then display the user id beside the displayname.
Show 4chan warnings as warnings instead of ban when posting a message (show the warning message) and then post the message.
Add tabs. Using tabs with tabbed is not as good of a solution as it would use much more memory (opengl context cost) and with our own tabs, we can clear thumbnails and other cache when a tab is in the background. Changing tab either with ctrl+tab or mouse click. ctrl+enter to open a new tab. Ctrl+q or ctrl+w to close a tab.
Remove related videos that have already been watched (except the first related video, which is the "watch next" video, usually the next part of a serie).
Add F5 to refresh page.
Allow choosing which translation/scanlation to use on mangadex. Right now it uses the latest one, which is most likely to be the best.
Retry download if it fails.
Modify sfml to use GL_COMPRESSED_LUMINANCE and other texture compression modes (in mgl::Texture). This reduces memory usage by half.
Decrease memory usage even further (mostly in matrix /sync when part of large rooms) by using rapidjson SAX style API to stream json string into SAX style parsing.
Sometimes we fail to get images in mangadex, most common reason being that the manga is licensed and we can't view the manga on mangadex. QuickMedia should implement mangaplus and redirect us to mangaplus plugin to view the manga, or simply show that we cant view the manga because its licensed.
Show redacted messages even when part of the initial sync in matrix. Right now they are hidden while new sync redacted messages are not.
  to fix this we could perhaps replace the newly created body items for replies when loading old messages and one of the old messages is also one of the embedded messages (by event id).
Add button to skip to next video. MPV has this feature when setting "next" video (can be done over IPC).
Use a custom allocator that replaces malloc/realloc/free/new/delete to release memory properly, using munmap in free/delete. The C allocator doesn't do that! memory usage remains high after one large allocation. The C allocator only marks it as free.
Merge |Page::search| and |Page::get_page|. get_page with page 0 should be the same as search.
Disable posting in 4chan thread if closed (thread json contains "closed" field for OP).
Read image exif into to apply image rotation. This is common in images taken on phones. If not done, the width and height will also be mixed and thumbnail fallback size will be incorrectly calculated (for example in matrix).
Handle M_LIMIT_EXCEEDED in matrix
Maybe dont clear cache for body items when filtering.
Pressing enter on a pinned message should go to the message in the messages tab.
Display file list for nyaa.
Implement our own encryption for matrix. This is also needed to make forwarded message work. Pantalaimon ignores them!
Modify matrix sync to download and parse json but not handle it, and then add a function to handle the json. This would allow us to remove all the mutex code if we would call that new method from the main thread.
Fetch replies/pinned message using multiple threads.
Show in room tags list when there is a message in any of the rooms in the tag.
Show images while they download by showing them as scanlines starting from the top. Needed for slow websites such as 4chan.
Add functionality to ignore users in matrix. This is done with an ignore request and we wont get messages and invites from that user anymore. Also add option to ignore in the invites page.
Add keybind to go to invites page from any page.
Show marker beside pinned messages tab name if there are new pinned messages.
Make /logout work everywhere, not only in room message input.
Disable message input in matrix when muted.
Preview rooms?
Handle matrix token being invalidated while running.
Update upload limit if its updated on the server.
Implement m.room.tombstone.
Show a marker when a room uses encryption.
Scroll tabs if there are more than 3 tab items and show arrow on left/right side when there are more items to see.
Make a shader for Text for changing color instead of updating the text geometry. Or loop vertices and set their color to the new color without updating the text geometry.
Automatically retry sending messages that fails to send (after timeout). These failed to send messages should be stored on disk and retried when going back to the room or restarting QuickMedia.
Also make message deletion provisional (make it gray while its deleting the message).
Continue matrix requests when switching room, instead of resetting them when going from chat page to room list page (such as post message request).
Improve /sync by not removing cached data on initial sync, and also always append data to sync file instead of overwriting sync file on "initial sync". Also cache "since", but take into consideration that not all messages are fetched on the initial sync,
then add a gap between old messages from before sync and after sync so we can fetch the messages between the old messages and new messages and remove the gap when the fetched messages contains any of the old messages. After the sync, ignored users messages should be removed from the cache and messages list. Also take into consideration unignoring users.
Fetching of previous messages should also be saved in the /sync file and messages fetched with get_message_by_id, which would cache embedded items and pinned messages; also cache users.
If manga page fails to download then show "failed to download image" as text and bind F5 to refresh (retry download).
Create multiple BodyItem types. BodyItem has a lot of fields and most of them are not always used.
Remove display names from reactions if there are many reactions, and instead group them into: reaction (#number of this type of reaction); for example: 👍 2.
Make reaction and deleted message provisional.
Allow removing reactions.
When fetching previous messages in matrix, fetching until there are 0 messages or until there is at least 1 visible item. This is needed because right now we could fetch 10 messages, all which are delete/edit/react and it will look like there are no more messages to fetch to the user.
QuickMedia crashes if you enter a room that you have left before. This could happen if cache is loaded that has a room that is then getting removed when sync is finished.
Limit size of Entry and scroll content instead.
Implement matrix spoiler, see: https://github.com/matrix-org/matrix-doc/blob/master/proposals/2010-spoilers.md.
Create a workaround for dwm terminal swallow patch stealing mpv when moving QuickMedia to another monitor sometimes. Maybe check for structure notify events on mpv and reparent and select input on the mpv window again?
Add option to decline and mute user in invites. This is to combat invite spam, where muted users cant invite you.
Add an option to select video resolution, if we want to use less power and less bandwidth for example.
Check what happens with xsrf_token if comments are not fetched for a long time. Does it time out? if so do we need to refetch the video page to get the new token?.
Add support for comments in live youtube videos, api is at: https://www.youtube.com/youtubei/v1/live_chat/get_live_chat?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8.
Make video visible when reading comments (youtube).
When ui is scaled then the predicted thumbnail size will be wrong since its scaled in Body but not in the plugins where they are requested.
Check if get_page handlers in pages need to check if next batch is valid. If the server returns empty next batch we shouldn't fetch the first page...
Cloudflare kicks in when downloading manga on manganelo.. figure out a way to bypass it. This doesn't seem to happen when using python requests as is done in AutoMedia.
Replace cppcodec with another library for base64 url encoding/decoding. Its way too large for what it does.
Revert back to old fuzzy search code or use levenshtein distance, then reorder items by best match. This could be done by having a second vector of indices and use that vector everywhere body items by index is accessed (including selected_item). Also perform the search in Body::draw when search term has been modified. This allows us to automatically update that new vector.
Update subscriptions page either with f5 and automatically update it when adding/removing subscriptions.
Support webp directly without using ffmpeg to convert it to a png.
Add client side 4chan file size limit (note, webm has different limit than images).
Add client side 4chan max comment chars limit.
Dynamically fetch 4chan api key, if it ever changes in the future. Same for youtube.
Set curl download limits everywhere (when saving to file, downloading to json, etc...).
In the downloader if we already have the url in thumbnail/video cache, then copy it to the destination instead of redownloading it. This would also fix downloading images when viewing a manga page.
When sfml dependency is removed use libvips for image manipulation. Its a very fast library, especially for thumbnail creation.
Readd copying of Text in Body copy constructor. Find out why we need to make the text dirty on copy.
Body items that are no longer visible should stop their thumbnail download.
Make body width the same as the window width (for the main body when there isn't a room list beside it) and pass margin to body draw. This is needed to allow swiping body from the window (screen) edge.
Restrict sf::View viewport in Body to x axis as well, to hide the body in the end when swiping right.
Ctrl+F to either bring up search that searches in the body (filtering, of searching for all messages in the room in matrix) or does an autocomplete search. For youtube that would be a google autocomplete search.
  The autocomplete search menu should overlay the window (with translucent black overlay) and with the search bar in the middle and autocomplete results below.
  Or do not have such an overlay and instead just put the autocomplete list below the search bar and close the autocomplete when pressing ESC or clicking inside the body or moving to another tab.
Automatically delete old thumbnails and media files.
Ctrl+I for youtube comments that have a timestamp should have an option to jump to the timestamp in the video. Also do the same for the youtube video description.
Add a keybinding for going to the front page of the plugin. This would be especially useful for youtube and manga, where you have history, subscriptions and recommendations.
Reaching end of download menu filename entry should scroll the entry vertically instead of putting the text on multiple lines.
Ctrl+S saving a video should copy the video from cache if the video was downloaded to cache, instead of downloading it again.
When synapse adds support for media download http request range then quickmedia should download the last 4096 bytes of mp4 files and move the moov atom and co64 atoms (and others) to the front of the file before mdat, similar to how qt-faststart does it. This is needed for video streaming certain mp4 files.
Ctrl+S when a body item is selected on youtube/xxxplugins should show an option to download the video, instead of having to press ctrl+s after the video is playing.
Show a subscribe button for channels, which should be red and say "subscribe" if we are not subscribed and it should be gray and say "unsubscribe" if we already are subscribed.
Display youtube playlists differently and support downloading the whole playlist at once.
Support 4chan archive.
Use old method of rendering body where rendering items is done up and down, starting from the selected item. This will make quickmedia run as fast when displaying 100 000 items as when displaying 10 items.
Use correct spacing when in grid (card) mode. Should be row spacing instead of body spacing.
Instead of selecting the first/last item when reaching the top/bottom, keep the selected column and instead scroll the body so the first/last item is visible.
Kill async image downloader thread when the item with the image is no longer visible on the screen.
Embedding elements in rich text: first byte should be an invalid utf8 character and the next 3 bytes should be an index into a vector with the element data. This forms 1 utf32 character.
Do not set fps to monitor hz if no key is pressed and cursor is not moving (for example when the computer is sleeping). (Maybe just detect if any sfml event is received), but maybe that wouldn't work with accelerometer.
Ctrl+arrow key to move to previous/next video.
Add keybinding to view file-manager images in fullscreen to preview them. Also add keybinding to create/delete directories.
Reload youtube video url if the video is idle for too long. The video url is only valid for a specific amount of time (the valid duration is in the json).
Improve live stream startup time by downloading the video formats in parts instead of the hls/dash manifest? (use YoutubeLiveStreamMediaProxy).
Loading image background should be rounded.
Better deal with reading from file errors. This could happen when reading a file while its being modified. See read_file_as_json.
Allow ctrl+r for video when the video is loading.
Dynamically change youtube video quality by modifying the itags (and other params?) if download is buffering or if the video is lagging.
PgUp/PgDown shouldn't move body by the number of visible items. It should instead move by the height of the body.
Add option to view dead link in 4chan with 4chan archive and navigate to crossboard links.
Show latest message before sync is done for a room when the latest message is an edit. Right now it has to fetch previous messages until the first non-edit message.
Allow resuming downloads.
Support downloading live youtube videos.
Use the new player innertube api. To make that work quickmedia will need to extract signatureTimestamp (sts) and set that in the form request. Youtube-dl does this.
Instead of resetting text items in body, add a clear function to text. That way we can easily cache the height of the text.
Check if message edits that are replies to me makes a now notification show up. This shouldn't happen, but also take into consideration initial sync.
Check if user has invite privileges and show error before bringing up invite gui when using /invite.
If only users in the same homeserver can join a room then filter out other users in room invite gui.
Exclude users that are already in the room from room invite gui.
Sort users in matrix users list (efficiently and only once!).
Optimize matrix insert position for room sorting (and user sorting).
Cache solved 4chan captcha solution (and challenge id) on disk. ttl is (always?) 120 seconds so restarting quickmedia under that period should use the already solved captcha.
Posting on bant doesn't work for some reason. The request is sent successfully but the comment never appears on the website.
4chan_pass cookie is needed to get captcha without slider. How to get this without an account? 4chan website sets this for anon too.
Handle replaces_state in matrix to get correct order for states?
Handle users_default power level in matrix.
Synapse is gay and mentions do not actually include the whole mxid. It only includes the username part of it. This conflicts with quickmedia notification and mentions where quickmedia includes the mxid in the mention instead,
  while the user might have disable username mentions. In those cases the user wont get a notification for mxid mention. Mention name instead?
Make it possible to redact invites.
Reapply filter when changing body item text.
When fetching previous messages in matrix, ignore user info updates.
Use event timestamp to sort all matrix events.
Try to reconnect media proxy on disconnect. The internet may be unstable (for example on mobile internet).
Opening a media url should display it directly in quickmedia.
Automatically resize body item thumbnail if body is small, or move thumbnail above the text.
Support &nbsp?.
Add option to navigate studios/producers/author in AniList.
Show who deleted a message in matrix.
Sync should replace all messages in the room (except for the selected room?) to reduce ram usage when in many rooms and when quickmedia has been running for a long time doing sync.
Show youtube annotations.
Show indicator in body item if it has been bookmarked (to prevent accidental removal of an item that has already been bookmarked before).
Add option to bookmark peertube instance.
Add ctrl+r menus for peertube.
Add audio-only mode for peertube (without also downloading video).
Add option to play peertube video directly from url, along with timestamp. Should also work for playlists.
Peertube urls should play directly in quickmedia.
Test peertube with live streams.
Peertube hls streams can be really slow to start up (especially for videos.autizmo.xyz). This is an issue in ffmpeg. Maybe use youtube proxy downloader for this? those videos are fragmented.
Add keybindings for image control for 4chan.
Fix youtube videos that are age restricted AND do not allow embedding. Is that even possible?
Use local lbry instead of odysee when I figure out the incorrect instructions of to use lighthouse locally.
ffmpeg (and mpv) is very slow at playing streams (mostly affects lbry and certain peertube videos) for some reason.
Allow specifying start/end range for video/music downloads.
Limit text input length for 4chan posts to the server limit.
Allow creating a new thread on 4chan.
Support downloading soundcloud/youtube playlists. Such downloads should also have a different download gui as you would select a folder instead of an output file.
Support downloading .m3u8 files, such as soundcloud music without using youtube-dl.
Fix lbry and peertube download which fail because for lbry all videos are .m3u8 and some peertube videos are .m3u8.
Improve pinephone video load performance by not restarting mpv on next video. Instead start the video in the same video player.
Very large resolutions, such as 7680x2160 (id 272) for video https://www.youtube.com/watch?v=GxaH40zpvYc are not supported by the youtube android video loader. Find a way to fix that.
Use std::move(string) for all places where text.set_string is called.
Use reference for text.get_string() in all places.
Cleanup font sizes that are not visible (or not used for a while). Also do the same for character ranges font texture.
Show video upload date in video description on youtube.
Add latest read chapter name to manga progress, to easily see from manga list page how we have progressed in the manga.
Allow changing manga sorting in gui (especially for local manga).
Save manga "I" mode to file and load it on startup.
Show in bookmarks and history page if a manga has been read (local-manga).
Add "finished reading" to online manga as well, for the manga sites that publish latest chapter in the search page.
Async load visible body item content. This is needed for local-manga if the manga is stored on NFS where recursively reading all manga directories is slow. We only want to read recursively for the manga that is visible on the screen.
Allow using ~/.config/mpv/input.conf when using use_system_mpv_config by merging QuickMedia's input.conf and the users input.conf and creating a temporary file in /tmp and load that. But make sure configs dont clash. Or use --include.
Allow asynchronously loading body items. This is needed in manga combined plugin.
Add ctrl+o keybind to open the selected media in an external application (video, imageviewer, music player should be configured in the config.json file). Open other files or youtube links in a browser when using this keybind.
Local anime bookmark.
Local anime history.
Replace youtube subscriptions page (rss) with youtube api. This allows us to get get video status for videos (and description).
Add watch progress to lbry and peertube.
Ctrl+R set chapter to finished reading in chapters page.
Zero clear password memory after use.
Periodically cleanup old cache files (especially manga images, thumbnails and media). Maybe have a file that says when we last checked for old files,
  and if its X days old then check and remove old files again and update the file.
Render watch progress in youtube.
Set _NET_WM_USER_TIME (see sfml).
Make saucenao work with encrypted images in matrix, or show an error as this is a "security" risk.
Body image cache (async image loader) should take requested size into consideration, because the same image can be requested at multiple sizes and we dont want to cache the smaller sized image for both.
To make quickmedia more resilient against broken youtube videos, quickmedia should try other quality if video/audio fails to play. Also do that if the download is stuck/slow for the current quality.
Make youtube work with age restricted copy righted videos, such as https://www.youtube.com/watch?v=7n3dP_1KqBw. Age restricted videos also play slowly because they have url part that needs to be decoded.
Upload media once in 4chan, on comment enter and then re-use that after solving captcha; instead of reuploading video after each captcha retry. If possible...
Support migration from one manga service to another, automatically by selecting the manga to migrate from which service (or select all). Also do that in automedia. Give error if it's not possible to do automatically and show option to manually select the matching manga/chapter. Quickmedia should also be able to automatically migrate automedia in the same process or a separate option.
Instead of having an option to disable rounded corners, add an option to set corner radius where radius=0 means disabling the shader.
Consider adding an option to use external sxiv, imv etc instead of mpv/quickmedia image viewer.
Fallback to playing videos/etc from origin homeserver in matrix if the file is larger than the users homeserver allows. This wont work with pantalaimon + encrypted rooms, so it should be delayed until quickmedia supports matrix encryption.
Fix 4chan posting! cloudflare broke shit. Then create external captcha solver program that solves captcha from captcha image.
Add option to use invidious/piped, and the invidious/piped front page.
Add proper vim modal mode. Maybe switch focused part with tab? then also need to show which part is focused.
Send clipboard content to clipboard manager when destroying the window, if we are the clipboard owner.
Bypass compositor when fullscreening application.
Automatically cleanup old cache files.
Download manga pages in parallel. This helps downloading for certain websites such as mangakatana where a single page can take more than 2 seconds but loading 5 at once allows each page to load in 0.4 seconds.
Allow pasting a file link (with or without file://) directly into matrix chat to upload a file (if the chat input is empty). This allows replying-with-media to work with ctrl+v.
The formatting of replying to a message with an image in matrix is a bit weird. The reply image should be below the replied to message instead of on the left side.
Add ctrl+h to go back to the front page or show a manual.
Async load textures (not just images). This can be done efficiently by using different opengl contexts in different threads and making the context current right before a heavy opengl operation. All threads need to set their opengl context often.
Downloading files should take into account the remove mime type if available. Fallback to file extension.
Text images atlas or vertex buffer with multiple active textures (grouped into 32 images to not go over active texture limit).
Do not render invalid unicode.
Use matrix "from" with proper cache.
Text editing should take into consideration FORMATTED_TEXT_START/FORMATTED_TEXT_END.
4chan code syntax highlight. 4chan doesn't say what language it is so we have to somehow guess the language.
Matrix autocomplete for emoji (and custom emoji) and option show different sizes (for custom emoji).
Nicer custom emoji upload options - Selecting name, size, cropping.
Add option to copy somebody else custom emoji in matrix by pressing enter to bring up message option and in that a list of every emoji in the message should be added with "Add (emoji)..." text to add the emoji.
Detect invidious urls too, even the ones that dont have watch?v=.. this could be done by downloading the webpage (maybe only HEAD?) to check if it's invidious.
Atomic file operations should use a random generated name instead of .tmp, because multiple instances of quickmedia may be running and they may try to write to the same file at the same time. In such cases they can also write to the same temporary file at the same time.
TODO: https://github.com/matrix-org/synapse/issues/14444.
Use matrix /sync "since" param. Its beneficial even to quickmedia because synapse is written in such a way that using "since" is faster.
/encrypt should support formatted text like greentext, custom emoji, mentions etc.
allow navigating to cross-post/dead thread with ctrl+i, fallback to 4chan archive if thread is dead, allow navigating to thread post in the same thread as well using archive to bring the post back alive, revive deleted images using archive.
Add option to open youtube/4chan links in a new instance of quickmedia (maybe with ctrl+enter?).
AAAAA Resizing 4chan post with no images but with replies (reactions) gives incorrect body item height compared to the rendered height.
Some mangadex chapter images are .webp files, such as the images for chapter 0 for "the lolicon killer". Quickmedia doesn't work for that because quickmedia doesn't support manga webp files. Fix that.
Fully support all emoji, including the minimally-qualified ones. Sometimes twemoji doesn't have the correct sequence images.
@room in rooms do not currently work (for show as notifications in quickmedia matrix). This is because quickmedia matrix doesn't fetch power level states and doesn't parse them. Quickmedia has code to parse room events power levels but it doesn't actually fetch the data so that part is never used.
Support NicoNicoDouga and BiliBili (user request).
Support arabic/hebrew text. Use Text class for all text rendering.
Add command to change avatar/username/etc globally/per room in matrix.
Fix youtube information page missing info, show more youtube info in search results.
Implement m.room.canonical_alias.
Sometimes youtube videos get throttled and reloading the video fixes it most of the time. Find a way to do that automatically. Or maybe decrypt the nsig when using the new endpoint.