Merge lp:~nik90/podbird/add-batch-actions into lp:podbird/devel

Proposed by Nekhelesh Ramananthan
Status: Merged
Merged at revision: 134
Proposed branch: lp:~nik90/podbird/add-batch-actions
Merge into: lp:podbird/devel
Prerequisite: lp:~nik90/podbird/migrate-to-download-manager
Diff against target: 685 lines (+315/-134)
7 files modified
app/components/CustomSectionHeader.qml (+47/-0)
app/podbird.qml (+2/-2)
app/podcasts.js (+1/-0)
app/ui/EpisodesPage.qml (+2/-2)
app/ui/EpisodesTab.qml (+209/-90)
app/ui/Queue.qml (+0/-6)
po/podbird.nik90.pot (+54/-34)
To merge this branch: bzr merge lp:~nik90/podbird/add-batch-actions
Reviewer Review Type Date Requested Status
Podbird Developers Pending
Review via email: mp+289237@code.launchpad.net

Description of the change

- Adds multiselect list view which allows users to quickly add/mark episodes as favourites, listened, add-to-queue, download, delete.
- Also fixes a bug where playlist doesn't show metadata of locally saved episodes.

To post a comment you must log in.
lp:~nik90/podbird/add-batch-actions updated
145. By Nekhelesh Ramananthan

