Compare commits

...
Author SHA1 Message Date
Jonah Brüchert 49ec0b1681 Show mini progress bar when there is no space for the full one 2022-05-23 17:58:53 +02:00
Jonah Brüchert 2e68ec0880 Remove remove action from most viewed 2022-05-23 17:31:21 +02:00
Jonah Brüchert c7b22b348e asyncdatabase: Use concepts to define the interface of types that can be deserialized from SQL 2022-05-23 16:12:25 +02:00
Devin Lin f4c8172201 Revamp media player UI
Reworks the media player UI for mobile devices. Adds a swipe gesture to open the media player, and reworks the UI to be more... *hip?*

TODO: haven't implemented a "previous song" feature, is that possible?

![image](/uploads/d329da0ea548eed466227ef39f25301f/image.png)

![image](/uploads/7b3cf83204a1df13b5b166d24d0c2a91/image.png)

![image](/uploads/74c641c544a130eb5e692fb1ae733e37/image.png)
2022-05-23 12:36:35 +00:00
Jonah Brüchert 9fa7757efd Make database query result deserialization more automatic 2022-05-23 13:24:07 +02:00
l10n daemon script fc2c359bd7 GIT_SILENT Sync po/docbooks with svn 2022-05-23 01:49:32 +00:00
41 changed files with 1629 additions and 552 deletions

No files matched your search