removed unneeded select all signal

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added file 'app/components/CustomSectionHeader.qml'
2--- app/components/CustomSectionHeader.qml 1970-01-01 00:00:00 +0000
3+++ app/components/CustomSectionHeader.qml 2016-03-16 15:35:46 +0000
4@@ -0,0 +1,47 @@
5+/*
6+ * Copyright 2016 Podbird Team
7+ *
8+ * This file is part of Podbird.
9+ *
10+ * Podbird is free software; you can redistribute it and/or modify
11+ * it under the terms of the GNU General Public License as published by
12+ * the Free Software Foundation; version 3.
13+ *
14+ * Podbird is distributed in the hope that it will be useful,
15+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
16+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17+ * GNU General Public License for more details.
18+ *
19+ * You should have received a copy of the GNU General Public License
20+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
21+ */
22+
23+import QtQuick 2.4
24+import Ubuntu.Components 1.3
25+
26+Item {
27+ id: customSectionHeader
28+
29+ property alias title: headerText.text
30+
31+ height: headerText.text !== "" ? headerText.implicitHeight + divider.height + headerText.anchors.topMargin + headerText.anchors.bottomMargin
32+ : units.gu(0)
33+
34+ anchors { left: parent.left; right: parent.right; margins: units.gu(2) }
35+
36+ Label {
37+ id: headerText
38+ color: podbird.appTheme.baseText
39+ font.weight: Font.DemiBold
40+ anchors { top: parent.top; topMargin: units.gu(2); bottom: parent.bottom; bottomMargin: units.gu(2) }
41+ width: parent.width
42+ }
43+
44+ Rectangle {
45+ id: divider
46+ color: settings.themeName === "Dark.qml" ? "#888888" : "#cdcdcd"
47+ width: parent.width
48+ height: units.dp(1)
49+ anchors.bottom: parent.bottom
50+ }
51+}
52
53=== modified file 'app/podbird.qml'
54--- app/podbird.qml 2016-03-16 15:35:46 +0000
55+++ app/podbird.qml 2016-03-16 15:35:46 +0000
56@@ -221,16 +221,16 @@
57 Podcasts.clearQueue()
58
59 // Add episode to queue
60- player.playlist.addItem(Qt.resolvedUrl(url))
61 Podcasts.addItemToQueue(guid, image, name, artist, url)
62+ player.playlist.addItem(url)
63
64 // Play episode
65 player.play()
66 }
67
68 function addEpisodeToQueue(guid, image, name, artist, url) {
69- player.playlist.addItem(Qt.resolvedUrl(url))
70 Podcasts.addItemToQueue(guid, image, name, artist, url)
71+ player.playlist.addItem(url)
72
73 // If added episode is the first one in the queue, then set the current metadata
74 // so that the bottom player controls will be shown, allowing the user to play
75
76=== modified file 'app/podcasts.js'
77--- app/podcasts.js 2016-03-16 15:35:46 +0000
78+++ app/podcasts.js 2016-03-16 15:35:46 +0000
79@@ -49,6 +49,7 @@
80 var rs = tx.executeSql("INSERT OR REPLACE INTO Queue (ind, guid, image, name, artist, url) VALUES (?, ?, ?, ?, ?, ?)", [ind, guid, image, name, artist, url]);
81 if (rs.rowsAffected > 0) {
82 console.log("[LOG]: QUEUE add OK")
83+ console.log("[LOG]: URL Added to queue: " + url)
84 } else {
85 console.log("[LOG]: QUEUE add FAIL")
86 }
87
88=== modified file 'app/ui/EpisodesPage.qml'
89--- app/ui/EpisodesPage.qml 2016-03-16 15:35:46 +0000
90+++ app/ui/EpisodesPage.qml 2016-03-16 15:35:46 +0000
91@@ -518,7 +518,7 @@
92 Action {
93 iconName: "add-to-playlist"
94 onTriggered: {
95- var url = model.downloadedfile ? model.downloadedfile : model.audiourl
96+ var url = model.downloadedfile ? "file://" + model.downloadedfile : model.audiourl
97 player.addEpisodeToQueue(model.guid, model.image, model.name, model.artist, url)
98 }
99 },
100@@ -550,7 +550,7 @@
101 onClicked: {
102 Haptics.play()
103 if (currentGuid !== model.guid) {
104- currentUrl = model.downloadedfile ? model.downloadedfile : model.audiourl;
105+ currentUrl = model.downloadedfile ? "file://" + model.downloadedfile : model.audiourl;
106 player.playEpisode(model.guid, model.image, model.name, model.artist, currentUrl)
107 }
108 }
109
110=== modified file 'app/ui/EpisodesTab.qml'
111--- app/ui/EpisodesTab.qml 2016-03-16 15:35:46 +0000
112+++ app/ui/EpisodesTab.qml 2016-03-16 15:35:46 +0000
113@@ -64,62 +64,6 @@
114 episodesPage.header = searchHeader
115 searchField.item.forceActiveFocus()
116 }
117- },
118-
119- Action {
120- iconName: "select"
121- visible: episodesPageHeaderSections.selectedIndex === 0
122- text: i18n.tr("Mark all listened")
123- onTriggered: {
124- var db = Podcasts.init();
125- db.transaction(function (tx) {
126- for (var i=0; i<episodesModel.count; i++) {
127- tx.executeSql("UPDATE Episode SET listened=1 WHERE guid=?", [episodesModel.get(i).guid]);
128- }
129- episodesModel.clear()
130- });
131- }
132- },
133-
134- Action {
135- iconName: "save"
136- visible: episodesPageHeaderSections.selectedIndex !== 1
137- text: i18n.tr("Download all")
138- onTriggered: {
139- var db = Podcasts.init();
140- db.transaction(function (tx) {
141- for (var i=0; i<episodesModel.count; i++) {
142- if (!episodesModel.get(i).downloadedfile) {
143- episodesModel.setProperty(i, "queued", 1)
144- tx.executeSql("UPDATE Episode SET queued=1 WHERE guid = ?", [episodesModel.get(i).guid]);
145- if (episodesModel.get(i).audiourl) {
146- podbird.downloadEpisode(episodesModel.get(i).image, episodesModel.get(i).name, episodesModel.get(i).guid, episodesModel.get(i).audiourl)
147- } else {
148- console.log("[ERROR]: Invalid download url: " + episodesModel.get(i).audiourl)
149- }
150- }
151- }
152- });
153- }
154- },
155-
156- Action {
157- iconName: "delete"
158- text: i18n.tr("Delete all")
159- visible: episodesPageHeaderSections.selectedIndex === 1
160- onTriggered: {
161- var db = Podcasts.init();
162- db.transaction(function (tx) {
163- for (var i=0; i<episodesModel.count; i++) {
164- if (episodesModel.get(i).downloadedfile) {
165- fileManager.deleteFile(episodesModel.get(i).downloadedfile);
166- tx.executeSql("UPDATE Episode SET downloadedfile = NULL WHERE guid = ?", [episodesModel.get(i).guid]);
167- episodesModel.setProperty(i, "downloadedfile", "")
168- }
169- }
170- });
171- refreshModel();
172- }
173 }
174 ]
175
176@@ -177,6 +121,169 @@
177 }
178 }
179
180+ PageHeader {
181+ id: selectionHeader
182+ visible: episodeList.ViewItems.selectMode
183+
184+ onVisibleChanged: {
185+ if (visible) {
186+ episodesPage.header = selectionHeader
187+ }
188+ }
189+
190+ StyleHints {
191+ backgroundColor: podbird.appTheme.background
192+ }
193+
194+ leadingActionBar.actions: [
195+ Action {
196+ iconName: "back"
197+ text: i18n.tr("Back")
198+ onTriggered: {
199+ episodeList.closeSelection()
200+ }
201+ }
202+ ]
203+
204+ trailingActionBar {
205+ numberOfSlots: 6
206+ actions: [
207+ Action {
208+ iconName: "select"
209+ text: i18n.tr("Mark Listened")
210+ enabled: episodeList.ViewItems.selectedIndices.length !== 0
211+ onTriggered: {
212+ var db = Podcasts.init();
213+ db.transaction(function (tx) {
214+ for (var i=0; i<episodeList.ViewItems.selectedIndices.length; i++) {
215+ var index = episodeList.ViewItems.selectedIndices[i]
216+ tx.executeSql("UPDATE Episode SET listened=1 WHERE guid=?", [episodesModel.get(index).guid]);
217+ }
218+ });
219+
220+ refreshModel();
221+ episodeList.closeSelection()
222+ }
223+ },
224+
225+ Action {
226+ iconName: "save"
227+ text: i18n.tr("Download episode(s)")
228+ enabled: episodeList.ViewItems.selectedIndices.length !== 0
229+ visible: episodesPageHeaderSections.selectedIndex !== 1
230+
231+ onTriggered: {
232+ var db = Podcasts.init();
233+ db.transaction(function (tx) {
234+ for (var i=0; i<episodeList.ViewItems.selectedIndices.length; i++) {
235+ var index = episodeList.ViewItems.selectedIndices[i]
236+ if (!episodesModel.get(index).downloadedfile) {
237+ episodesModel.setProperty(index, "queued", 1)
238+ tx.executeSql("UPDATE Episode SET queued=1 WHERE guid = ?", [episodesModel.get(index).guid]);
239+ if (episodesModel.get(index).audiourl) {
240+ podbird.downloadEpisode(episodesModel.get(index).image, episodesModel.get(index).name, episodesModel.get(index).guid, episodesModel.get(index).audiourl)
241+ } else {
242+ console.log("[ERROR]: Invalid download url: " + episodesModel.get(index).audiourl)
243+ }
244+ }
245+ }
246+ });
247+
248+ refreshModel();
249+ episodeList.closeSelection()
250+ }
251+ },
252+
253+ Action {
254+ iconName: "delete"
255+ text: i18n.tr("Delete episode(s)")
256+ enabled: episodeList.ViewItems.selectedIndices.length !== 0
257+
258+ onTriggered: {
259+ var db = Podcasts.init();
260+ db.transaction(function (tx) {
261+ for (var i=0; i<episodeList.ViewItems.selectedIndices.length; i++) {
262+ var index = episodeList.ViewItems.selectedIndices[i]
263+ if (episodesModel.get(index).downloadedfile) {
264+ fileManager.deleteFile(episodesModel.get(index).downloadedfile);
265+ tx.executeSql("UPDATE Episode SET downloadedfile = NULL WHERE guid = ?", [episodesModel.get(index).guid]);
266+ episodesModel.setProperty(index, "downloadedfile", "")
267+ }
268+ }
269+ });
270+
271+ refreshModel();
272+ episodeList.closeSelection()
273+ }
274+ },
275+
276+ Action {
277+ iconName: "like"
278+ text: i18n.tr("Favourite episode(s)")
279+ visible: episodesPageHeaderSections.selectedIndex !== 2
280+ enabled: episodeList.ViewItems.selectedIndices.length !== 0
281+
282+ onTriggered: {
283+ var db = Podcasts.init();
284+ db.transaction(function (tx) {
285+ for (var i=0; i<episodeList.ViewItems.selectedIndices.length; i++) {
286+ var index = episodeList.ViewItems.selectedIndices[i]
287+ if (!episodesModel.get(index).favourited) {
288+ tx.executeSql("UPDATE Episode SET favourited=1 WHERE guid=?", [episodesModel.get(index).guid])
289+ episodesModel.setProperty(index, "favourited", 1)
290+ }
291+ }
292+ });
293+
294+ refreshModel();
295+ episodeList.closeSelection()
296+ }
297+ },
298+
299+ Action {
300+ iconName: "unlike"
301+ text: i18n.tr("Unfavourite episode(s)")
302+ visible: episodesPageHeaderSections.selectedIndex === 2
303+ enabled: episodeList.ViewItems.selectedIndices.length !== 0
304+
305+ onTriggered: {
306+ var db = Podcasts.init();
307+ db.transaction(function (tx) {
308+ for (var i=0; i<episodeList.ViewItems.selectedIndices.length; i++) {
309+ var index = episodeList.ViewItems.selectedIndices[i]
310+ if (episodesModel.get(index).favourited) {
311+ tx.executeSql("UPDATE Episode SET favourited=0 WHERE guid=?", [episodesModel.get(index).guid])
312+ episodesModel.setProperty(index, "favourited", 0)
313+ }
314+ }
315+ });
316+
317+ refreshModel();
318+ episodeList.closeSelection()
319+ }
320+ },
321+
322+ Action {
323+ iconName: "add-to-playlist"
324+ text: i18n.tr("Add to queue")
325+ enabled: episodeList.ViewItems.selectedIndices.length !== 0
326+
327+ onTriggered: {
328+ for (var i=0; i<episodeList.ViewItems.selectedIndices.length; i++) {
329+ var index = episodeList.ViewItems.selectedIndices[i]
330+ if (episodesModel.get(index).audiourl) {
331+ var url = episodesModel.get(index).downloadedfile ? "file://" + episodesModel.get(index).downloadedfile : episodesModel.get(index).audiourl
332+ player.addEpisodeToQueue(episodesModel.get(index).guid, episodesModel.get(index).image, episodesModel.get(index).name, episodesModel.get(index).artist, url)
333+ }
334+ }
335+
336+ episodeList.closeSelection()
337+ }
338+ }
339+ ]
340+ }
341+ }
342+
343 Loader {
344 id: emptyState
345
346@@ -319,6 +426,9 @@
347 ListView {
348 id: episodeList
349
350+ signal clearSelection()
351+ signal closeSelection()
352+
353 Component.onCompleted: {
354 // FIXME: workaround for qtubuntu not returning values depending on the grid unit definition
355 // for Flickable.maximumFlickVelocity and Flickable.flickDeceleration
356@@ -342,8 +452,8 @@
357 visible: height !== 0
358 height: downloader.downloads.length > 0 && episodesPageHeaderSections.selectedIndex === 1 ? childrenRect.height : 0
359
360- HeaderListItem {
361- title.text: i18n.tr("Downloads in progress")
362+ CustomSectionHeader {
363+ title: i18n.tr("Downloads in progress")
364 }
365
366 Repeater {
367@@ -382,40 +492,31 @@
368 }
369 }
370
371- HeaderListItem {
372- title.text: i18n.tr("Downloaded episodes")
373+ CustomSectionHeader {
374+ title: i18n.tr("Downloaded episodes")
375 visible: sortedEpisodeModel.count !== 0 || episodesModel.count !== 0
376 }
377 }
378
379 section.property: "diff"
380 section.labelPositioning: ViewSection.InlineLabels
381- section.delegate: ListItem {
382- height: headerText.title.text !== "" ? headerText.height + divider.height : units.gu(0)
383- divider.anchors.leftMargin: units.gu(2)
384- divider.anchors.rightMargin: units.gu(2)
385-
386- ListItemLayout {
387- id: headerText
388- title.text: {
389- if (section === "Today") {
390- return i18n.tr("Today")
391- }
392-
393- else if (section === "Yesterday") {
394- return i18n.tr("Yesterday")
395- }
396-
397- else if (section === "Older") {
398- return i18n.tr("Older")
399- }
400-
401- else {
402- return ""
403- }
404- }
405- title.color: podbird.appTheme.baseText
406- title.font.weight: Font.DemiBold
407+ section.delegate: CustomSectionHeader {
408+ title: {
409+ if (section === "Today") {
410+ return i18n.tr("Today")
411+ }
412+
413+ else if (section === "Yesterday") {
414+ return i18n.tr("Yesterday")
415+ }
416+
417+ else if (section === "Older") {
418+ return i18n.tr("Older")
419+ }
420+
421+ else {
422+ return ""
423+ }
424 }
425 }
426
427@@ -526,7 +627,7 @@
428 Action {
429 iconName: "add-to-playlist"
430 onTriggered: {
431- var url = model.downloadedfile ? model.downloadedfile : model.audiourl
432+ var url = model.downloadedfile ? "file://" + model.downloadedfile : model.audiourl
433 player.addEpisodeToQueue(model.guid, model.image, model.name, model.artist, url)
434 }
435 },
436@@ -563,11 +664,29 @@
437
438 onClicked: {
439 Haptics.play()
440- if (currentGuid !== model.guid) {
441- currentUrl = model.downloadedfile ? model.downloadedfile : model.audiourl;
442- player.playEpisode(model.guid, model.image, model.name, model.artist, currentUrl)
443+ if (selectMode) {
444+ selected = !selected
445+ } else {
446+ if (currentGuid !== model.guid) {
447+ currentUrl = model.downloadedfile ? "file://" + model.downloadedfile : model.audiourl;
448+ player.playEpisode(model.guid, model.image, model.name, model.artist, currentUrl)
449+ }
450 }
451 }
452+
453+ onPressAndHold: {
454+ ListView.view.ViewItems.selectMode = !ListView.view.ViewItems.selectMode
455+ }
456+ }
457+
458+ onClearSelection: {
459+ ViewItems.selectedIndices = []
460+ }
461+
462+ onCloseSelection: {
463+ clearSelection()
464+ ViewItems.selectMode = false
465+ episodesPage.header = standardHeader
466 }
467
468 Scrollbar {
469
470=== modified file 'app/ui/Queue.qml'
471--- app/ui/Queue.qml 2016-03-13 23:53:33 +0000
472+++ app/ui/Queue.qml 2016-03-16 15:35:46 +0000
473@@ -69,13 +69,7 @@
474 onTriggered: {
475 player.playlist.removeItem(index)
476 var source = model.source
477-
478 source = source.toString()
479-
480- if (source.indexOf("file://") === 0) {
481- source = source.substring(7);
482- }
483-
484 Podcasts.removeItemFromQueue(source)
485 }
486 }
487
488=== modified file 'po/podbird.nik90.pot'
489--- po/podbird.nik90.pot 2016-03-16 15:35:46 +0000
490+++ po/podbird.nik90.pot 2016-03-16 15:35:46 +0000
491@@ -8,7 +8,7 @@
492 msgstr ""
493 "Project-Id-Version: \n"
494 "Report-Msgid-Bugs-To: \n"
495-"POT-Creation-Date: 2016-03-16 04:57+0530\n"
496+"POT-Creation-Date: 2016-03-16 20:58+0530\n"
497 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
498 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
499 "Language-Team: LANGUAGE <LL@li.org>\n"
500@@ -34,17 +34,17 @@
501 msgid "Skip"
502 msgstr ""
503
504-#: ../app/podcasts.js:281
505+#: ../app/podcasts.js:282
506 #, no-c-format, qt-format
507 msgid "%1 hr %2 min"
508 msgstr ""
509
510-#: ../app/podcasts.js:290
511+#: ../app/podcasts.js:291
512 #, no-c-format, qt-format
513 msgid "%1 hr"
514 msgstr ""
515
516-#: ../app/podcasts.js:298
517+#: ../app/podcasts.js:299
518 #, no-c-format, qt-format
519 msgid "%1 min"
520 msgstr ""
521@@ -158,7 +158,7 @@
522 msgid "Search Episode"
523 msgstr ""
524
525-#: ../app/ui/EpisodesPage.qml:82 ../app/ui/EpisodesTab.qml:72
526+#: ../app/ui/EpisodesPage.qml:82
527 msgid "Mark all listened"
528 msgstr ""
529
530@@ -167,7 +167,7 @@
531 msgid "Unsubscribe"
532 msgstr ""
533
534-#: ../app/ui/EpisodesPage.qml:136 ../app/ui/EpisodesTab.qml:176
535+#: ../app/ui/EpisodesPage.qml:136 ../app/ui/EpisodesTab.qml:120
536 msgid "Search episode"
537 msgstr ""
538
539@@ -185,11 +185,11 @@
540 msgid "Cancel"
541 msgstr ""
542
543-#: ../app/ui/EpisodesPage.qml:223 ../app/ui/EpisodesTab.qml:298
544+#: ../app/ui/EpisodesPage.qml:223 ../app/ui/EpisodesTab.qml:405
545 msgid "Episode Description"
546 msgstr ""
547
548-#: ../app/ui/EpisodesPage.qml:235 ../app/ui/EpisodesTab.qml:310
549+#: ../app/ui/EpisodesPage.qml:235 ../app/ui/EpisodesTab.qml:417
550 #: ../app/ui/SearchPage.qml:170
551 msgid "Close"
552 msgstr ""
553@@ -214,75 +214,95 @@
554 msgid "Downloaded"
555 msgstr ""
556
557-#: ../app/ui/EpisodesTab.qml:87
558-msgid "Download all"
559-msgstr ""
560-
561-#: ../app/ui/EpisodesTab.qml:108
562-msgid "Delete all"
563-msgstr ""
564-
565-#: ../app/ui/EpisodesTab.qml:138
566+#: ../app/ui/EpisodesTab.qml:82
567 msgid "Recent"
568 msgstr ""
569
570-#: ../app/ui/EpisodesTab.qml:138
571+#: ../app/ui/EpisodesTab.qml:82
572 msgid "Downloads"
573 msgstr ""
574
575-#: ../app/ui/EpisodesTab.qml:138
576+#: ../app/ui/EpisodesTab.qml:82
577 msgid "Favourites"
578 msgstr ""
579
580-#: ../app/ui/EpisodesTab.qml:201
581+#: ../app/ui/EpisodesTab.qml:141
582+msgid "Back"
583+msgstr ""
584+
585+#: ../app/ui/EpisodesTab.qml:153
586+msgid "Mark Listened"
587+msgstr ""
588+
589+#: ../app/ui/EpisodesTab.qml:171
590+msgid "Download episode(s)"
591+msgstr ""
592+
593+#: ../app/ui/EpisodesTab.qml:199
594+msgid "Delete episode(s)"
595+msgstr ""
596+
597+#: ../app/ui/EpisodesTab.qml:222
598+msgid "Favourite episode(s)"
599+msgstr ""
600+
601+#: ../app/ui/EpisodesTab.qml:245
602+msgid "Unfavourite episode(s)"
603+msgstr ""
604+
605+#: ../app/ui/EpisodesTab.qml:268
606+msgid "Add to queue"
607+msgstr ""
608+
609+#: ../app/ui/EpisodesTab.qml:308
610 msgid "No New Episodes"
611 msgstr ""
612
613-#: ../app/ui/EpisodesTab.qml:203
614+#: ../app/ui/EpisodesTab.qml:310
615 msgid "No Downloaded Episodes"
616 msgstr ""
617
618-#: ../app/ui/EpisodesTab.qml:205
619+#: ../app/ui/EpisodesTab.qml:312
620 msgid "No Favourited Episodes"
621 msgstr ""
622
623-#: ../app/ui/EpisodesTab.qml:207
624+#: ../app/ui/EpisodesTab.qml:314
625 msgid "No Episodes Found"
626 msgstr ""
627
628-#: ../app/ui/EpisodesTab.qml:213
629+#: ../app/ui/EpisodesTab.qml:320
630 msgid "No more episodes to listen to!"
631 msgstr ""
632
633-#: ../app/ui/EpisodesTab.qml:215
634+#: ../app/ui/EpisodesTab.qml:322
635 msgid "No episodes have been downloaded for offline listening"
636 msgstr ""
637
638-#: ../app/ui/EpisodesTab.qml:217
639+#: ../app/ui/EpisodesTab.qml:324
640 msgid "No episodes have been favourited."
641 msgstr ""
642
643-#: ../app/ui/EpisodesTab.qml:219
644+#: ../app/ui/EpisodesTab.qml:326
645 msgid "No Episodes found matching the search term."
646 msgstr ""
647
648-#: ../app/ui/EpisodesTab.qml:346
649+#: ../app/ui/EpisodesTab.qml:457
650 msgid "Downloads in progress"
651 msgstr ""
652
653-#: ../app/ui/EpisodesTab.qml:386
654+#: ../app/ui/EpisodesTab.qml:497
655 msgid "Downloaded episodes"
656 msgstr ""
657
658-#: ../app/ui/EpisodesTab.qml:402
659+#: ../app/ui/EpisodesTab.qml:507
660 msgid "Today"
661 msgstr ""
662
663-#: ../app/ui/EpisodesTab.qml:406
664+#: ../app/ui/EpisodesTab.qml:511
665 msgid "Yesterday"
666 msgstr ""
667
668-#: ../app/ui/EpisodesTab.qml:410
669+#: ../app/ui/EpisodesTab.qml:515
670 msgid "Older"
671 msgstr ""
672
673@@ -539,10 +559,10 @@
674 msgid "Finish"
675 msgstr ""
676
677-#: /home/krnekhelesh/Development/add-download-manager-build/po/Podbird.desktop.in.h:1
678+#: /home/krnekhelesh/Development/add-batch-actions-build/po/Podbird.desktop.in.h:1
679 msgid "The chirpiest podcast manager for Ubuntu"
680 msgstr ""
681
682-#: /home/krnekhelesh/Development/add-download-manager-build/po/Podbird.desktop.in.h:2
683+#: /home/krnekhelesh/Development/add-batch-actions-build/po/Podbird.desktop.in.h:2
684 msgid "podcast;audio;itunes;broadcast;digital;stream;podcatcher;video;vodcast;"
685 msgstr ""

Subscribers

People subscribed via source and target branches