+19 -9
View File
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: audiotube\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2021-12-05 00:45+0000\n"
"POT-Creation-Date: 2022-05-23 00:47+0000\n"
"PO-Revision-Date: 2022-01-21 22:52+0400\n"
"Last-Translator: Zayed Al-Saidi <[email protected]>\n"
"Language-Team: ar\n"
@@ -28,7 +28,7 @@ msgctxt "EMAIL OF TRANSLATORS"
msgid "Your emails"
msgstr "[email protected]"
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:173
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:192
#: contents/ui/PlaylistPage.qml:19
#, kde-format
msgid "Play"
@@ -83,37 +83,47 @@ msgstr "حسنًا"
msgid "Cancel"
msgstr "ألغِ"
#: contents/ui/main.qml:51
#: contents/ui/LibraryPage.qml:15
#, kde-format
msgid "Favourites"
msgstr ""
#: contents/ui/LibraryPage.qml:67
#, kde-format
msgid "Most played"
msgstr ""
#: contents/ui/main.qml:94
#, kde-format
msgid "AudioTube"
msgstr "تيوب الصوتي"
#: contents/ui/PlayerFooter.qml:106
#: contents/ui/PlayerFooter.qml:124
#, kde-format
msgid "Remove Track"
msgstr "أزل المسار"
#: contents/ui/PlayerFooter.qml:123
#: contents/ui/PlayerFooter.qml:141
#, kde-format
msgid "Clear"
msgstr "امسح"
#: contents/ui/PlayerFooter.qml:128 contents/ui/PlaylistPage.qml:26
#: contents/ui/PlayerFooter.qml:146 contents/ui/PlaylistPage.qml:26
#, kde-format
msgid "Shuffle"
msgstr "اخلط"
#: contents/ui/PlayerFooter.qml:173
#: contents/ui/PlayerFooter.qml:192
#, kde-format
msgid "Pause"
msgstr "ألبث"
#: contents/ui/PlayerFooter.qml:203
#: contents/ui/PlayerFooter.qml:222
#, kde-format
msgid "No media playing"
msgstr "لا يوجد وسائط تعمل"
#: contents/ui/PlayerFooter.qml:247
#: contents/ui/PlayerFooter.qml:266
#, kde-format
msgid "Expand"
msgstr "وسع"
+19 -9
View File
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: audiotube\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2021-12-05 00:45+0000\n"
"POT-Creation-Date: 2022-05-23 00:47+0000\n"
"PO-Revision-Date: 2022-04-22 18:44+0400\n"
"Last-Translator: Kheyyam Gojayev <[email protected]>\n"
"Language-Team: Azerbaijani <[email protected]>\n"
@@ -27,7 +27,7 @@ msgctxt "EMAIL OF TRANSLATORS"
msgid "Your emails"
msgstr "[email protected]"
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:173
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:192
#: contents/ui/PlaylistPage.qml:19
#, kde-format
msgid "Play"
@@ -84,37 +84,47 @@ msgstr "OLDU"
msgid "Cancel"
msgstr "İmtina"
#: contents/ui/main.qml:51
#: contents/ui/LibraryPage.qml:15
#, kde-format
msgid "Favourites"
msgstr ""
#: contents/ui/LibraryPage.qml:67
#, kde-format
msgid "Most played"
msgstr ""
#: contents/ui/main.qml:94
#, kde-format
msgid "AudioTube"
msgstr "AudioTube"
#: contents/ui/PlayerFooter.qml:106
#: contents/ui/PlayerFooter.qml:124
#, kde-format
msgid "Remove Track"
msgstr "Mahnını silin"
#: contents/ui/PlayerFooter.qml:123
#: contents/ui/PlayerFooter.qml:141
#, kde-format
msgid "Clear"
msgstr "Təmizləyin"
#: contents/ui/PlayerFooter.qml:128 contents/ui/PlaylistPage.qml:26
#: contents/ui/PlayerFooter.qml:146 contents/ui/PlaylistPage.qml:26
#, kde-format
msgid "Shuffle"
msgstr "Qarışıq"
#: contents/ui/PlayerFooter.qml:173
#: contents/ui/PlayerFooter.qml:192
#, kde-format
msgid "Pause"
msgstr "Fasilə"
#: contents/ui/PlayerFooter.qml:203
#: contents/ui/PlayerFooter.qml:222
#, kde-format
msgid "No media playing"
msgstr "Media faylı oynadılmır"
#: contents/ui/PlayerFooter.qml:247
#: contents/ui/PlayerFooter.qml:266
#, kde-format
msgid "Expand"
msgstr "Açmaq"
+19 -9
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: audiotube\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2021-12-05 00:45+0000\n"
"POT-Creation-Date: 2022-05-23 00:47+0000\n"
"PO-Revision-Date: 2021-12-05 16:03+0100\n"
"Last-Translator: Antoni Bella Pérez <[email protected]>\n"
"Language-Team: Catalan <[email protected]>\n"
@@ -29,7 +29,7 @@ msgctxt "EMAIL OF TRANSLATORS"
msgid "Your emails"
msgstr "[email protected]"
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:173
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:192
#: contents/ui/PlaylistPage.qml:19
#, kde-format
msgid "Play"
@@ -86,37 +86,47 @@ msgstr "D'acord"
msgid "Cancel"
msgstr "Cancel·la"
#: contents/ui/main.qml:51
#: contents/ui/LibraryPage.qml:15
#, kde-format
msgid "Favourites"
msgstr ""
#: contents/ui/LibraryPage.qml:67
#, kde-format
msgid "Most played"
msgstr ""
#: contents/ui/main.qml:94
#, kde-format
msgid "AudioTube"
msgstr "AudioTube"
#: contents/ui/PlayerFooter.qml:106
#: contents/ui/PlayerFooter.qml:124
#, kde-format
msgid "Remove Track"
msgstr "Elimina la pista"
#: contents/ui/PlayerFooter.qml:123
#: contents/ui/PlayerFooter.qml:141
#, kde-format
msgid "Clear"
msgstr "Neteja"
#: contents/ui/PlayerFooter.qml:128 contents/ui/PlaylistPage.qml:26
#: contents/ui/PlayerFooter.qml:146 contents/ui/PlaylistPage.qml:26
#, kde-format
msgid "Shuffle"
msgstr "Barreja"
#: contents/ui/PlayerFooter.qml:173
#: contents/ui/PlayerFooter.qml:192
#, kde-format
msgid "Pause"
msgstr "Pausa"
#: contents/ui/PlayerFooter.qml:203
#: contents/ui/PlayerFooter.qml:222
#, kde-format
msgid "No media playing"
msgstr "No s'està reproduint cap suport"
#: contents/ui/PlayerFooter.qml:247
#: contents/ui/PlayerFooter.qml:266
#, kde-format
msgid "Expand"
msgstr "Expandeix"
+19 -9
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: audiotube\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2021-12-05 00:45+0000\n"
"POT-Creation-Date: 2022-05-23 00:47+0000\n"
"PO-Revision-Date: 2021-12-05 16:03+0100\n"
"Last-Translator: Antoni Bella Pérez <[email protected]>\n"
"Language-Team: Catalan <[email protected]>\n"
@@ -29,7 +29,7 @@ msgctxt "EMAIL OF TRANSLATORS"
msgid "Your emails"
msgstr "[email protected]"
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:173
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:192
#: contents/ui/PlaylistPage.qml:19
#, kde-format
msgid "Play"
@@ -86,37 +86,47 @@ msgstr "D'acord"
msgid "Cancel"
msgstr "Cancel·la"
#: contents/ui/main.qml:51
#: contents/ui/LibraryPage.qml:15
#, kde-format
msgid "Favourites"
msgstr ""
#: contents/ui/LibraryPage.qml:67
#, kde-format
msgid "Most played"
msgstr ""
#: contents/ui/main.qml:94
#, kde-format
msgid "AudioTube"
msgstr "AudioTube"
#: contents/ui/PlayerFooter.qml:106
#: contents/ui/PlayerFooter.qml:124
#, kde-format
msgid "Remove Track"
msgstr "Elimina la pista"
#: contents/ui/PlayerFooter.qml:123
#: contents/ui/PlayerFooter.qml:141
#, kde-format
msgid "Clear"
msgstr "Neteja"
#: contents/ui/PlayerFooter.qml:128 contents/ui/PlaylistPage.qml:26
#: contents/ui/PlayerFooter.qml:146 contents/ui/PlaylistPage.qml:26
#, kde-format
msgid "Shuffle"
msgstr "Barreja"
#: contents/ui/PlayerFooter.qml:173
#: contents/ui/PlayerFooter.qml:192
#, kde-format
msgid "Pause"
msgstr "Pausa"
#: contents/ui/PlayerFooter.qml:203
#: contents/ui/PlayerFooter.qml:222
#, kde-format
msgid "No media playing"
msgstr "No s'està reproduint cap suport"
#: contents/ui/PlayerFooter.qml:247
#: contents/ui/PlayerFooter.qml:266
#, kde-format
msgid "Expand"
msgstr "Expandeix"
+19 -9
View File
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: audiotube\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2021-12-05 00:45+0000\n"
"POT-Creation-Date: 2022-05-23 00:47+0000\n"
"PO-Revision-Date: 2022-01-11 17:36+0100\n"
"Last-Translator: Vit Pelcak <[email protected]>\n"
"Language-Team: Czech <[email protected]>\n"
@@ -27,7 +27,7 @@ msgctxt "EMAIL OF TRANSLATORS"
msgid "Your emails"
msgstr "[email protected]"
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:173
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:192
#: contents/ui/PlaylistPage.qml:19
#, kde-format
msgid "Play"
@@ -84,37 +84,47 @@ msgstr "OK"
msgid "Cancel"
msgstr "Zrušit"
#: contents/ui/main.qml:51
#: contents/ui/LibraryPage.qml:15
#, kde-format
msgid "Favourites"
msgstr ""
#: contents/ui/LibraryPage.qml:67
#, kde-format
msgid "Most played"
msgstr ""
#: contents/ui/main.qml:94
#, kde-format
msgid "AudioTube"
msgstr "AudioTube"
#: contents/ui/PlayerFooter.qml:106
#: contents/ui/PlayerFooter.qml:124
#, kde-format
msgid "Remove Track"
msgstr "Odstranit skladbu"
#: contents/ui/PlayerFooter.qml:123
#: contents/ui/PlayerFooter.qml:141
#, kde-format
msgid "Clear"
msgstr "Vyprázdnit"
#: contents/ui/PlayerFooter.qml:128 contents/ui/PlaylistPage.qml:26
#: contents/ui/PlayerFooter.qml:146 contents/ui/PlaylistPage.qml:26
#, kde-format
msgid "Shuffle"
msgstr "Zamíchat"
#: contents/ui/PlayerFooter.qml:173
#: contents/ui/PlayerFooter.qml:192
#, kde-format
msgid "Pause"
msgstr "Pozastavit"
#: contents/ui/PlayerFooter.qml:203
#: contents/ui/PlayerFooter.qml:222
#, kde-format
msgid "No media playing"
msgstr "Nepřehrává se žádné médium"
#: contents/ui/PlayerFooter.qml:247
#: contents/ui/PlayerFooter.qml:266
#, kde-format
msgid "Expand"
msgstr "Rozvinout"
+19 -9
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: audiotube\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2021-12-05 00:45+0000\n"
"POT-Creation-Date: 2022-05-23 00:47+0000\n"
"PO-Revision-Date: 2022-02-20 10:37+0100\n"
"Last-Translator: Frederik Schwarzer <[email protected]>\n"
"Language-Team: German <[email protected]>\n"
@@ -28,7 +28,7 @@ msgctxt "EMAIL OF TRANSLATORS"
msgid "Your emails"
msgstr "[email protected]"
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:173
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:192
#: contents/ui/PlaylistPage.qml:19
#, kde-format
msgid "Play"
@@ -85,37 +85,47 @@ msgstr "OK"
msgid "Cancel"
msgstr "Abbrechen"
#: contents/ui/main.qml:51
#: contents/ui/LibraryPage.qml:15
#, kde-format
msgid "Favourites"
msgstr ""
#: contents/ui/LibraryPage.qml:67
#, kde-format
msgid "Most played"
msgstr ""
#: contents/ui/main.qml:94
#, kde-format
msgid "AudioTube"
msgstr "AudioTube"
#: contents/ui/PlayerFooter.qml:106
#: contents/ui/PlayerFooter.qml:124
#, kde-format
msgid "Remove Track"
msgstr "Stück entfernen"
#: contents/ui/PlayerFooter.qml:123
#: contents/ui/PlayerFooter.qml:141
#, kde-format
msgid "Clear"
msgstr "Löschen"
#: contents/ui/PlayerFooter.qml:128 contents/ui/PlaylistPage.qml:26
#: contents/ui/PlayerFooter.qml:146 contents/ui/PlaylistPage.qml:26
#, kde-format
msgid "Shuffle"
msgstr "Zufällig"
#: contents/ui/PlayerFooter.qml:173
#: contents/ui/PlayerFooter.qml:192
#, kde-format
msgid "Pause"
msgstr "Pause"
#: contents/ui/PlayerFooter.qml:203
#: contents/ui/PlayerFooter.qml:222
#, kde-format
msgid "No media playing"
msgstr "Es werden keine Medien wiedergegeben"
#: contents/ui/PlayerFooter.qml:247
#: contents/ui/PlayerFooter.qml:266
#, kde-format
msgid "Expand"
msgstr "Erweitern"
+19 -9
View File
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: audiotube\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2021-12-05 00:45+0000\n"
"POT-Creation-Date: 2022-05-23 00:47+0000\n"
"PO-Revision-Date: 2022-01-01 15:21+0000\n"
"Last-Translator: Steve Allewell <[email protected]>\n"
"Language-Team: British English <[email protected]>\n"
@@ -27,7 +27,7 @@ msgctxt "EMAIL OF TRANSLATORS"
msgid "Your emails"
msgstr "[email protected]"
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:173
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:192
#: contents/ui/PlaylistPage.qml:19
#, kde-format
msgid "Play"
@@ -84,37 +84,47 @@ msgstr "OK"
msgid "Cancel"
msgstr "Cancel"
#: contents/ui/main.qml:51
#: contents/ui/LibraryPage.qml:15
#, kde-format
msgid "Favourites"
msgstr ""
#: contents/ui/LibraryPage.qml:67
#, kde-format
msgid "Most played"
msgstr ""
#: contents/ui/main.qml:94
#, kde-format
msgid "AudioTube"
msgstr "AudioTube"
#: contents/ui/PlayerFooter.qml:106
#: contents/ui/PlayerFooter.qml:124
#, kde-format
msgid "Remove Track"
msgstr "Remove Track"
#: contents/ui/PlayerFooter.qml:123
#: contents/ui/PlayerFooter.qml:141
#, kde-format
msgid "Clear"
msgstr "Clear"
#: contents/ui/PlayerFooter.qml:128 contents/ui/PlaylistPage.qml:26
#: contents/ui/PlayerFooter.qml:146 contents/ui/PlaylistPage.qml:26
#, kde-format
msgid "Shuffle"
msgstr "Shuffle"
#: contents/ui/PlayerFooter.qml:173
#: contents/ui/PlayerFooter.qml:192
#, kde-format
msgid "Pause"
msgstr "Pause"
#: contents/ui/PlayerFooter.qml:203
#: contents/ui/PlayerFooter.qml:222
#, kde-format
msgid "No media playing"
msgstr "No media playing"
#: contents/ui/PlayerFooter.qml:247
#: contents/ui/PlayerFooter.qml:266
#, kde-format
msgid "Expand"
msgstr "Expand"
+19 -9
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: audiotube\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2021-12-05 00:45+0000\n"
"POT-Creation-Date: 2022-05-23 00:47+0000\n"
"PO-Revision-Date: 2021-12-06 00:36+0100\n"
"Last-Translator: Eloy Cuadra <[email protected]>\n"
"Language-Team: Spanish <[email protected]>\n"
@@ -29,7 +29,7 @@ msgctxt "EMAIL OF TRANSLATORS"
msgid "Your emails"
msgstr "[email protected]"
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:173
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:192
#: contents/ui/PlaylistPage.qml:19
#, kde-format
msgid "Play"
@@ -86,37 +86,47 @@ msgstr "Aceptar"
msgid "Cancel"
msgstr "Cancelar"
#: contents/ui/main.qml:51
#: contents/ui/LibraryPage.qml:15
#, kde-format
msgid "Favourites"
msgstr ""
#: contents/ui/LibraryPage.qml:67
#, kde-format
msgid "Most played"
msgstr ""
#: contents/ui/main.qml:94
#, kde-format
msgid "AudioTube"
msgstr "AudioTube"
#: contents/ui/PlayerFooter.qml:106
#: contents/ui/PlayerFooter.qml:124
#, kde-format
msgid "Remove Track"
msgstr "Eliminar pista"
#: contents/ui/PlayerFooter.qml:123
#: contents/ui/PlayerFooter.qml:141
#, kde-format
msgid "Clear"
msgstr "Borrar todo"
#: contents/ui/PlayerFooter.qml:128 contents/ui/PlaylistPage.qml:26
#: contents/ui/PlayerFooter.qml:146 contents/ui/PlaylistPage.qml:26
#, kde-format
msgid "Shuffle"
msgstr "Desordenar"
#: contents/ui/PlayerFooter.qml:173
#: contents/ui/PlayerFooter.qml:192
#, kde-format
msgid "Pause"
msgstr "Pausar"
#: contents/ui/PlayerFooter.qml:203
#: contents/ui/PlayerFooter.qml:222
#, kde-format
msgid "No media playing"
msgstr "Ningún medio en reproducción"
#: contents/ui/PlayerFooter.qml:247
#: contents/ui/PlayerFooter.qml:266
#, kde-format
msgid "Expand"
msgstr "Expandir"
+19 -9
View File
@@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: audiotube\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2021-12-05 00:45+0000\n"
"POT-Creation-Date: 2022-05-23 00:47+0000\n"
"PO-Revision-Date: 2022-02-21 18:58+0100\n"
"Last-Translator: Iñigo Salvador Azurmendi <[email protected]>\n"
"Language-Team: Basque <[email protected]>\n"
@@ -30,7 +30,7 @@ msgctxt "EMAIL OF TRANSLATORS"
msgid "Your emails"
msgstr "[email protected]"
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:173
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:192
#: contents/ui/PlaylistPage.qml:19
#, kde-format
msgid "Play"
@@ -87,37 +87,47 @@ msgstr "Ados"
msgid "Cancel"
msgstr "Utzi"
#: contents/ui/main.qml:51
#: contents/ui/LibraryPage.qml:15
#, kde-format
msgid "Favourites"
msgstr ""
#: contents/ui/LibraryPage.qml:67
#, kde-format
msgid "Most played"
msgstr ""
#: contents/ui/main.qml:94
#, kde-format
msgid "AudioTube"
msgstr "AudioTube"
#: contents/ui/PlayerFooter.qml:106
#: contents/ui/PlayerFooter.qml:124
#, kde-format
msgid "Remove Track"
msgstr "Kendu pista"
#: contents/ui/PlayerFooter.qml:123
#: contents/ui/PlayerFooter.qml:141
#, kde-format
msgid "Clear"
msgstr "Garbitu"
#: contents/ui/PlayerFooter.qml:128 contents/ui/PlaylistPage.qml:26
#: contents/ui/PlayerFooter.qml:146 contents/ui/PlaylistPage.qml:26
#, kde-format
msgid "Shuffle"
msgstr "Nahastu"
#: contents/ui/PlayerFooter.qml:173
#: contents/ui/PlayerFooter.qml:192
#, kde-format
msgid "Pause"
msgstr "Eten"
#: contents/ui/PlayerFooter.qml:203
#: contents/ui/PlayerFooter.qml:222
#, kde-format
msgid "No media playing"
msgstr "Ez da euskarririk jotzen ari"
#: contents/ui/PlayerFooter.qml:247
#: contents/ui/PlayerFooter.qml:266
#, kde-format
msgid "Expand"
msgstr "Zabaldu"
+19 -9
View File
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: audiotube\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2021-12-05 00:45+0000\n"
"POT-Creation-Date: 2022-05-23 00:47+0000\n"
"PO-Revision-Date: 2022-01-11 22:47+0200\n"
"Last-Translator: Tommi Nieminen <[email protected]>\n"
"Language-Team: Finnish <[email protected]>\n"
@@ -27,7 +27,7 @@ msgctxt "EMAIL OF TRANSLATORS"
msgid "Your emails"
msgstr "[email protected]"
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:173
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:192
#: contents/ui/PlaylistPage.qml:19
#, kde-format
msgid "Play"
@@ -83,37 +83,47 @@ msgstr "OK"
msgid "Cancel"
msgstr "Peru"
#: contents/ui/main.qml:51
#: contents/ui/LibraryPage.qml:15
#, kde-format
msgid "Favourites"
msgstr ""
#: contents/ui/LibraryPage.qml:67
#, kde-format
msgid "Most played"
msgstr ""
#: contents/ui/main.qml:94
#, kde-format
msgid "AudioTube"
msgstr "AudioTube"
#: contents/ui/PlayerFooter.qml:106
#: contents/ui/PlayerFooter.qml:124
#, kde-format
msgid "Remove Track"
msgstr "Poista raita"
#: contents/ui/PlayerFooter.qml:123
#: contents/ui/PlayerFooter.qml:141
#, kde-format
msgid "Clear"
msgstr "Tyhjennä"
#: contents/ui/PlayerFooter.qml:128 contents/ui/PlaylistPage.qml:26
#: contents/ui/PlayerFooter.qml:146 contents/ui/PlaylistPage.qml:26
#, kde-format
msgid "Shuffle"
msgstr "Sekoita"
#: contents/ui/PlayerFooter.qml:173
#: contents/ui/PlayerFooter.qml:192
#, kde-format
msgid "Pause"
msgstr "Tauko"
#: contents/ui/PlayerFooter.qml:203
#: contents/ui/PlayerFooter.qml:222
#, kde-format
msgid "No media playing"
msgstr "Mitään ei toisteta"
#: contents/ui/PlayerFooter.qml:247
#: contents/ui/PlayerFooter.qml:266
#, kde-format
msgid "Expand"
msgstr "Laajenna"
+19 -9
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: audiotube\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2021-12-05 00:45+0000\n"
"POT-Creation-Date: 2022-05-23 00:47+0000\n"
"PO-Revision-Date: 2021-12-06 10:18+0100\n"
"Last-Translator: Xavier Besnard <[email protected]>\n"
"Language-Team: French <[email protected]>\n"
@@ -24,7 +24,7 @@ msgctxt "EMAIL OF TRANSLATORS"
msgid "Your emails"
msgstr "[email protected]"
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:173
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:192
#: contents/ui/PlaylistPage.qml:19
#, kde-format
msgid "Play"
@@ -81,37 +81,47 @@ msgstr "Ok"
msgid "Cancel"
msgstr "Annuler"
#: contents/ui/main.qml:51
#: contents/ui/LibraryPage.qml:15
#, kde-format
msgid "Favourites"
msgstr ""
#: contents/ui/LibraryPage.qml:67
#, kde-format
msgid "Most played"
msgstr ""
#: contents/ui/main.qml:94
#, kde-format
msgid "AudioTube"
msgstr "AudioTube"
#: contents/ui/PlayerFooter.qml:106
#: contents/ui/PlayerFooter.qml:124
#, kde-format
msgid "Remove Track"
msgstr "Supprimer une piste"
#: contents/ui/PlayerFooter.qml:123
#: contents/ui/PlayerFooter.qml:141
#, kde-format
msgid "Clear"
msgstr "Effacer"
#: contents/ui/PlayerFooter.qml:128 contents/ui/PlaylistPage.qml:26
#: contents/ui/PlayerFooter.qml:146 contents/ui/PlaylistPage.qml:26
#, kde-format
msgid "Shuffle"
msgstr "Mélanger"
#: contents/ui/PlayerFooter.qml:173
#: contents/ui/PlayerFooter.qml:192
#, kde-format
msgid "Pause"
msgstr "Pause"
#: contents/ui/PlayerFooter.qml:203
#: contents/ui/PlayerFooter.qml:222
#, kde-format
msgid "No media playing"
msgstr "Aucun média en lecture"
#: contents/ui/PlayerFooter.qml:247
#: contents/ui/PlayerFooter.qml:266
#, kde-format
msgid "Expand"
msgstr "Développer"
+19 -9
View File
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: audiotube\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2021-12-05 00:45+0000\n"
"POT-Creation-Date: 2022-05-23 00:47+0000\n"
"PO-Revision-Date: 2021-09-17 20:09+0530\n"
"Last-Translator: Raghavendra Kamath <[email protected]>\n"
"Language-Team: kde-hindi\n"
@@ -27,7 +27,7 @@ msgctxt "EMAIL OF TRANSLATORS"
msgid "Your emails"
msgstr "[email protected]"
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:173
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:192
#: contents/ui/PlaylistPage.qml:19
#, kde-format
msgid "Play"
@@ -83,37 +83,47 @@ msgstr ""
msgid "Cancel"
msgstr ""
#: contents/ui/main.qml:51
#: contents/ui/LibraryPage.qml:15
#, kde-format
msgid "Favourites"
msgstr ""
#: contents/ui/LibraryPage.qml:67
#, kde-format
msgid "Most played"
msgstr ""
#: contents/ui/main.qml:94
#, kde-format
msgid "AudioTube"
msgstr "ओडियो-ट्यूब"
#: contents/ui/PlayerFooter.qml:106
#: contents/ui/PlayerFooter.qml:124
#, kde-format
msgid "Remove Track"
msgstr "गाना हटाएँ"
#: contents/ui/PlayerFooter.qml:123
#: contents/ui/PlayerFooter.qml:141
#, kde-format
msgid "Clear"
msgstr "साफ करें"
#: contents/ui/PlayerFooter.qml:128 contents/ui/PlaylistPage.qml:26
#: contents/ui/PlayerFooter.qml:146 contents/ui/PlaylistPage.qml:26
#, kde-format
msgid "Shuffle"
msgstr "फेंटें"
#: contents/ui/PlayerFooter.qml:173
#: contents/ui/PlayerFooter.qml:192
#, kde-format
msgid "Pause"
msgstr "रोकें"
#: contents/ui/PlayerFooter.qml:203
#: contents/ui/PlayerFooter.qml:222
#, kde-format
msgid "No media playing"
msgstr "कोई मीडिया नहीं बजा रहा है"
#: contents/ui/PlayerFooter.qml:247
#: contents/ui/PlayerFooter.qml:266
#, kde-format
msgid "Expand"
msgstr "विस्तृत करें"
+19 -9
View File
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: audiotube\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2021-12-05 00:45+0000\n"
"POT-Creation-Date: 2022-05-23 00:47+0000\n"
"PO-Revision-Date: 2021-12-06 02:46+0100\n"
"Last-Translator: Vincenzo Reale <[email protected]>\n"
"Language-Team: Italian <[email protected]>\n"
@@ -27,7 +27,7 @@ msgctxt "EMAIL OF TRANSLATORS"
msgid "Your emails"
msgstr "[email protected]"
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:173
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:192
#: contents/ui/PlaylistPage.qml:19
#, kde-format
msgid "Play"
@@ -84,37 +84,47 @@ msgstr "OK"
msgid "Cancel"
msgstr "Annulla"
#: contents/ui/main.qml:51
#: contents/ui/LibraryPage.qml:15
#, kde-format
msgid "Favourites"
msgstr ""
#: contents/ui/LibraryPage.qml:67
#, kde-format
msgid "Most played"
msgstr ""
#: contents/ui/main.qml:94
#, kde-format
msgid "AudioTube"
msgstr "AudioTube"
#: contents/ui/PlayerFooter.qml:106
#: contents/ui/PlayerFooter.qml:124
#, kde-format
msgid "Remove Track"
msgstr "Rimuovi traccia"
#: contents/ui/PlayerFooter.qml:123
#: contents/ui/PlayerFooter.qml:141
#, kde-format
msgid "Clear"
msgstr "Pulisci"
#: contents/ui/PlayerFooter.qml:128 contents/ui/PlaylistPage.qml:26
#: contents/ui/PlayerFooter.qml:146 contents/ui/PlaylistPage.qml:26
#, kde-format
msgid "Shuffle"
msgstr "Mescola"
#: contents/ui/PlayerFooter.qml:173
#: contents/ui/PlayerFooter.qml:192
#, kde-format
msgid "Pause"
msgstr "Pausa"
#: contents/ui/PlayerFooter.qml:203
#: contents/ui/PlayerFooter.qml:222
#, kde-format
msgid "No media playing"
msgstr "Nessun supporto in riproduzione"
#: contents/ui/PlayerFooter.qml:247
#: contents/ui/PlayerFooter.qml:266
#, kde-format
msgid "Expand"
msgstr "Espandi"
+19 -9
View File
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: audiotube\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2021-12-05 00:45+0000\n"
"POT-Creation-Date: 2022-05-23 00:47+0000\n"
"PO-Revision-Date: 2021-12-08 00:45+0100\n"
"Last-Translator: Shinjo Park <[email protected]>\n"
"Language-Team: Korean <[email protected]>\n"
@@ -27,7 +27,7 @@ msgctxt "EMAIL OF TRANSLATORS"
msgid "Your emails"
msgstr "[email protected]"
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:173
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:192
#: contents/ui/PlaylistPage.qml:19
#, kde-format
msgid "Play"
@@ -82,37 +82,47 @@ msgstr "확인"
msgid "Cancel"
msgstr "취소"
#: contents/ui/main.qml:51
#: contents/ui/LibraryPage.qml:15
#, kde-format
msgid "Favourites"
msgstr ""
#: contents/ui/LibraryPage.qml:67
#, kde-format
msgid "Most played"
msgstr ""
#: contents/ui/main.qml:94
#, kde-format
msgid "AudioTube"
msgstr "AudioTube"
#: contents/ui/PlayerFooter.qml:106
#: contents/ui/PlayerFooter.qml:124
#, kde-format
msgid "Remove Track"
msgstr "트랙 삭제"
#: contents/ui/PlayerFooter.qml:123
#: contents/ui/PlayerFooter.qml:141
#, kde-format
msgid "Clear"
msgstr "지우기"
#: contents/ui/PlayerFooter.qml:128 contents/ui/PlaylistPage.qml:26
#: contents/ui/PlayerFooter.qml:146 contents/ui/PlaylistPage.qml:26
#, kde-format
msgid "Shuffle"
msgstr "무순서 재생"
#: contents/ui/PlayerFooter.qml:173
#: contents/ui/PlayerFooter.qml:192
#, kde-format
msgid "Pause"
msgstr "일시 정지"
#: contents/ui/PlayerFooter.qml:203
#: contents/ui/PlayerFooter.qml:222
#, kde-format
msgid "No media playing"
msgstr "재생 중인 미디어 없음"
#: contents/ui/PlayerFooter.qml:247
#: contents/ui/PlayerFooter.qml:266
#, kde-format
msgid "Expand"
msgstr "확장"
+19 -9
View File
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: audiotube\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2021-12-05 00:45+0000\n"
"POT-Creation-Date: 2022-05-23 00:47+0000\n"
"PO-Revision-Date: 2021-12-05 16:48+0100\n"
"Last-Translator: Freek de Kruijf <[email protected]>\n"
"Language-Team: \n"
@@ -27,7 +27,7 @@ msgctxt "EMAIL OF TRANSLATORS"
msgid "Your emails"
msgstr "[email protected]"
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:173
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:192
#: contents/ui/PlaylistPage.qml:19
#, kde-format
msgid "Play"
@@ -84,37 +84,47 @@ msgstr "OK"
msgid "Cancel"
msgstr "Annuleren"
#: contents/ui/main.qml:51
#: contents/ui/LibraryPage.qml:15
#, kde-format
msgid "Favourites"
msgstr ""
#: contents/ui/LibraryPage.qml:67
#, kde-format
msgid "Most played"
msgstr ""
#: contents/ui/main.qml:94
#, kde-format
msgid "AudioTube"
msgstr "AudioTube"
#: contents/ui/PlayerFooter.qml:106
#: contents/ui/PlayerFooter.qml:124
#, kde-format
msgid "Remove Track"
msgstr "Track verwijderen"
#: contents/ui/PlayerFooter.qml:123
#: contents/ui/PlayerFooter.qml:141
#, kde-format
msgid "Clear"
msgstr "Wissen"
#: contents/ui/PlayerFooter.qml:128 contents/ui/PlaylistPage.qml:26
#: contents/ui/PlayerFooter.qml:146 contents/ui/PlaylistPage.qml:26
#, kde-format
msgid "Shuffle"
msgstr "Willekeurig afspelen"
#: contents/ui/PlayerFooter.qml:173
#: contents/ui/PlayerFooter.qml:192
#, kde-format
msgid "Pause"
msgstr "Pauzeren"
#: contents/ui/PlayerFooter.qml:203
#: contents/ui/PlayerFooter.qml:222
#, kde-format
msgid "No media playing"
msgstr "Er speelt geen medium"
#: contents/ui/PlayerFooter.qml:247
#: contents/ui/PlayerFooter.qml:266
#, kde-format
msgid "Expand"
msgstr "Uitbreiden"
+19 -9
View File
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: audiotube\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2021-12-05 00:45+0000\n"
"POT-Creation-Date: 2022-05-23 00:47+0000\n"
"PO-Revision-Date: 2022-01-01 09:11-0800\n"
"Last-Translator: A S Alam <[email protected]>\n"
"Language-Team: Punjabi <[email protected]>\n"
@@ -27,7 +27,7 @@ msgctxt "EMAIL OF TRANSLATORS"
msgid "Your emails"
msgstr "alam yellow @ gmail.com"
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:173
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:192
#: contents/ui/PlaylistPage.qml:19
#, kde-format
msgid "Play"
@@ -82,37 +82,47 @@ msgstr "ਠੀਕ ਹੈ"
msgid "Cancel"
msgstr "ਰੱਦ ਕਰੋ"
#: contents/ui/main.qml:51
#: contents/ui/LibraryPage.qml:15
#, kde-format
msgid "Favourites"
msgstr ""
#: contents/ui/LibraryPage.qml:67
#, kde-format
msgid "Most played"
msgstr ""
#: contents/ui/main.qml:94
#, kde-format
msgid "AudioTube"
msgstr "ਆਡੀਓ-ਟਿਊਬ"
#: contents/ui/PlayerFooter.qml:106
#: contents/ui/PlayerFooter.qml:124
#, kde-format
msgid "Remove Track"
msgstr "ਟਰੈਕ ਨੂੰ ਹਟਾਓ"
#: contents/ui/PlayerFooter.qml:123
#: contents/ui/PlayerFooter.qml:141
#, kde-format
msgid "Clear"
msgstr "ਮਿਟਾਓ"
#: contents/ui/PlayerFooter.qml:128 contents/ui/PlaylistPage.qml:26
#: contents/ui/PlayerFooter.qml:146 contents/ui/PlaylistPage.qml:26
#, kde-format
msgid "Shuffle"
msgstr "ਰਲਵੇਂ"
#: contents/ui/PlayerFooter.qml:173
#: contents/ui/PlayerFooter.qml:192
#, kde-format
msgid "Pause"
msgstr "ਵਿਰਾਮ"
#: contents/ui/PlayerFooter.qml:203
#: contents/ui/PlayerFooter.qml:222
#, kde-format
msgid "No media playing"
msgstr "ਕੋਈ ਮੀਡੀਆ ਨਹੀਂ ਚੱਲਦਾ"
#: contents/ui/PlayerFooter.qml:247
#: contents/ui/PlayerFooter.qml:266
#, kde-format
msgid "Expand"
msgstr "ਫੈਲਾਓ"
+19 -9
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: audiotube\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2021-12-05 00:45+0000\n"
"POT-Creation-Date: 2022-05-23 00:47+0000\n"
"PO-Revision-Date: 2021-12-30 12:38+0100\n"
"Last-Translator: Łukasz Wojniłowicz <[email protected]>\n"
"Language-Team: Polish <[email protected]>\n"
@@ -29,7 +29,7 @@ msgctxt "EMAIL OF TRANSLATORS"
msgid "Your emails"
msgstr "[email protected], [email protected]"
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:173
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:192
#: contents/ui/PlaylistPage.qml:19
#, kde-format
msgid "Play"
@@ -86,37 +86,47 @@ msgstr "OK"
msgid "Cancel"
msgstr "Anuluj"
#: contents/ui/main.qml:51
#: contents/ui/LibraryPage.qml:15
#, kde-format
msgid "Favourites"
msgstr ""
#: contents/ui/LibraryPage.qml:67
#, kde-format
msgid "Most played"
msgstr ""
#: contents/ui/main.qml:94
#, kde-format
msgid "AudioTube"
msgstr "AudioTube"
#: contents/ui/PlayerFooter.qml:106
#: contents/ui/PlayerFooter.qml:124
#, kde-format
msgid "Remove Track"
msgstr "Usuń utwór"
#: contents/ui/PlayerFooter.qml:123
#: contents/ui/PlayerFooter.qml:141
#, kde-format
msgid "Clear"
msgstr "Wyczyść"
#: contents/ui/PlayerFooter.qml:128 contents/ui/PlaylistPage.qml:26
#: contents/ui/PlayerFooter.qml:146 contents/ui/PlaylistPage.qml:26
#, kde-format
msgid "Shuffle"
msgstr "Wymieszaj"
#: contents/ui/PlayerFooter.qml:173
#: contents/ui/PlayerFooter.qml:192
#, kde-format
msgid "Pause"
msgstr "Wstrzymaj"
#: contents/ui/PlayerFooter.qml:203
#: contents/ui/PlayerFooter.qml:222
#, kde-format
msgid "No media playing"
msgstr "Nic nie jest odtwarzane"
#: contents/ui/PlayerFooter.qml:247
#: contents/ui/PlayerFooter.qml:266
#, kde-format
msgid "Expand"
msgstr "Rozwiń"
+19 -9
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: audiotube\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2021-12-05 00:45+0000\n"
"POT-Creation-Date: 2022-05-23 00:47+0000\n"
"PO-Revision-Date: 2021-09-04 18:29+0100\n"
"Last-Translator: José Nuno Coelho Pires <[email protected]>\n"
"Language-Team: Portuguese <[email protected]>\n"
@@ -29,7 +29,7 @@ msgctxt "EMAIL OF TRANSLATORS"
msgid "Your emails"
msgstr "[email protected]"
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:173
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:192
#: contents/ui/PlaylistPage.qml:19
#, kde-format
msgid "Play"
@@ -86,37 +86,47 @@ msgstr "OK"
msgid "Cancel"
msgstr "Cancelar"
#: contents/ui/main.qml:51
#: contents/ui/LibraryPage.qml:15
#, kde-format
msgid "Favourites"
msgstr ""
#: contents/ui/LibraryPage.qml:67
#, kde-format
msgid "Most played"
msgstr ""
#: contents/ui/main.qml:94
#, kde-format
msgid "AudioTube"
msgstr "AudioTube"
#: contents/ui/PlayerFooter.qml:106
#: contents/ui/PlayerFooter.qml:124
#, kde-format
msgid "Remove Track"
msgstr "Remover a Faixa"
#: contents/ui/PlayerFooter.qml:123
#: contents/ui/PlayerFooter.qml:141
#, kde-format
msgid "Clear"
msgstr "Limpar"
#: contents/ui/PlayerFooter.qml:128 contents/ui/PlaylistPage.qml:26
#: contents/ui/PlayerFooter.qml:146 contents/ui/PlaylistPage.qml:26
#, kde-format
msgid "Shuffle"
msgstr "Baralhar"
#: contents/ui/PlayerFooter.qml:173
#: contents/ui/PlayerFooter.qml:192
#, kde-format
msgid "Pause"
msgstr "Pausa"
#: contents/ui/PlayerFooter.qml:203
#: contents/ui/PlayerFooter.qml:222
#, kde-format
msgid "No media playing"
msgstr "Nada em reprodução"
#: contents/ui/PlayerFooter.qml:247
#: contents/ui/PlayerFooter.qml:266
#, kde-format
msgid "Expand"
msgstr "Expandir"
+19 -9
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: audiotube\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2021-12-05 00:45+0000\n"
"POT-Creation-Date: 2022-05-23 00:47+0000\n"
"PO-Revision-Date: 2021-12-09 10:13-0300\n"
"Last-Translator: Luiz Fernando Ranghetti <[email protected]>\n"
"Language-Team: Portuguese <[email protected]>\n"
@@ -28,7 +28,7 @@ msgctxt "EMAIL OF TRANSLATORS"
msgid "Your emails"
msgstr "[email protected]"
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:173
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:192
#: contents/ui/PlaylistPage.qml:19
#, kde-format
msgid "Play"
@@ -85,37 +85,47 @@ msgstr "OK"
msgid "Cancel"
msgstr "Cancelar"
#: contents/ui/main.qml:51
#: contents/ui/LibraryPage.qml:15
#, kde-format
msgid "Favourites"
msgstr ""
#: contents/ui/LibraryPage.qml:67
#, kde-format
msgid "Most played"
msgstr ""
#: contents/ui/main.qml:94
#, kde-format
msgid "AudioTube"
msgstr "AudioTube"
#: contents/ui/PlayerFooter.qml:106
#: contents/ui/PlayerFooter.qml:124
#, kde-format
msgid "Remove Track"
msgstr "Remover faixa"
#: contents/ui/PlayerFooter.qml:123
#: contents/ui/PlayerFooter.qml:141
#, kde-format
msgid "Clear"
msgstr "Limpar"
#: contents/ui/PlayerFooter.qml:128 contents/ui/PlaylistPage.qml:26
#: contents/ui/PlayerFooter.qml:146 contents/ui/PlaylistPage.qml:26
#, kde-format
msgid "Shuffle"
msgstr "Embaralhar"
#: contents/ui/PlayerFooter.qml:173
#: contents/ui/PlayerFooter.qml:192
#, kde-format
msgid "Pause"
msgstr "Pausar"
#: contents/ui/PlayerFooter.qml:203
#: contents/ui/PlayerFooter.qml:222
#, kde-format
msgid "No media playing"
msgstr "Nenhuma mídia em reprodução"
#: contents/ui/PlayerFooter.qml:247
#: contents/ui/PlayerFooter.qml:266
#, kde-format
msgid "Expand"
msgstr "Expandir"
+19 -9
View File
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: audiotube\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2021-12-05 00:45+0000\n"
"POT-Creation-Date: 2022-05-23 00:47+0000\n"
"PO-Revision-Date: 2022-05-10 21:39+0300\n"
"Last-Translator: Alexander Yavorsky <[email protected]>\n"
"Language-Team: Russian <[email protected]>\n"
@@ -28,7 +28,7 @@ msgctxt "EMAIL OF TRANSLATORS"
msgid "Your emails"
msgstr "[email protected]"
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:173
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:192
#: contents/ui/PlaylistPage.qml:19
#, kde-format
msgid "Play"
@@ -83,37 +83,47 @@ msgstr "ОК"
msgid "Cancel"
msgstr "Отмена"
#: contents/ui/main.qml:51
#: contents/ui/LibraryPage.qml:15
#, kde-format
msgid "Favourites"
msgstr ""
#: contents/ui/LibraryPage.qml:67
#, kde-format
msgid "Most played"
msgstr ""
#: contents/ui/main.qml:94
#, kde-format
msgid "AudioTube"
msgstr "AudioTube"
#: contents/ui/PlayerFooter.qml:106
#: contents/ui/PlayerFooter.qml:124
#, kde-format
msgid "Remove Track"
msgstr "Удалить дорожку"
#: contents/ui/PlayerFooter.qml:123
#: contents/ui/PlayerFooter.qml:141
#, kde-format
msgid "Clear"
msgstr "Очистить"
#: contents/ui/PlayerFooter.qml:128 contents/ui/PlaylistPage.qml:26
#: contents/ui/PlayerFooter.qml:146 contents/ui/PlaylistPage.qml:26
#, kde-format
msgid "Shuffle"
msgstr "Перемешать"
#: contents/ui/PlayerFooter.qml:173
#: contents/ui/PlayerFooter.qml:192
#, kde-format
msgid "Pause"
msgstr "Приостановить"
#: contents/ui/PlayerFooter.qml:203
#: contents/ui/PlayerFooter.qml:222
#, kde-format
msgid "No media playing"
msgstr ""
#: contents/ui/PlayerFooter.qml:247
#: contents/ui/PlayerFooter.qml:266
#, kde-format
msgid "Expand"
msgstr ""
+19 -9
View File
@@ -4,7 +4,7 @@ msgid ""
msgstr ""
"Project-Id-Version: audiotube\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2021-12-05 00:45+0000\n"
"POT-Creation-Date: 2022-05-23 00:47+0000\n"
"PO-Revision-Date: 2022-04-07 18:01+0200\n"
"Last-Translator: Roman Paholik <[email protected]>\n"
"Language-Team: Slovak <[email protected]>\n"
@@ -25,7 +25,7 @@ msgctxt "EMAIL OF TRANSLATORS"
msgid "Your emails"
msgstr "[email protected]"
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:173
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:192
#: contents/ui/PlaylistPage.qml:19
#, kde-format
msgid "Play"
@@ -81,37 +81,47 @@ msgstr "OK"
msgid "Cancel"
msgstr "Zrušiť"
#: contents/ui/main.qml:51
#: contents/ui/LibraryPage.qml:15
#, kde-format
msgid "Favourites"
msgstr ""
#: contents/ui/LibraryPage.qml:67
#, kde-format
msgid "Most played"
msgstr ""
#: contents/ui/main.qml:94
#, kde-format
msgid "AudioTube"
msgstr "AudioTube"
#: contents/ui/PlayerFooter.qml:106
#: contents/ui/PlayerFooter.qml:124
#, kde-format
msgid "Remove Track"
msgstr ""
#: contents/ui/PlayerFooter.qml:123
#: contents/ui/PlayerFooter.qml:141
#, kde-format
msgid "Clear"
msgstr "Vyčistiť"
#: contents/ui/PlayerFooter.qml:128 contents/ui/PlaylistPage.qml:26
#: contents/ui/PlayerFooter.qml:146 contents/ui/PlaylistPage.qml:26
#, kde-format
msgid "Shuffle"
msgstr "Zamiešať"
#: contents/ui/PlayerFooter.qml:173
#: contents/ui/PlayerFooter.qml:192
#, kde-format
msgid "Pause"
msgstr "Pozastaviť"
#: contents/ui/PlayerFooter.qml:203
#: contents/ui/PlayerFooter.qml:222
#, kde-format
msgid "No media playing"
msgstr "Neprehráva sa žiadne médium"
#: contents/ui/PlayerFooter.qml:247
#: contents/ui/PlayerFooter.qml:266
#, kde-format
msgid "Expand"
msgstr "Rozvinúť"
+19 -9
View File
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: audiotube\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2021-12-05 00:45+0000\n"
"POT-Creation-Date: 2022-05-23 00:47+0000\n"
"PO-Revision-Date: 2021-12-09 13:26+0100\n"
"Last-Translator: Matjaž Jeran <[email protected]>\n"
"Language-Team: Slovenian <[email protected]>\n"
@@ -28,7 +28,7 @@ msgctxt "EMAIL OF TRANSLATORS"
msgid "Your emails"
msgstr "[email protected]"
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:173
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:192
#: contents/ui/PlaylistPage.qml:19
#, kde-format
msgid "Play"
@@ -83,37 +83,47 @@ msgstr "V redu"
msgid "Cancel"
msgstr "Prekliči"
#: contents/ui/main.qml:51
#: contents/ui/LibraryPage.qml:15
#, kde-format
msgid "Favourites"
msgstr ""
#: contents/ui/LibraryPage.qml:67
#, kde-format
msgid "Most played"
msgstr ""
#: contents/ui/main.qml:94
#, kde-format
msgid "AudioTube"
msgstr "AudioTube"
#: contents/ui/PlayerFooter.qml:106
#: contents/ui/PlayerFooter.qml:124
#, kde-format
msgid "Remove Track"
msgstr "Odstrani sled"
#: contents/ui/PlayerFooter.qml:123
#: contents/ui/PlayerFooter.qml:141
#, kde-format
msgid "Clear"
msgstr "Očisti"
#: contents/ui/PlayerFooter.qml:128 contents/ui/PlaylistPage.qml:26
#: contents/ui/PlayerFooter.qml:146 contents/ui/PlaylistPage.qml:26
#, kde-format
msgid "Shuffle"
msgstr "Premešaj"
#: contents/ui/PlayerFooter.qml:173
#: contents/ui/PlayerFooter.qml:192
#, kde-format
msgid "Pause"
msgstr "Premor"
#: contents/ui/PlayerFooter.qml:203
#: contents/ui/PlayerFooter.qml:222
#, kde-format
msgid "No media playing"
msgstr "Niče se ne predvaja"
#: contents/ui/PlayerFooter.qml:247
#: contents/ui/PlayerFooter.qml:266
#, kde-format
msgid "Expand"
msgstr "Razširi"
+19 -9
View File
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: audiotube\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2021-12-05 00:45+0000\n"
"POT-Creation-Date: 2022-05-23 00:47+0000\n"
"PO-Revision-Date: 2021-12-05 11:41+0100\n"
"Last-Translator: Stefan Asserhäll <[email protected]>\n"
"Language-Team: Swedish <[email protected]>\n"
@@ -27,7 +27,7 @@ msgctxt "EMAIL OF TRANSLATORS"
msgid "Your emails"
msgstr "[email protected]"
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:173
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:192
#: contents/ui/PlaylistPage.qml:19
#, kde-format
msgid "Play"
@@ -82,37 +82,47 @@ msgstr "Ok"
msgid "Cancel"
msgstr "Avbryt"
#: contents/ui/main.qml:51
#: contents/ui/LibraryPage.qml:15
#, kde-format
msgid "Favourites"
msgstr ""
#: contents/ui/LibraryPage.qml:67
#, kde-format
msgid "Most played"
msgstr ""
#: contents/ui/main.qml:94
#, kde-format
msgid "AudioTube"
msgstr "AudioTube"
#: contents/ui/PlayerFooter.qml:106
#: contents/ui/PlayerFooter.qml:124
#, kde-format
msgid "Remove Track"
msgstr "Ta bort spår"
#: contents/ui/PlayerFooter.qml:123
#: contents/ui/PlayerFooter.qml:141
#, kde-format
msgid "Clear"
msgstr "Rensa"
#: contents/ui/PlayerFooter.qml:128 contents/ui/PlaylistPage.qml:26
#: contents/ui/PlayerFooter.qml:146 contents/ui/PlaylistPage.qml:26
#, kde-format
msgid "Shuffle"
msgstr "Blanda"
#: contents/ui/PlayerFooter.qml:173
#: contents/ui/PlayerFooter.qml:192
#, kde-format
msgid "Pause"
msgstr "Paus"
#: contents/ui/PlayerFooter.qml:203
#: contents/ui/PlayerFooter.qml:222
#, kde-format
msgid "No media playing"
msgstr "Inga media spelar"
#: contents/ui/PlayerFooter.qml:247
#: contents/ui/PlayerFooter.qml:266
#, kde-format
msgid "Expand"
msgstr "Expandera"
+19 -9
View File
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: audiotube\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2021-12-05 00:45+0000\n"
"POT-Creation-Date: 2022-05-23 00:47+0000\n"
"PO-Revision-Date: 2022-04-15 14:41+0300\n"
"Last-Translator: Emir SARI <[email protected]>\n"
"Language-Team: Turkish <[email protected]>\n"
@@ -27,7 +27,7 @@ msgctxt "EMAIL OF TRANSLATORS"
msgid "Your emails"
msgstr "[email protected]"
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:173
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:192
#: contents/ui/PlaylistPage.qml:19
#, kde-format
msgid "Play"
@@ -84,37 +84,47 @@ msgstr "Tamam"
msgid "Cancel"
msgstr "İptal"
#: contents/ui/main.qml:51
#: contents/ui/LibraryPage.qml:15
#, kde-format
msgid "Favourites"
msgstr ""
#: contents/ui/LibraryPage.qml:67
#, kde-format
msgid "Most played"
msgstr ""
#: contents/ui/main.qml:94
#, kde-format
msgid "AudioTube"
msgstr "AudioTube"
#: contents/ui/PlayerFooter.qml:106
#: contents/ui/PlayerFooter.qml:124
#, kde-format
msgid "Remove Track"
msgstr "Parçayı Kaldır"
#: contents/ui/PlayerFooter.qml:123
#: contents/ui/PlayerFooter.qml:141
#, kde-format
msgid "Clear"
msgstr "Temizle"
#: contents/ui/PlayerFooter.qml:128 contents/ui/PlaylistPage.qml:26
#: contents/ui/PlayerFooter.qml:146 contents/ui/PlaylistPage.qml:26
#, kde-format
msgid "Shuffle"
msgstr "Karıştır"
#: contents/ui/PlayerFooter.qml:173
#: contents/ui/PlayerFooter.qml:192
#, kde-format
msgid "Pause"
msgstr "Duraklat"
#: contents/ui/PlayerFooter.qml:203
#: contents/ui/PlayerFooter.qml:222
#, kde-format
msgid "No media playing"
msgstr "Ortam çalmıyor"
#: contents/ui/PlayerFooter.qml:247
#: contents/ui/PlayerFooter.qml:266
#, kde-format
msgid "Expand"
msgstr "Genişlet"
+19 -9
View File
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2021-12-05 00:45+0000\n"
"POT-Creation-Date: 2022-05-23 00:47+0000\n"
"PO-Revision-Date: 2021-12-05 08:42+0200\n"
"Last-Translator: Yuri Chornoivan <[email protected]>\n"
"Language-Team: Ukrainian <[email protected]>\n"
@@ -28,7 +28,7 @@ msgctxt "EMAIL OF TRANSLATORS"
msgid "Your emails"
msgstr "[email protected]"
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:173
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:192
#: contents/ui/PlaylistPage.qml:19
#, kde-format
msgid "Play"
@@ -85,37 +85,47 @@ msgstr "Гаразд"
msgid "Cancel"
msgstr "Скасувати"
#: contents/ui/main.qml:51
#: contents/ui/LibraryPage.qml:15
#, kde-format
msgid "Favourites"
msgstr ""
#: contents/ui/LibraryPage.qml:67
#, kde-format
msgid "Most played"
msgstr ""
#: contents/ui/main.qml:94
#, kde-format
msgid "AudioTube"
msgstr "AudioTube"
#: contents/ui/PlayerFooter.qml:106
#: contents/ui/PlayerFooter.qml:124
#, kde-format
msgid "Remove Track"
msgstr "Вилучити композицію"
#: contents/ui/PlayerFooter.qml:123
#: contents/ui/PlayerFooter.qml:141
#, kde-format
msgid "Clear"
msgstr "Спорожнити"
#: contents/ui/PlayerFooter.qml:128 contents/ui/PlaylistPage.qml:26
#: contents/ui/PlayerFooter.qml:146 contents/ui/PlaylistPage.qml:26
#, kde-format
msgid "Shuffle"
msgstr "Перемішати"
#: contents/ui/PlayerFooter.qml:173
#: contents/ui/PlayerFooter.qml:192
#, kde-format
msgid "Pause"
msgstr "Призупинити"
#: contents/ui/PlayerFooter.qml:203
#: contents/ui/PlayerFooter.qml:222
#, kde-format
msgid "No media playing"
msgstr "Відтворення не відбувається"
#: contents/ui/PlayerFooter.qml:247
#: contents/ui/PlayerFooter.qml:266
#, kde-format
msgid "Expand"
msgstr "Розгорнути"
+20 -10
View File
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: audiotube\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2021-12-05 00:45+0000\n"
"PO-Revision-Date: 2021-12-05 01:46+0000\n"
"POT-Creation-Date: 2022-05-23 00:47+0000\n"
"PO-Revision-Date: 2022-05-23 01:48+0000\n"
"Last-Translator: transxx.py program <[email protected]>\n"
"Language-Team: KDE Test Language <[email protected]>\n"
"Language: x-test\n"
@@ -27,7 +27,7 @@ msgctxt "EMAIL OF TRANSLATORS"
msgid "Your emails"
msgstr "xxYour emailsxx"
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:173
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:192
#: contents/ui/PlaylistPage.qml:19
#, kde-format
msgid "Play"
@@ -84,37 +84,47 @@ msgstr "xxOKxx"
msgid "Cancel"
msgstr "xxCancelxx"
#: contents/ui/main.qml:51
#: contents/ui/LibraryPage.qml:15
#, kde-format
msgid "Favourites"
msgstr "xxFavouritesxx"
#: contents/ui/LibraryPage.qml:67
#, kde-format
msgid "Most played"
msgstr "xxMost playedxx"
#: contents/ui/main.qml:94
#, kde-format
msgid "AudioTube"
msgstr "xxAudioTubexx"
#: contents/ui/PlayerFooter.qml:106
#: contents/ui/PlayerFooter.qml:124
#, kde-format
msgid "Remove Track"
msgstr "xxRemove Trackxx"
#: contents/ui/PlayerFooter.qml:123
#: contents/ui/PlayerFooter.qml:141
#, kde-format
msgid "Clear"
msgstr "xxClearxx"
#: contents/ui/PlayerFooter.qml:128 contents/ui/PlaylistPage.qml:26
#: contents/ui/PlayerFooter.qml:146 contents/ui/PlaylistPage.qml:26
#, kde-format
msgid "Shuffle"
msgstr "xxShufflexx"
#: contents/ui/PlayerFooter.qml:173
#: contents/ui/PlayerFooter.qml:192
#, kde-format
msgid "Pause"
msgstr "xxPausexx"
#: contents/ui/PlayerFooter.qml:203
#: contents/ui/PlayerFooter.qml:222
#, kde-format
msgid "No media playing"
msgstr "xxNo media playingxx"
#: contents/ui/PlayerFooter.qml:247
#: contents/ui/PlayerFooter.qml:266
#, kde-format
msgid "Expand"
msgstr "xxExpandxx"
+19 -9
View File
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: kdeorg\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2021-12-05 00:45+0000\n"
"POT-Creation-Date: 2022-05-23 00:47+0000\n"
"PO-Revision-Date: 2022-05-15 15:46\n"
"Last-Translator: \n"
"Language-Team: Chinese Simplified\n"
@@ -27,7 +27,7 @@ msgctxt "EMAIL OF TRANSLATORS"
msgid "Your emails"
msgstr "[email protected], [email protected]"
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:173
#: contents/ui/AlbumPage.qml:19 contents/ui/PlayerFooter.qml:192
#: contents/ui/PlaylistPage.qml:19
#, kde-format
msgid "Play"
@@ -82,37 +82,47 @@ msgstr "确定"
msgid "Cancel"
msgstr "取消"
#: contents/ui/main.qml:51
#: contents/ui/LibraryPage.qml:15
#, kde-format
msgid "Favourites"
msgstr ""
#: contents/ui/LibraryPage.qml:67
#, kde-format
msgid "Most played"
msgstr ""
#: contents/ui/main.qml:94
#, kde-format
msgid "AudioTube"
msgstr "AudioTube"
#: contents/ui/PlayerFooter.qml:106
#: contents/ui/PlayerFooter.qml:124
#, kde-format
msgid "Remove Track"
msgstr "移除曲目"
#: contents/ui/PlayerFooter.qml:123
#: contents/ui/PlayerFooter.qml:141
#, kde-format
msgid "Clear"
msgstr "清除"
#: contents/ui/PlayerFooter.qml:128 contents/ui/PlaylistPage.qml:26
#: contents/ui/PlayerFooter.qml:146 contents/ui/PlaylistPage.qml:26
#, kde-format
msgid "Shuffle"
msgstr "随机播放"
#: contents/ui/PlayerFooter.qml:173
#: contents/ui/PlayerFooter.qml:192
#, kde-format
msgid "Pause"
msgstr "暂停"
#: contents/ui/PlayerFooter.qml:203
#: contents/ui/PlayerFooter.qml:222
#, kde-format
msgid "No media playing"
msgstr "没有正在播放的媒体"
#: contents/ui/PlayerFooter.qml:247
#: contents/ui/PlayerFooter.qml:266
#, kde-format
msgid "Expand"
msgstr "展开"
+42 -13
View File
@@ -70,10 +70,10 @@ const QString DATABASE_TYPE_SQLITE = QStringLiteral("QSQLITE");
/// Parse the row into a tuple of the given types.
/// The types need to be deserializable from QVariant.
///
template <typename ...RowTypes>
auto parseRow(const Row &row) -> std::tuple<RowTypes...>
template <typename RowTypesTuple>
auto parseRow(const Row &row) -> RowTypesTuple
{
auto tuple = std::tuple<RowTypes...>();
auto tuple = RowTypesTuple();
int i = 0;
asyncdatabase_private::iterate_tuple(tuple, [&](auto &elem) {
elem = row.at(i).value<std::decay_t<decltype(elem)>>();
@@ -86,17 +86,25 @@ auto parseRow(const Row &row) -> std::tuple<RowTypes...>
/// Parse the rows into a list of tuples of the given types.
/// The types need to be deserializable from QVariant.
///
template <typename ...RowTypes>
auto parseRows(const Rows &rows) -> std::vector<std::tuple<RowTypes...>> {
std::vector<std::tuple<RowTypes...>> parsedRows;
template <typename RowTypesTuple>
auto parseRows(const Rows &rows) -> std::vector<RowTypesTuple> {
std::vector<RowTypesTuple> parsedRows;
parsedRows.reserve(rows.size());
for (const auto &row : rows) {
parsedRows.push_back(parseRow<RowTypes...>(row));
parsedRows.push_back(parseRow<RowTypesTuple>(row));
}
return parsedRows;
}
template <typename T>
concept FromSql = requires(T v, typename T::ColumnTypes row)
{
typename T::ColumnTypes;
{ std::tuple(row) } -> std::same_as<typename T::ColumnTypes>;
{ T::fromSql(row) } -> std::same_as<T>;
};
struct ThreadedDatabasePrivate;
class ThreadedDatabase : public QThread {
@@ -115,6 +123,7 @@ public:
/// \return
///
template <typename ...Args>
requires std::conjunction_v<std::is_convertible<Args, Args>...>
auto execute(const QString &sqlQuery, Args... args) -> QFuture<void> {
return db().execute(sqlQuery, args...);
}
@@ -138,17 +147,22 @@ public:
/// \param parameters to bind to the placeholders in the SQL query.
/// \return Future of a list of lists of variants.
///
template <typename ...Args>
auto getResults(const QString &sqlQuery, Args... args) -> QFuture<Rows> {
return db().getResults(sqlQuery, args...);
/// T must provide a tuple of the column types as `using ColumnTypes = std::tuple<...>`
/// and a `static T fromSql(ColumnTypes tuple)` deserialization method.
///
template <typename T, typename ...Args>
requires FromSql<T> && std::conjunction_v<std::is_convertible<Args, Args>...>
auto getResults(const QString &sqlQuery, Args... args) -> QFuture<std::vector<T>> {
return db().getResults<T, Args...>(sqlQuery, args...);
}
///
/// \brief Like getResults, but for retrieving just one row.
///
template <typename ...Args>
auto getResult(const QString &sqlQuery, Args... args) -> QFuture<std::optional<Row>> {
return db().getResult(sqlQuery, args...);
template <typename T, typename ...Args>
requires FromSql<T> && std::conjunction_v<std::is_convertible<Args, Args>...>
auto getResult(const QString &sqlQuery, Args... args) -> QFuture<std::optional<T>> {
return db().getResult<T, Args...>(sqlQuery, args...);
}
ThreadedDatabase();
@@ -159,3 +173,18 @@ private:
std::unique_ptr<ThreadedDatabasePrivate> d;
};
///
/// \brief Deserialize just a single value from a query result.
///
template <typename T>
struct SingleValue {
using ColumnTypes = std::tuple<T>;
static SingleValue fromSql(ColumnTypes tuple) {
auto [value] = tuple;
return SingleValue { value };
}
T value;
};
+16 -8
View File
@@ -76,19 +76,27 @@ class AsyncSqlDatabase : public QObject {
public:
QFuture<void> establishConnection(const DatabaseConfiguration &configuration);
template <typename ...Args>
auto getResults(const QString &sqlQuery, Args... args) -> QFuture<Rows> {
return runAsync<Rows>([=, this] {
template <typename T, typename ...Args>
auto getResults(const QString &sqlQuery, Args... args) -> QFuture<std::vector<T>> {
return runAsync<std::vector<T>>([=, this] {
auto query = executeQuery(sqlQuery, args...);
return retrieveRows(query);
const auto rows = parseRows<typename T::ColumnTypes>(retrieveRows(query));
std::vector<T> deserializedRows;
std::ranges::transform(rows, std::back_inserter(deserializedRows), T::fromSql);
return deserializedRows;
});
}
template <typename ...Args>
auto getResult(const QString &sqlQuery, Args... args) -> QFuture<std::optional<Row>> {
return runAsync<std::optional<Row>>([=, this] {
template <typename T, typename ...Args>
auto getResult(const QString &sqlQuery, Args... args) -> QFuture<std::optional<T>> {
return runAsync<std::optional<T>>([=, this]() -> std::optional<T> {
auto query = executeQuery(sqlQuery, args...);
return retrieveOptionalRow(query);
if (const auto row = retrieveOptionalRow(query)) {
return T::fromSql(parseRow<typename T::ColumnTypes>(*row));
}
return std::nullopt;
});
}
-8
View File
@@ -97,14 +97,6 @@ Kirigami.ScrollablePage {
fillMode: Image.PreserveAspectCrop
asynchronous: true
}
actions: [
Kirigami.Action {
icon.name: "delete"
onTriggered: Library.removeFavourite(mpdelegateItem.videoId)
}
]
}
Controls.Label {
Layout.maximumWidth: 200
+427
View File
@@ -0,0 +1,427 @@
// SPDX-FileCopyrightText: 2020-2022 Devin Lin <[email protected]>
//
// SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import QtGraphicalEffects 1.0
import QtMultimedia 5.12
import org.kde.kirigami 2.19 as Kirigami
import org.kde.ytmusic 1.0
Item {
id: root
required property var info // VideoInfoExtractor object
required property var audio // Audio object
signal requestClose()
// background image
Item {
anchors.fill: parent
Rectangle {
anchors.fill: parent
color: Qt.rgba(25, 25, 30, 1)
}
Image {
anchors.fill: parent
asynchronous: true
source: info.thumbnail
fillMode: Image.PreserveAspectCrop
sourceSize.width: 512
sourceSize.height: 512
}
layer.enabled: true
layer.effect: HueSaturation {
cached: true
lightness: -0.5
saturation: 1.9
layer.enabled: true
layer.effect: FastBlur {
cached: true
radius: 100
}
}
}
// content
ColumnLayout {
anchors.fill: parent
spacing: 0
// hide arrow button
ToolButton {
id: closeButton
Layout.alignment: Qt.AlignHCenter | Qt.AlignTop
Layout.maximumHeight: parent.height
Layout.preferredHeight: Kirigami.Units.gridUnit * 3
Layout.maximumWidth: parent.height
Layout.preferredWidth: Kirigami.Units.gridUnit * 3
Layout.topMargin: Kirigami.Units.smallSpacing
icon.name: "arrow-down"
icon.color: "white"
Kirigami.Theme.colorSet: Kirigami.Theme.Complementary
Kirigami.Theme.inherit: false
onClicked: root.requestClose()
}
// top tab bar
RowLayout {
id: tabBar
Layout.alignment: Qt.AlignHCenter
ToolButton {
id: nowPlayingTab
text: i18n("Now Playing")
padding: Kirigami.Units.largeSpacing
onClicked: swipeView.setCurrentIndex(0)
Layout.preferredHeight: Kirigami.Units.gridUnit * 2
Layout.preferredWidth: Kirigami.Units.gridUnit * 9
contentItem: Label {
text: nowPlayingTab.text
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
elide: Text.ElideRight
color: "white" // we need to ensure the label is white
}
// selection indicator
Rectangle {
anchors.top: parent.top
anchors.left: parent.left
anchors.right: parent.right
color: Kirigami.Theme.highlightColor
height: 1
visible: swipeView.currentIndex == 0
}
}
ToolButton {
id: queueTab
text: i18n("Queue")
padding: Kirigami.Units.largeSpacing
onClicked: swipeView.setCurrentIndex(1)
Layout.preferredHeight: Kirigami.Units.gridUnit * 2
Layout.preferredWidth: Kirigami.Units.gridUnit * 9
contentItem: Label {
text: queueTab.text
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
elide: Text.ElideRight
color: "white"
}
// selection indicator
Rectangle {
anchors.top: parent.top
anchors.left: parent.left
anchors.right: parent.right
color: Kirigami.Theme.highlightColor
height: 1
visible: swipeView.currentIndex == 1
}
}
}
// tabs
SwipeView {
id: swipeView
property double specWidth: {
let allowedWidth = root.width - Kirigami.Units.largeSpacing * 4;
let allowedHeight = root.height - Kirigami.Units.largeSpacing * 8 - (closeButton.height + tabBar.height + bottomPlayerControls.height);
if (allowedWidth > allowedHeight) {
return allowedHeight;
} else {
return allowedWidth;
}
}
Layout.alignment: Qt.AlignHCenter | Qt.AlignTop
Layout.fillWidth: true
Layout.preferredHeight: specWidth
// music art
Item {
height: swipeView.width
width: swipeView.height
Image {
anchors.centerIn: parent
width: swipeView.specWidth
height: swipeView.specWidth
asynchronous: true
mipmap: true
source: info.thumbnail
sourceSize {
width: 512
height: 512
}
fillMode: Image.PreserveAspectFit
}
}
// playlist
ListView {
id: playlistView
width: swipeView.width
height: swipeView.height
clip: true
Kirigami.Theme.colorSet: Kirigami.Theme.Complementary
Kirigami.Theme.inherit: false
BusyIndicator {
anchors.centerIn: parent
visible: UserPlaylistModel.loading || UserPlaylistModel.loading
}
model: UserPlaylistModel
delegate: Kirigami.SwipeListItem {
id: delegateItem
required property string title
required property string videoId
required property string artists
required property bool isCurrent
backgroundColor: 'transparent'
highlighted: isCurrent
onClicked: UserPlaylistModel.skipTo(videoId)
ColumnLayout {
Layout.fillWidth: true
Kirigami.Heading {
elide: Text.ElideRight
Layout.fillWidth: true
level: 2
text: title
}
Label {
elide: Text.ElideRight
Layout.fillWidth: true
text: artists
}
}
actions: [
Kirigami.Action {
text: i18n("Remove Track")
icon.name: "list-remove"
icon.color: "white"
onTriggered: UserPlaylistModel.remove(delegateItem.videoId)
}
]
}
}
}
ColumnLayout {
id: bottomPlayerControls
Layout.topMargin: Kirigami.Units.largeSpacing
Layout.leftMargin: Kirigami.Units.gridUnit * 2
Layout.rightMargin: Kirigami.Units.gridUnit * 2
Layout.bottomMargin: Kirigami.Units.gridUnit * 2
// song name
Label {
id: mainLabel
text: info.title ? info.title : i18n("No media playing")
Layout.fillWidth: true
horizontalAlignment: Text.AlignHCenter
elide: Text.ElideRight
maximumLineCount: 1
// Hardcoded because the footerbar blur always makes a dark-ish
// background, so we don't want to use a color scheme color that
// might also be dark
color: "white"
font.pointSize: Kirigami.Theme.defaultFont.pointSize * 1.5
font.weight: Font.Bold
font.bold: true
}
// song artist
Kirigami.Heading {
id: authorLabel
text: info.artist ? info.artist : info.channel
Layout.fillWidth: true
horizontalAlignment: Text.AlignHCenter
elide: Text.ElideRight
maximumLineCount: 1
// Hardcoded because the footerbar blur always makes a dark-ish
// background, so we don't want to use a color scheme color that
// might also be dark
color: "white"
opacity: 0.9
font.pointSize: Kirigami.Theme.defaultFont.pointSize * 1.3
font.weight: Font.Bold
font.bold: true
}
// slider row
RowLayout {
Layout.topMargin: Kirigami.Units.gridUnit * 2
spacing: Kirigami.Units.smallSpacing
Label {
Layout.alignment: Qt.AlignVCenter
color: "white"
visible: info.title
text: PlayerUtils.formatTimestamp(audio.position)
}
Slider {
Layout.alignment: Qt.AlignVCenter
Layout.fillWidth: true
from: 0
to: audio.duration
value: audio.position
enabled: audio.seekable
onMoved: {
console.log("Value:", value);
audio.seek(Math.floor(value));
}
Behavior on value {
NumberAnimation {
duration: 1000
}
}
}
Label {
Layout.alignment: Qt.AlignVCenter
color: "white"
visible: info.title
text: PlayerUtils.formatTimestamp(audio.duration)
}
}
RowLayout {
Layout.topMargin: Kirigami.Units.largeSpacing
Layout.alignment: Qt.AlignCenter
Layout.fillWidth: true
spacing: Kirigami.Units.largeSpacing
// ensure white icons
Kirigami.Theme.colorSet: Kirigami.Theme.Complementary
Kirigami.Theme.inherit: false
ToolButton {
id: favouriteButton
readonly property QtObject favouriteWatcher: Library.favouriteWatcher(info.videoId)
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
Layout.preferredHeight: Kirigami.Units.gridUnit * 2.5
Layout.maximumWidth: height
Layout.preferredWidth: height
onClicked: if (favouriteWatcher)
favouriteWatcher.isFavourite
? Library.removeFavourite(info.videoId)
: Library.addFavourite(info.videoId, info.title)
icon.name: favouriteWatcher ? (favouriteWatcher.isFavourite ? "starred-symbolic" : "non-starred-symbolic") : ""
icon.width: Kirigami.Units.gridUnit * 1.5
icon.height: Kirigami.Units.gridUnit * 1.5
icon.color: "white"
Kirigami.Theme.colorSet: Kirigami.Theme.Complementary
Kirigami.Theme.inherit: false
}
ToolButton {
id: skipBackwardButton
Layout.alignment: Qt.AlignRight | Qt.AlignVCenter
Layout.preferredHeight: Kirigami.Units.gridUnit * 2.5
Layout.maximumWidth: height
Layout.preferredWidth: height
enabled: false
icon.name: "media-skip-backward"
icon.width: Kirigami.Units.gridUnit * 1.5
icon.height: Kirigami.Units.gridUnit * 1.5
icon.color: "white"
Kirigami.Theme.colorSet: Kirigami.Theme.Complementary
Kirigami.Theme.inherit: false
}
ToolButton {
id: playPauseButton
Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
Layout.preferredHeight: Kirigami.Units.gridUnit * 4
Layout.maximumWidth: height
Layout.preferredWidth: height
enabled: info.audioUrl != ""
onClicked: audio.playbackState === Audio.PlayingState ? audio.pause() : audio.play()
icon.name: audio.playbackState === Audio.PlayingState ? "media-playback-pause" : "media-playback-start"
icon.width: Kirigami.Units.gridUnit * 3
icon.height: Kirigami.Units.gridUnit * 3
icon.color: "white"
Kirigami.Theme.colorSet: Kirigami.Theme.Complementary
Kirigami.Theme.inherit: false
}
ToolButton {
id: skipForwardButton
Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter
Layout.preferredHeight: Kirigami.Units.gridUnit * 2.5
Layout.maximumWidth: height
Layout.preferredWidth: height
enabled: UserPlaylistModel.canSkip
onClicked: UserPlaylistModel.next()
icon.name: "media-skip-forward"
icon.width: Kirigami.Units.gridUnit * 1.5
icon.height: Kirigami.Units.gridUnit * 1.5
icon.color: "white"
Kirigami.Theme.colorSet: Kirigami.Theme.Complementary
Kirigami.Theme.inherit: false
}
ToolButton {
id: shuffleButton
Layout.alignment: Qt.AlignLeft | Qt.AlignVCenter
Layout.preferredHeight: Kirigami.Units.gridUnit * 2.5
Layout.maximumWidth: height
Layout.preferredWidth: height
onClicked: UserPlaylistModel.shufflePlaylist()
icon.name: "media-playlist-shuffle"
icon.width: Kirigami.Units.gridUnit * 1.5
icon.height: Kirigami.Units.gridUnit * 1.5
icon.color: "white"
Kirigami.Theme.colorSet: Kirigami.Theme.Complementary
Kirigami.Theme.inherit: false
}
}
}
}
}
+207
View File
@@ -0,0 +1,207 @@
// SPDX-FileCopyrightText: 2020-2022 Devin Lin <[email protected]>
//
// SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import QtGraphicalEffects 1.0
import QtMultimedia 5.12
import org.kde.kirigami 2.19 as Kirigami
import org.kde.ytmusic 1.0
Item {
id: root
required property int progressBarHeight
required property int minimizedPlayerContentHeight
required property var info // VideoInfoExtractor object
required property var audio // Audio object
readonly property bool isWidescreen: width >= Kirigami.Units.gridUnit * 40
signal requestOpen()
Rectangle {
id: miniProgressBar
z: 1
visible: !root.isWidescreen
anchors.top: parent.top
anchors.left: parent.left
height: root.progressBarHeight
color: Kirigami.Theme.highlightColor
width: parent.width * (audio.position / audio.duration)
}
RowLayout {
anchors.fill: parent
spacing: 0
Rectangle {
Layout.fillHeight: true
Layout.fillWidth: true
Layout.maximumWidth: Kirigami.Units.gridUnit * 20
Layout.preferredWidth: Kirigami.Units.gridUnit * 20
color: Qt.rgba(0, 0, 0, trackClick.containsMouse ? 0.1 : trackClick.pressed ? 0.3 : 0)
RowLayout {
anchors.fill: parent
anchors.leftMargin: Kirigami.Units.largeSpacing
spacing: Kirigami.Units.largeSpacing
// track image
Item {
property double imageSize: root.height - Kirigami.Units.largeSpacing * 2
Layout.alignment: Qt.AlignVCenter
Layout.maximumWidth: imageSize
Layout.preferredWidth: imageSize
Layout.maximumHeight: imageSize
Layout.minimumHeight: imageSize
Image {
id: mainIcon
anchors.fill: parent
asynchronous: true
mipmap: true
source: info.thumbnail
sourceSize.width: 512
sourceSize.height: 512
fillMode: Image.PreserveAspectFit
}
}
// track information
ColumnLayout {
Layout.fillWidth: true
Layout.fillHeight: true
Label {
id: mainLabel
text: info.title ? info.title : i18n("No media playing")
textFormat: Text.PlainText
wrapMode: Text.Wrap
Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft
Layout.fillWidth: true
horizontalAlignment: Text.AlignLeft
elide: Text.ElideRight
maximumLineCount: 1
// Hardcoded because the footerbar blur always makes a dark-ish
// background, so we don't want to use a color scheme color that
// might also be dark
color: "white"
font.weight: Font.Bold
}
Label {
id: authorLabel
text: info.artist ? info.artist : info.channel
textFormat: Text.PlainText
wrapMode: Text.Wrap
Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft
Layout.fillWidth: true
horizontalAlignment: Text.AlignLeft
elide: Text.ElideRight
maximumLineCount: 1
// Hardcoded because the footerbar blur always makes a dark-ish
// background, so we don't want to use a color scheme color that
// might also be dark
color: "white"
}
}
}
MouseArea {
id: trackClick
anchors.fill: parent
hoverEnabled: true
onClicked: root.requestOpen()
}
}
RowLayout {
visible: root.isWidescreen
Layout.preferredWidth: 0
Layout.fillHeight: true
Layout.fillWidth: true
Layout.leftMargin: Kirigami.Units.largeSpacing
Layout.rightMargin: Kirigami.Units.largeSpacing
spacing: Kirigami.Units.smallSpacing
Label {
Layout.alignment: Qt.AlignVCenter
color: "white"
visible: info.title
text: PlayerUtils.formatTimestamp(audio.position)
}
Slider {
Layout.alignment: Qt.AlignVCenter
Layout.fillWidth: true
from: 0
to: audio.duration
value: audio.position
enabled: audio.seekable
onMoved: {
console.log("Value:", value);
audio.seek(Math.floor(value));
}
Behavior on value {
NumberAnimation {
duration: 1000
}
}
}
Label {
Layout.alignment: Qt.AlignVCenter
color: "white"
visible: info.title
text: PlayerUtils.formatTimestamp(audio.duration)
}
}
ToolButton {
id: playPauseButton
Layout.preferredHeight: Kirigami.Units.gridUnit * 3
Layout.maximumWidth: height
Layout.preferredWidth: height
enabled: info.audioUrl != ""
onClicked: audio.playbackState === Audio.PlayingState ? audio.pause() : audio.play()
icon.name: audio.playbackState === Audio.PlayingState ? "media-playback-pause" : "media-playback-start"
icon.width: Kirigami.Units.gridUnit
icon.height: Kirigami.Units.gridUnit
icon.color: "white"
Kirigami.Theme.colorSet: Kirigami.Theme.Complementary
Kirigami.Theme.inherit: false
}
ToolButton {
id: skipForwardButton
Layout.rightMargin: Math.floor(Kirigami.Units.smallSpacing / 2)
Layout.preferredHeight: Kirigami.Units.gridUnit * 3
Layout.maximumWidth: height
Layout.preferredWidth: height
enabled: UserPlaylistModel.canSkip
onClicked: UserPlaylistModel.next()
icon.name: "media-skip-forward"
icon.width: Kirigami.Units.gridUnit
icon.height: Kirigami.Units.gridUnit
icon.color: "white"
Kirigami.Theme.colorSet: Kirigami.Theme.Complementary
Kirigami.Theme.inherit: false
}
}
}
+366 -224
View File
@@ -1,280 +1,422 @@
// SPDX-FileCopyrightText: 2021 Jonah Brüchert <[email protected]>
// SPDX-FileCopyrightText: 2021 Bart De Vries <[email protected]>
// SPDX-FileCopyrightText: 2020-2022 Devin Lin <[email protected]>
//
// SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
import QtQuick 2.7
import QtQuick.Layouts 1.3
import QtQuick.Controls 2.12 as Controls
import QtMultimedia 5.12
import QtGraphicalEffects 1.0
import org.kde.kirigami 2.12 as Kirigami
import org.kde.ytmusic 1.0
import QtMultimedia 5.12
Item {
Flickable {
id: footerItem
property bool maximized: false
readonly property int progressBarHeight: Kirigami.Units.gridUnit / 6
readonly property int minimizedPlayerContentHeight: Math.round(Kirigami.Units.gridUnit * 3.5)
readonly property int minimizedPlayerHeight: minimizedPlayerContentHeight + progressBarHeight
anchors.left: parent.left
anchors.right: parent.right
height: maximized ? applicationWindow().height : 75
Rectangle {
color: Kirigami.Theme.backgroundColor
Kirigami.Theme.colorSet: Kirigami.Theme.Window
anchors.fill: footerLayout
boundsBehavior: Flickable.StopAtBounds
function close() {
toClose.restart();
}
function resetToBoundsOnFlick() {
if (!atYBeginning || !atYEnd) {
if (footerItem.verticalVelocity > 0) {
toOpen.restart();
} else if (footerItem.verticalVelocity < 0) {
toClose.restart();
} else { // i.e. when verticalVelocity === 0
if (contentY > contentHeight / 4) {
toOpen.restart();
} else {
toClose.restart();
}
}
}
}
function resetToBoundsOnResize() {
if (contentY > contentHeight / 4) {
contentY = contentHeight / 2;
} else {
contentY = 0;
}
}
NumberAnimation on contentY {
id: toOpen
from: contentY
to: contentHeight / 2
duration: Kirigami.Units.longDuration * 2
easing.type: Easing.OutCubic
running: false
}
NumberAnimation on contentY {
id: toClose
from: contentY
to: 0
duration: Kirigami.Units.longDuration * 2
easing.type: Easing.OutCubic
running: false
}
// snap to end
MouseArea {
anchors.fill: footerLayout
propagateComposedEvents: true
onPressed: {
toOpen.stop();
toClose.stop();
propagateComposedEvents = true;
}
onReleased: footerItem.resetToBoundsOnFlick()
}
onMovementStarted: {
toOpen.stop();
toClose.stop();
}
onFlickStarted: resetToBoundsOnFlick()
onMovementEnded: resetToBoundsOnFlick()
onHeightChanged: resetToBoundsOnResize()
property var videoInfoExtractor: VideoInfoExtractor {
id: info
onSongChanged: audio.play()
videoId: UserPlaylistModel.currentVideoId
onTitleChanged: Library.addPlaybackHistoryItem(info.videoId, info.title)
}
property var audioPlayer: Audio {
id: audio
source: info.audioUrl
onStatusChanged: {
if (status === Audio.EndOfMedia) {
console.log("Song ended");
UserPlaylistModel.next();
}
}
}
contentHeight: height * 2
ColumnLayout {
id: footerLayout
height: parent.height
anchors.fill: parent
anchors.left: parent.left
anchors.right: parent.right
spacing: 0
GridLayout {
id: playerLayout
readonly property bool mobile: width > height
Layout.fillHeight: footerItem.maximized
// margin from top
Item {
Layout.minimumHeight: footerItem.height - footerItem.minimizedPlayerHeight
}
Controls.Control {
Layout.fillWidth: true
flow: width > height ? GridLayout.LeftToRight : GridLayout.TopToBottom
visible: footerItem.maximized
ColumnLayout {
Layout.preferredWidth: footerLayout.width * (playerLayout.mobile ? 1 : 0.5)
Layout.preferredHeight: footerLayout.height * (playerLayout.mobile ? 0.5 : 1)
Item {
Layout.fillWidth: true
Layout.fillHeight: true
Image {
anchors.fill: parent
source: info.thumbnail
fillMode: Image.PreserveAspectFit
}
}
Controls.RoundButton {
readonly property QtObject favouriteWatcher: Library.favouriteWatcher(info.videoId)
Layout.alignment: Qt.AlignHCenter
icon.name: favouriteWatcher ? (favouriteWatcher.isFavourite ? "starred-symbolic" : "non-starred-symbolic") : ""
onClicked: if (favouriteWatcher)
favouriteWatcher.isFavourite
? Library.removeFavourite(info.videoId)
: Library.addFavourite(info.videoId, info.title)
}
}
Item {
Layout.fillWidth: true
Layout.fillHeight: true
Layout.preferredWidth: footerLayout.width * (playerLayout.mobile ? 1 : 0.5)
Layout.preferredHeight: footerLayout.height * (playerLayout.mobile ? 0.5 : 1)
Controls.ScrollView {
padding: 0
implicitHeight: footerItem.minimizedPlayerHeight
// minimized player background
background: Item {
Rectangle {
anchors.fill: parent
color: Qt.rgba(25, 25, 30, 1)
}
Image {
opacity: 0.2
source: info.thumbnail
asynchronous: true
anchors.fill: parent
fillMode: Image.PreserveAspectCrop
}
layer.enabled: true
layer.effect: HueSaturation {
cached: true
ListView {
anchors.fill: parent
id: playlistView
lightness: -0.5
saturation: 1.9
clip: true
Controls.BusyIndicator {
anchors.centerIn: parent
visible: UserPlaylistModel.loading || UserPlaylistModel.loading
}
onCountChanged: {
if (count < 1) {
footerItem.maximized = false
}
}
model: UserPlaylistModel
delegate: Kirigami.SwipeListItem {
id: delegateItem
required property string title
required property string videoId
required property string artists
required property bool isCurrent
highlighted: isCurrent
onClicked: UserPlaylistModel.skipTo(videoId)
ColumnLayout {
Layout.fillWidth: true
Kirigami.Heading {
elide: Text.ElideRight
Layout.fillWidth: true
level: 2
text: title
}
Controls.Label {
elide: Text.ElideRight
Layout.fillWidth: true
text: artists
}
}
actions: [
Kirigami.Action {
text: i18n("Remove Track")
icon.name: "list-remove"
onTriggered: UserPlaylistModel.remove(delegateItem.videoId)
}
]
}
header: Controls.ToolBar {
anchors.left: parent.left
anchors.right: parent.right
RowLayout {
anchors.fill: parent
Item {
Layout.fillWidth: true
}
Controls.ToolButton {
text: i18n("Clear")
icon.name: "edit-clear-all"
onClicked: UserPlaylistModel.clear()
}
Controls.ToolButton {
text: i18n("Shuffle")
icon.name: "media-playlist-shuffle"
onClicked: UserPlaylistModel.shufflePlaylist()
}
}
}
layer.enabled: true
layer.effect: FastBlur {
cached: true
radius: 64
transparentBorder: false
}
}
}
MinimizedPlayerControls {
progressBarHeight: footerItem.progressBarHeight
minimizedPlayerContentHeight: footerItem.minimizedPlayerContentHeight
height: minimizedPlayerHeight
focus: true
anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
info: footerItem.videoInfoExtractor
audio: footerItem.audioPlayer
onRequestOpen: toOpen.start();
}
}
Kirigami.Separator {
MaximizedPlayerPage {
id: maximizedPlayerPage
Layout.fillWidth: true
Layout.fillHeight: true
implicitHeight: footerItem.height
info: footerItem.videoInfoExtractor
audio: footerItem.audioPlayer
onRequestClose: toClose.start();
}
//GridLayout {
//id: playerLayout
RowLayout {
id: player
//readonly property bool mobile: width > height
Layout.fillWidth: true
Layout.fillHeight: !footer.maximized
//Layout.fillHeight: footerItem.maximized
//Layout.fillWidth: true
//flow: width > height ? GridLayout.LeftToRight : GridLayout.TopToBottom
//visible: footerItem.maximized
VideoInfoExtractor {
id: info
//ColumnLayout {
//Layout.preferredWidth: footerLayout.width * (playerLayout.mobile ? 1 : 0.5)
//Layout.preferredHeight: footerLayout.height * (playerLayout.mobile ? 0.5 : 1)
onSongChanged: audio.play()
videoId: UserPlaylistModel.currentVideoId
onTitleChanged: Library.addPlaybackHistoryItem(info.videoId, info.title)
}
//Item {
//Layout.fillWidth: true
//Layout.fillHeight: true
Audio {
id: audio
//Image {
//anchors.fill: parent
//source: info.thumbnail
//fillMode: Image.PreserveAspectFit
//}
//}
//Controls.RoundButton {
//readonly property QtObject favouriteWatcher: Library.favouriteWatcher(info.videoId)
source: info.audioUrl
onStatusChanged: {
if (status === Audio.EndOfMedia) {
console.log("Song ended");
UserPlaylistModel.next();
}
}
}
//Layout.alignment: Qt.AlignHCenter
//icon.name: favouriteWatcher ? (favouriteWatcher.isFavourite ? "starred-symbolic" : "non-starred-symbolic") : ""
//onClicked: if (favouriteWatcher)
//favouriteWatcher.isFavourite
//? Library.removeFavourite(info.videoId)
//: Library.addFavourite(info.videoId, info.title)
//}
//}
Controls.ToolButton {
display: Controls.AbstractButton.IconOnly
Layout.preferredWidth: parent.height
Layout.fillHeight: true
enabled: info.audioUrl != ""
text: audio.playbackState === Audio.PlayingState ? i18n("Pause") : i18n("Play")
visible: !info.loading
icon.name: audio.playbackState === Audio.PlayingState ? "media-playback-pause" : "media-playback-start"
onClicked: audio.playbackState === Audio.PlayingState ? audio.pause() : audio.play()
}
//Item {
//Layout.fillWidth: true
//Layout.fillHeight: true
//Layout.preferredWidth: footerLayout.width * (playerLayout.mobile ? 1 : 0.5)
//Layout.preferredHeight: footerLayout.height * (playerLayout.mobile ? 0.5 : 1)
Controls.ToolButton {
display: Controls.AbstractButton.IconOnly
Layout.preferredWidth: parent.height
Layout.fillHeight: true
enabled: UserPlaylistModel.canSkip
visible: !info.loading
icon.name: "media-skip-forward"
onClicked: UserPlaylistModel.next()
}
//Controls.ScrollView {
//anchors.fill: parent
Controls.BusyIndicator {
Layout.fillHeight: true
visible: info.loading
}
//ListView {
//anchors.fill: parent
//id: playlistView
ColumnLayout {
Layout.fillHeight: true
Layout.topMargin: Kirigami.Units.smallSpacing
Layout.bottomMargin: Kirigami.Units.smallSpacing
//clip: true
Kirigami.Heading {
level: 3
Layout.fillWidth: true
elide: Qt.ElideRight
text: info.title ? info.title : i18n("No media playing")
}
//Controls.BusyIndicator {
//anchors.centerIn: parent
//visible: UserPlaylistModel.loading || UserPlaylistModel.loading
//}
RowLayout{
//onCountChanged: {
//if (count < 1) {
//footerItem.maximized = false
//}
//}
Controls.Label{
visible: info.title
text: PlayerUtils.formatTimestamp(audio.position)
}
//model: UserPlaylistModel
Controls.Slider {
Layout.fillWidth: true
from: 0
to: audio.duration
value: audio.position
enabled: audio.seekable
onMoved: {
console.log("Value:", value);
audio.seek(Math.floor(value));
}
//delegate: Kirigami.SwipeListItem {
//id: delegateItem
//required property string title
//required property string videoId
//required property string artists
//required property bool isCurrent
Behavior on value {
NumberAnimation {
duration: 1000
}
//highlighted: isCurrent
//onClicked: UserPlaylistModel.skipTo(videoId)
}
//ColumnLayout {
//Layout.fillWidth: true
//Kirigami.Heading {
//elide: Text.ElideRight
//Layout.fillWidth: true
//level: 2
//text: title
//}
}
//Controls.Label {
//elide: Text.ElideRight
//Layout.fillWidth: true
//text: artists
//}
//}
Controls.Label{
visible: info.title
text: PlayerUtils.formatTimestamp(audio.duration)
}
//actions: [
//Kirigami.Action {
//text: i18n("Remove Track")
//icon.name: "list-remove"
//onTriggered: UserPlaylistModel.remove(delegateItem.videoId)
//}
//]
//}
}
//header: Controls.ToolBar {
//anchors.left: parent.left
//anchors.right: parent.right
//RowLayout {
//anchors.fill: parent
//Item {
//Layout.fillWidth: true
//}
//Controls.ToolButton {
//text: i18n("Clear")
//icon.name: "edit-clear-all"
//onClicked: UserPlaylistModel.clear()
//}
//Controls.ToolButton {
//text: i18n("Shuffle")
//icon.name: "media-playlist-shuffle"
//onClicked: UserPlaylistModel.shufflePlaylist()
//}
//}
//}
//}
//}
//}
//}
//Kirigami.Separator {
//Layout.fillWidth: true
//}
//RowLayout {
//id: player
//Layout.fillWidth: true
//Layout.fillHeight: !footer.maximized
//Controls.ToolButton {
//display: Controls.AbstractButton.IconOnly
//Layout.preferredWidth: parent.height
//Layout.fillHeight: true
//enabled: info.audioUrl != ""
//text: audio.playbackState === Audio.PlayingState ? i18n("Pause") : i18n("Play")
//visible: !info.loading
//icon.name: audio.playbackState === Audio.PlayingState ? "media-playback-pause" : "media-playback-start"
//onClicked: audio.playbackState === Audio.PlayingState ? audio.pause() : audio.play()
//}
//Controls.ToolButton {
//display: Controls.AbstractButton.IconOnly
//Layout.preferredWidth: parent.height
//Layout.fillHeight: true
//enabled: UserPlaylistModel.canSkip
//visible: !info.loading
//icon.name: "media-skip-forward"
//onClicked: UserPlaylistModel.next()
//}
//Controls.BusyIndicator {
//Layout.fillHeight: true
//visible: info.loading
//}
//ColumnLayout {
//Layout.fillHeight: true
//Layout.topMargin: Kirigami.Units.smallSpacing
//Layout.bottomMargin: Kirigami.Units.smallSpacing
//Kirigami.Heading {
//level: 3
//Layout.fillWidth: true
//elide: Qt.ElideRight
//text: info.title ? info.title : i18n("No media playing")
//}
//RowLayout{
//Controls.Label{
//visible: info.title
//text: PlayerUtils.formatTimestamp(audio.position)
//}
//Controls.Slider {
//Layout.fillWidth: true
//from: 0
//to: audio.duration
//value: audio.position
//enabled: audio.seekable
//onMoved: {
//console.log("Value:", value);
//audio.seek(Math.floor(value));
//}
//Behavior on value {
//NumberAnimation {
//duration: 1000
//}
//}
//}
//Controls.Label{
//visible: info.title
//text: PlayerUtils.formatTimestamp(audio.duration)
//}
//}
}
//}
Controls.ToolButton {
display: Controls.AbstractButton.IconOnly
Layout.preferredWidth: parent.height
text: i18n("Expand")
enabled: playlistView.count > 0
Layout.fillHeight: true
icon.name: footerItem.maximized ? "arrow-down" : "arrow-up"
onClicked: footerItem.maximized = !footerItem.maximized
}
//Controls.ToolButton {
//display: Controls.AbstractButton.IconOnly
//Layout.preferredWidth: parent.height
//text: i18n("Expand")
//enabled: playlistView.count > 0
//Layout.fillHeight: true
//icon.name: footerItem.maximized ? "arrow-down" : "arrow-up"
//onClicked: footerItem.maximized = !footerItem.maximized
//}
}
//}
}
Behavior on height {
NumberAnimation {
}
}
//Behavior on height {
//NumberAnimation {
//}
//}
}
+11 -4
View File
@@ -15,7 +15,6 @@ Kirigami.ApplicationWindow {
property alias searchField: searchField
header: Controls.Control {
visible: !footer.maximized
padding: Kirigami.Units.largeSpacing
background: Rectangle {
@@ -93,8 +92,6 @@ Kirigami.ApplicationWindow {
title: i18n("AudioTube")
controlsVisible: !footer.maximized
contextDrawer: Kirigami.ContextDrawer {
id: contextDrawer
}
@@ -122,6 +119,16 @@ Kirigami.ApplicationWindow {
showPassiveNotification(error)
}
}
pageStack.anchors.bottomMargin: playerFooter.minimizedPlayerHeight + 1
footer: PlayerFooter {}
// media player
PlayerFooter {
id: playerFooter
anchors.topMargin: -root.header.height
anchors.fill: parent
// only expand flicking area to full screen when it is open
z: (contentY === 0) ? -1 : 999
}
}
+9 -46
View File
@@ -40,16 +40,7 @@ Library &Library::instance()
FavouritesModel *Library::favourites()
{
auto future = mapFuture<Rows, std::vector<Song>>(
m_database->getResults("select * from favourites natural join songs"),
[](auto rows)
{
std::vector<Song> songs;
ranges::transform(parseRows<QString, QString, QString, QString>(rows),
std::back_inserter(songs),
Song::fromSql);
return songs;
});
auto future = m_database->getResults<Song>("select * from favourites natural join songs");
return new FavouritesModel(std::move(future), this);
}
@@ -75,16 +66,7 @@ FavouriteWatcher *Library::favouriteWatcher(const QString &videoId)
SearchHistoryModel *Library::searches()
{
return new SearchHistoryModel(mapFuture<Rows, std::vector<QString>>(
m_database->getResults("select (search_query) from searches order by search_id desc"),
[](const auto &rows)
{
std::vector<QString> out;
ranges::transform(rows, std::back_inserter(out), [](auto row) {
return row[0].toString();
});
return out;
}), this);
return new SearchHistoryModel(m_database->getResults<SingleValue<QString>>("select (search_query) from searches order by search_id desc"), this);
}
void Library::addSearch(const QString &text)
@@ -94,16 +76,7 @@ void Library::addSearch(const QString &text)
PlaybackHistoryModel *Library::playbackHistory()
{
auto future = mapFuture<Rows, std::vector<PlayedSong>>(
m_database->getResults("select * from played_songs natural join songs"),
[](auto rows)
{
std::vector<PlayedSong> playedSongs;
ranges::transform(parseRows<QString, int, QString, QString, QString>(rows),
std::back_inserter(playedSongs),
PlayedSong::fromSql);
return playedSongs;
});
auto future = m_database->getResults<PlayedSong>("select * from played_songs natural join songs");
return new PlaybackHistoryModel(std::move(future), this);
}
@@ -118,16 +91,7 @@ void Library::addPlaybackHistoryItem(const QString &videoId, const QString &titl
PlaybackHistoryModel *Library::mostPlayed()
{
auto future = mapFuture<Rows, std::vector<PlayedSong>>(
m_database->getResults("select * from played_songs natural join songs order by plays desc limit 10"),
[](auto rows)
{
std::vector<PlayedSong> playedSongs;
ranges::transform(parseRows<QString, int, QString, QString, QString>(rows),
std::back_inserter(playedSongs),
PlayedSong::fromSql);
return playedSongs;
});
auto future = m_database->getResults<PlayedSong>("select * from played_songs natural join songs order by plays desc limit 10");
return new PlaybackHistoryModel(std::move(future), this);
}
@@ -247,10 +211,9 @@ FavouriteWatcher::FavouriteWatcher(Library *library, const QString &videoId)
: QObject(library), m_videoId(videoId), m_library(library)
{
auto update = [this] {
connectFuture(m_library->database().getResult("select count(*) from favourites where video_id = ?", m_videoId), this, [this](auto row) {
if (row) {
auto [favCount] = parseRow<int>(*row);
m_isFavourite = favCount > 0;
connectFuture(m_library->database().getResult<SingleValue<int>>("select count(*) from favourites where video_id = ?", m_videoId), this, [this](auto count) {
if (count) {
m_isFavourite = count->value > 0;
Q_EMIT isFavouriteChanged();
}
});
@@ -263,7 +226,7 @@ bool FavouriteWatcher::isFavourite() const {
return m_isFavourite;
}
SearchHistoryModel::SearchHistoryModel(QFuture<std::vector<QString>> &&historyFuture, QObject *parent)
SearchHistoryModel::SearchHistoryModel(QFuture<std::vector<SingleValue<QString>>> &&historyFuture, QObject *parent)
: QAbstractListModel(parent)
{
connectFuture(historyFuture, this, [this](const auto history) {
@@ -280,7 +243,7 @@ int SearchHistoryModel::rowCount(const QModelIndex &parent) const {
QVariant SearchHistoryModel::data(const QModelIndex &index, int role) const {
switch (role) {
case Qt::DisplayRole:
return m_history[index.row()];
return m_history[index.row()].value;
}
Q_UNREACHABLE();
+8 -4
View File
@@ -17,7 +17,9 @@
class FavouriteWatcher;
struct Song {
static Song fromSql(std::tuple<QString, QString, QString, QString> tuple) {
using ColumnTypes = std::tuple<QString, QString, QString, QString>;
static Song fromSql(ColumnTypes tuple) {
auto [videoId, title, artist, album] = tuple;
return Song {videoId, title, artist, album};
}
@@ -49,7 +51,9 @@ private:
};
struct PlayedSong {
static PlayedSong fromSql(std::tuple<QString, int, QString, QString, QString> tuple) {
using ColumnTypes = std::tuple<QString, int, QString, QString, QString>;
static PlayedSong fromSql(ColumnTypes tuple) {
auto [videoId, plays, title, artist, album] = tuple;
return PlayedSong {videoId, title, artist, album, plays};
}
@@ -86,12 +90,12 @@ class SearchHistoryModel : public QAbstractListModel {
Q_OBJECT
public:
SearchHistoryModel(QFuture<std::vector<QString> > &&historyFuture, QObject *parent = nullptr);
SearchHistoryModel(QFuture<std::vector<SingleValue<QString>>> &&historyFuture, QObject *parent = nullptr);
int rowCount(const QModelIndex &parent) const override;
QVariant data(const QModelIndex &index, int role) const override;
private:
std::vector<QString> m_history;
std::vector<SingleValue<QString>> m_history;
};
class Library : public QObject
+2
View File
@@ -14,6 +14,8 @@ SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted
<file alias="PlaylistPage.qml">contents/ui/PlaylistPage.qml</file>
<file alias="ConfirmationMessage.qml">contents/ui/ConfirmationMessage.qml</file>
<file alias="LibraryPage.qml">contents/ui/LibraryPage.qml</file>
<file alias="MinimizedPlayerControls.qml">contents/ui/MinimizedPlayerControls.qml</file>
<file alias="MaximizedPlayerPage.qml">contents/ui/MaximizedPlayerPage.qml</file>
<file>migrations/2022-05-20-194850_init/down.sql</file>
<file>migrations/2022-05-20-194850_init/up.sql</file>
</qresource>
+14
View File
@@ -17,6 +17,8 @@ VideoInfoExtractor::VideoInfoExtractor(QObject *parent)
m_videoInfo = {};
Q_EMIT audioUrlChanged();
Q_EMIT titleChanged();
Q_EMIT artistChanged();
Q_EMIT channelChanged();
Q_EMIT songChanged();
Q_EMIT thumbnailChanged();
return;
@@ -30,6 +32,8 @@ VideoInfoExtractor::VideoInfoExtractor(QObject *parent)
setLoading(false);
Q_EMIT audioUrlChanged();
Q_EMIT titleChanged();
Q_EMIT artistChanged();
Q_EMIT channelChanged();
Q_EMIT songChanged();
Q_EMIT thumbnailChanged();
});
@@ -81,6 +85,16 @@ QString VideoInfoExtractor::title() const
return QString::fromStdString(m_videoInfo.title);
}
QString VideoInfoExtractor::artist() const
{
return QString::fromStdString(m_videoInfo.artist);
}
QString VideoInfoExtractor::channel() const
{
return QString::fromStdString(m_videoInfo.channel);
}
QString VideoInfoExtractor::thumbnail() const
{
return QString::fromStdString(m_videoInfo.thumbnail);
+8
View File
@@ -17,6 +17,8 @@ class VideoInfoExtractor : public QObject
Q_PROPERTY(QUrl audioUrl READ audioUrl NOTIFY audioUrlChanged)
Q_PROPERTY(QString title READ title NOTIFY titleChanged)
Q_PROPERTY(QString artist READ artist NOTIFY artistChanged) // may be empty if it is a video
Q_PROPERTY(QString channel READ channel NOTIFY channelChanged)
Q_PROPERTY(QString thumbnail READ thumbnail NOTIFY thumbnailChanged)
Q_PROPERTY(bool loading READ loading WRITE setLoading NOTIFY loadingChanged)
@@ -32,6 +34,12 @@ public:
QString title() const;
Q_SIGNAL void titleChanged();
QString artist() const;
Q_SIGNAL void artistChanged();
QString channel() const;
Q_SIGNAL void channelChanged();
QString thumbnail() const;
Q_SIGNAL void thumbnailChanged();
+3 -1
View File
@@ -460,10 +460,12 @@ video_info::VideoInfo YTMusic::extract_video_info(const std::string &video_id) c
using namespace pybind11::literals;
const auto info = d->get_ytdl().attr("extract_info")(video_id, "download"_a=py::bool_(false));
return {
info["id"].cast<std::string>(),
info["title"].cast<std::string>(),
info.contains("artist") ? info["artist"].cast<std::string>() : "",
info.contains("channel") ? info["channel"].cast<std::string>() : "",
extract_py_list<video_info::Format>(info["formats"]),
info["thumbnail"].cast<std::string>()
};
+2
View File
@@ -241,6 +241,8 @@ struct Format {
struct VideoInfo {
std::string id;
std::string title;
std::string artist;
std::string channel;
std::vector<Format> formats;
std::string thumbnail;