Merge lp:~nik90/podbird/add-favourites-view into lp:podbird/devel

Proposed by Nekhelesh Ramananthan
Status: Merged
Merged at revision: 122
Proposed branch: lp:~nik90/podbird/add-favourites-view
Merge into: lp:podbird/devel
Diff against target: 329 lines (+134/-35)
4 files modified
app/podcasts.js (+10/-8)
app/ui/EpisodesPage.qml (+16/-2)
app/ui/EpisodesTab.qml (+73/-10)
po/podbird.nik90.pot (+35/-15)
To merge this branch: bzr merge lp:~nik90/podbird/add-favourites-view
Reviewer Review Type Date Requested Status
Podbird Developers Pending
Review via email: mp+288208@code.launchpad.net

Commit message

Added the ability to favourite episodes and see a list of all favourited episodes.

Description of the change

Added the ability to favourite episodes and see a list of all favourited episodes.

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'app/podcasts.js'
--- app/podcasts.js 2016-03-04 10:04:32 +0000
+++ app/podcasts.js 2016-03-05 21:27:27 +0000
@@ -21,17 +21,18 @@
2121
22 db.transaction(function(tx) {22 db.transaction(function(tx) {
23 tx.executeSql('CREATE TABLE IF NOT EXISTS Podcast(artist TEXT, name TEXT, description TEXT, feed TEXT, image TEXT, lastupdate TIMESTAMP)');23 tx.executeSql('CREATE TABLE IF NOT EXISTS Podcast(artist TEXT, name TEXT, description TEXT, feed TEXT, image TEXT, lastupdate TIMESTAMP)');
24 tx.executeSql('CREATE TABLE IF NOT EXISTS Episode(guid TEXT, podcast INTEGER, name TEXT, subtitle TEXT, description TEXT, duration INTEGER, audiourl TEXT, downloadedfile TEXT, published TIMESTAMP, queued BOOLEAN, listened BOOLEAN, position INTEGER, FOREIGN KEY(podcast) REFERENCES Podcast(rowid))');24 tx.executeSql('CREATE TABLE IF NOT EXISTS Episode(guid TEXT, podcast INTEGER, name TEXT, subtitle TEXT, description TEXT, duration INTEGER, audiourl TEXT, downloadedfile TEXT, published TIMESTAMP, queued BOOLEAN, listened BOOLEAN, favourited BOOLEAN, position INTEGER, FOREIGN KEY(podcast) REFERENCES Podcast(rowid))');
25 });25 });
2626
27 /*27 /*
28 Schema Upgrade to v1.1 which adds a new queued boolean variable which is needed to track the queued status28 Schema Upgrade to v1.2 which adds a new favourited boolean variable which is needed to track the favourite status
29 of a episode properly.29 of an episode.
30 */30 */
31 if (db.version == "1.0") {31 if (db.version != "1.2") {
32 db.changeVersion("1.0", "1.1", function(tx) {32 console.log("Upgrading database from %1 -> v1.2".arg(db.version))
33 tx.executeSql('ALTER TABLE Episode ADD queued BOOLEAN');33 db.changeVersion(db.version, "1.2", function(tx) {
34 tx.executeSql('UPDATE Episode SET queued=0');34 tx.executeSql('ALTER TABLE Episode ADD favourited BOOLEAN');
35 tx.executeSql('UPDATE Episode SET favourited=?', [false]);
35 });36 });
36 }37 }
3738
@@ -110,13 +111,14 @@
110 db.transaction(function(tx2) {111 db.transaction(function(tx2) {
111 var ers = tx2.executeSql("SELECT rowid FROM Episode WHERE guid=?", [track.guid]);112 var ers = tx2.executeSql("SELECT rowid FROM Episode WHERE guid=?", [track.guid]);
112 if (ers.rows.length === 0) {113 if (ers.rows.length === 0) {
113 tx2.executeSql("INSERT INTO Episode(podcast, name, description, audiourl, guid, listened, queued, duration, published) VALUES(?, ?, ? , ?, ?, ?, ?, ?, ?)", [pid,114 tx2.executeSql("INSERT INTO Episode(podcast, name, description, audiourl, guid, listened, queued, favourited, duration, published) VALUES(?, ?, ? , ?, ?, ?, ?, ?, ?, ?)", [pid,
114 track.name,115 track.name,
115 track.description,116 track.description,
116 track.audiourl,117 track.audiourl,
117 track.guid,118 track.guid,
118 false,119 false,
119 false,120 false,
121 false,
120 track.duration,122 track.duration,
121 track.published]);123 track.published]);
122 }124 }
123125
=== modified file 'app/ui/EpisodesPage.qml'
--- app/ui/EpisodesPage.qml 2016-03-05 17:07:27 +0000
+++ app/ui/EpisodesPage.qml 2016-03-05 21:27:27 +0000
@@ -523,6 +523,20 @@
523 },523 },
524524
525 Action {525 Action {
526 iconName: model.favourited ? "unlike" : "like"
527 onTriggered: {
528 var db = Podcasts.init();
529 db.transaction(function (tx) {
530 if (model.favourited)
531 tx.executeSql("UPDATE Episode SET favourited=0 WHERE guid=?", [model.guid])
532 else
533 tx.executeSql("UPDATE Episode SET favourited=1 WHERE guid=?", [model.guid])
534 refreshModel();
535 });
536 }
537 },
538
539 Action {
526 iconName: "info"540 iconName: "info"
527 onTriggered: {541 onTriggered: {
528 var popup = PopupUtils.open(episodeDescriptionDialog, episodesPage);542 var popup = PopupUtils.open(episodeDescriptionDialog, episodesPage);
@@ -581,10 +595,10 @@
581 for(i = 0; i < rs.rows.length; i++) {595 for(i = 0; i < rs.rows.length; i++) {
582 episode = rs.rows.item(i);596 episode = rs.rows.item(i);
583 if (!episode.listened) {597 if (!episode.listened) {
584 episodeModel.insert(newCount, {"guid" : episode.guid, "listened" : episode.listened, "published": episode.published, "name" : episode.name, "description" : episode.description, "duration" : episode.duration, "position" : episode.position, "downloadedfile" : episode.downloadedfile, "image" : img, "artist" : artist, "audiourl" : episode.audiourl, "queued": episode.queued});598 episodeModel.insert(newCount, {"guid" : episode.guid, "listened" : episode.listened, "published": episode.published, "name" : episode.name, "description" : episode.description, "duration" : episode.duration, "position" : episode.position, "downloadedfile" : episode.downloadedfile, "image" : img, "artist" : artist, "audiourl" : episode.audiourl, "queued": episode.queued, "favourited": episode.favourited});
585 newCount++;599 newCount++;
586 } else {600 } else {
587 episodeModel.insert(i,{"guid" : episode.guid, "listened" : episode.listened, "published": episode.published, "name" : episode.name, "description" : episode.description, "duration" : episode.duration, "position" : episode.position, "downloadedfile" : episode.downloadedfile, "image" : img, "artist" : artist, "audiourl" : episode.audiourl, "queued": episode.queued});601 episodeModel.insert(i,{"guid" : episode.guid, "listened" : episode.listened, "published": episode.published, "name" : episode.name, "description" : episode.description, "duration" : episode.duration, "position" : episode.position, "downloadedfile" : episode.downloadedfile, "image" : img, "artist" : artist, "audiourl" : episode.audiourl, "queued": episode.queued, "favourited": episode.favourited});
588 }602 }
589 }603 }
590 });604 });
591605
=== modified file 'app/ui/EpisodesTab.qml'
--- app/ui/EpisodesTab.qml 2016-03-05 17:07:27 +0000
+++ app/ui/EpisodesTab.qml 2016-03-05 21:27:27 +0000
@@ -132,7 +132,7 @@
132 selectedSectionColor: podbird.appTheme.focusText132 selectedSectionColor: podbird.appTheme.focusText
133 }133 }
134134
135 model: [i18n.tr("What's New"), i18n.tr("Downloaded")]135 model: [i18n.tr("What's New"), i18n.tr("Downloaded"), i18n.tr("Favourites")]
136 onSelectedIndexChanged: {136 onSelectedIndexChanged: {
137 refreshModel();137 refreshModel();
138 }138 }
@@ -192,8 +192,30 @@
192 id: emptyStateComponent192 id: emptyStateComponent
193 EmptyState {193 EmptyState {
194 icon.source: episodesModel.count === 0 ? Qt.resolvedUrl("../graphics/owlSearch.svg") : Qt.resolvedUrl("../graphics/notFound.svg")194 icon.source: episodesModel.count === 0 ? Qt.resolvedUrl("../graphics/owlSearch.svg") : Qt.resolvedUrl("../graphics/notFound.svg")
195 title: episodesModel.count === 0 ? i18n.tr("No New Episodes") : i18n.tr("No Episodes Found")195 title: {
196 subTitle: episodesModel.count === 0 ? i18n.tr("No more episodes to listen to!") : i18n.tr("No Episodes found matching the search term.")196 if (episodesModel.count === 0 && episodesPage.header === standardHeader) {
197 if (episodesPageHeaderSections.selectedIndex === 0)
198 return i18n.tr("No New Episodes")
199 else if (episodesPageHeaderSections.selectedIndex === 1)
200 return i18n.tr("No Downloaded Episodes")
201 else if (episodesPageHeaderSections.selectedIndex === 2)
202 return i18n.tr("No Favourited Episodes")
203 } else {
204 return i18n.tr("No Episodes Found")
205 }
206 }
207 subTitle: {
208 if (episodesModel.count === 0 && episodesPage.header === standardHeader) {
209 if (episodesPageHeaderSections.selectedIndex === 0)
210 return i18n.tr("No more episodes to listen to!")
211 else if (episodesPageHeaderSections.selectedIndex === 1)
212 return i18n.tr("No episodes have been downloaded for offline listening")
213 else if (episodesPageHeaderSections.selectedIndex === 2)
214 return i18n.tr("No episodes have been favourited.")
215 } else {
216 return i18n.tr("No Episodes found matching the search term.")
217 }
218 }
197 }219 }
198 }220 }
199221
@@ -440,9 +462,29 @@
440 else {462 else {
441 tx.executeSql("UPDATE Episode SET listened=1 WHERE guid=?", [model.guid])463 tx.executeSql("UPDATE Episode SET listened=1 WHERE guid=?", [model.guid])
442 episodesModel.setProperty(model.index, "listened", 1)464 episodesModel.setProperty(model.index, "listened", 1)
443 if (episodesPage.head.sections.selectedIndex === 0) {465 if (episodesPageHeaderSections.selectedIndex === 0) {
444 episodesModel.remove(model.index, 1)466 episodesModel.remove(model.index, 1)
445 }467 }
468 }
469 });
470 }
471 },
472
473 Action {
474 iconName: model.favourited ? "unlike" : "like"
475 onTriggered: {
476 var db = Podcasts.init();
477 db.transaction(function (tx) {
478 if (model.favourited) {
479 tx.executeSql("UPDATE Episode SET favourited=0 WHERE guid=?", [model.guid])
480 episodesModel.setProperty(model.index, "favourited", 0)
481 if (episodesPageHeaderSections.selectedIndex === 2) {
482 episodesModel.remove(model.index, 1)
483 }
484 }
485 else {
486 tx.executeSql("UPDATE Episode SET favourited=1 WHERE guid=?", [model.guid])
487 episodesModel.setProperty(model.index, "favourited", 1)
446 }488 }
447 });489 });
448 }490 }
@@ -515,13 +557,13 @@
515 diff = Math.floor((today - episode.published)/dayToMs)557 diff = Math.floor((today - episode.published)/dayToMs)
516 if (diff < 7 && !episode.listened) {558 if (diff < 7 && !episode.listened) {
517 if (diff < 1) {559 if (diff < 1) {
518 episodesModel.insert(todayCount, {"guid" : episode.guid, "listened" : episode.listened, "published": episode.published, "name" : episode.name, "description" : episode.description, "duration" : episode.duration, "position" : episode.position, "downloadedfile" : episode.downloadedfile, "image" : podcast.image, "artist" : podcast.artist, "audiourl" : episode.audiourl, "queued": episode.queued, "diff": "Today"})560 episodesModel.insert(todayCount, {"guid" : episode.guid, "listened" : episode.listened, "published": episode.published, "name" : episode.name, "description" : episode.description, "duration" : episode.duration, "position" : episode.position, "downloadedfile" : episode.downloadedfile, "image" : podcast.image, "artist" : podcast.artist, "audiourl" : episode.audiourl, "queued": episode.queued, "favourited": episode.favourited, "diff": "Today"})
519 todayCount++;561 todayCount++;
520 } else if (diff < 2) {562 } else if (diff < 2) {
521 episodesModel.insert(todayCount + yesterdayCount, {"guid" : episode.guid, "listened" : episode.listened, "published": episode.published, "name" : episode.name, "description" : episode.description, "duration" : episode.duration, "position" : episode.position, "downloadedfile" : episode.downloadedfile, "image" : podcast.image, "artist" : podcast.artist, "audiourl" : episode.audiourl, "queued": episode.queued, "diff": "Yesterday"})563 episodesModel.insert(todayCount + yesterdayCount, {"guid" : episode.guid, "listened" : episode.listened, "published": episode.published, "name" : episode.name, "description" : episode.description, "duration" : episode.duration, "position" : episode.position, "downloadedfile" : episode.downloadedfile, "image" : podcast.image, "artist" : podcast.artist, "audiourl" : episode.audiourl, "queued": episode.queued, "favourited": episode.favourited, "diff": "Yesterday"})
522 yesterdayCount++;564 yesterdayCount++;
523 } else {565 } else {
524 episodesModel.append({"guid" : episode.guid, "listened" : episode.listened, "published": episode.published, "name" : episode.name, "description" : episode.description, "duration" : episode.duration, "position" : episode.position, "downloadedfile" : episode.downloadedfile, "image" : podcast.image, "artist" : podcast.artist, "audiourl" : episode.audiourl, "queued": episode.queued, "diff": "Older"})566 episodesModel.append({"guid" : episode.guid, "listened" : episode.listened, "published": episode.published, "name" : episode.name, "description" : episode.description, "duration" : episode.duration, "position" : episode.position, "downloadedfile" : episode.downloadedfile, "image" : podcast.image, "artist" : podcast.artist, "audiourl" : episode.audiourl, "queued": episode.queued, "favourited": episode.favourited, "diff": "Older"})
525 }567 }
526 } else if (diff >= 7){568 } else if (diff >= 7){
527 break569 break
@@ -545,7 +587,28 @@
545 for (j=0; j < rs2.rows.length; j++) {587 for (j=0; j < rs2.rows.length; j++) {
546 episode = rs2.rows.item(j)588 episode = rs2.rows.item(j)
547 if (episode.downloadedfile) {589 if (episode.downloadedfile) {
548 episodesModel.append({"guid" : episode.guid, "listened" : episode.listened, "published": episode.published, "name" : episode.name, "description" : episode.description, "duration" : episode.duration, "position" : episode.position, "downloadedfile" : episode.downloadedfile, "image" : podcast.image, "artist" : podcast.artist, "audiourl" : episode.audiourl, "queued": episode.queued, "diff": "Null"})590 episodesModel.append({"guid" : episode.guid, "listened" : episode.listened, "published": episode.published, "name" : episode.name, "description" : episode.description, "duration" : episode.duration, "position" : episode.position, "downloadedfile" : episode.downloadedfile, "image" : podcast.image, "artist" : podcast.artist, "audiourl" : episode.audiourl, "queued": episode.queued, "favourited": episode.favourited, "diff": "Null"})
591 }
592 }
593
594 if (podcast.lastupdate === null && !episodesUpdating) {
595 updateEpisodesDatabase();
596 }
597 }
598 });
599 }
600
601 // Episode Model for the favourites view
602 else if (episodesPageHeaderSections.selectedIndex === 2) {
603 db.transaction(function (tx) {
604 var rs = tx.executeSql("SELECT rowid, * FROM Podcast ORDER BY name ASC");
605 for (i=0; i < rs.rows.length; i++) {
606 var podcast = rs.rows.item(i);
607 var rs2 = tx.executeSql("SELECT rowid, * FROM Episode WHERE podcast=? ORDER BY published DESC", [rs.rows.item(i).rowid]);
608 for (j=0; j < rs2.rows.length; j++) {
609 episode = rs2.rows.item(j)
610 if (episode.favourited) {
611 episodesModel.append({"guid" : episode.guid, "listened" : episode.listened, "published": episode.published, "name" : episode.name, "description" : episode.description, "duration" : episode.duration, "position" : episode.position, "downloadedfile" : episode.downloadedfile, "image" : podcast.image, "artist" : podcast.artist, "audiourl" : episode.audiourl, "queued": episode.queued, "favourited": episode.favourited, "diff": "Null"})
549 }612 }
550 }613 }
551614
552615
=== modified file 'po/podbird.nik90.pot'
--- po/podbird.nik90.pot 2016-03-05 17:30:32 +0000
+++ po/podbird.nik90.pot 2016-03-05 21:27:27 +0000
@@ -8,7 +8,7 @@
8msgstr ""8msgstr ""
9"Project-Id-Version: \n"9"Project-Id-Version: \n"
10"Report-Msgid-Bugs-To: \n"10"Report-Msgid-Bugs-To: \n"
11"POT-Creation-Date: 2016-03-05 22:39+0530\n"11"POT-Creation-Date: 2016-03-06 01:51+0530\n"
12"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"12"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"13"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14"Language-Team: LANGUAGE <LL@li.org>\n"14"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -44,17 +44,17 @@
44msgid "No podcasts listened to today"44msgid "No podcasts listened to today"
45msgstr ""45msgstr ""
4646
47#: ../app/podcasts.js:18047#: ../app/podcasts.js:182
48#, no-c-format, qt-format48#, no-c-format, qt-format
49msgid "%1 hr %2 min"49msgid "%1 hr %2 min"
50msgstr ""50msgstr ""
5151
52#: ../app/podcasts.js:18952#: ../app/podcasts.js:191
53#, no-c-format, qt-format53#, no-c-format, qt-format
54msgid "%1 hr"54msgid "%1 hr"
55msgstr ""55msgstr ""
5656
57#: ../app/podcasts.js:19757#: ../app/podcasts.js:199
58#, no-c-format, qt-format58#, no-c-format, qt-format
59msgid "%1 min"59msgid "%1 min"
60msgstr ""60msgstr ""
@@ -195,11 +195,11 @@
195msgid "Cancel"195msgid "Cancel"
196msgstr ""196msgstr ""
197197
198#: ../app/ui/EpisodesPage.qml:224 ../app/ui/EpisodesTab.qml:273198#: ../app/ui/EpisodesPage.qml:224 ../app/ui/EpisodesTab.qml:295
199msgid "Episode Description"199msgid "Episode Description"
200msgstr ""200msgstr ""
201201
202#: ../app/ui/EpisodesPage.qml:236 ../app/ui/EpisodesTab.qml:285202#: ../app/ui/EpisodesPage.qml:236 ../app/ui/EpisodesTab.qml:307
203#: ../app/ui/SearchPage.qml:170203#: ../app/ui/SearchPage.qml:170
204msgid "Close"204msgid "Close"
205msgstr ""205msgstr ""
@@ -236,31 +236,51 @@
236msgid "What's New"236msgid "What's New"
237msgstr ""237msgstr ""
238238
239#: ../app/ui/EpisodesTab.qml:195239#: ../app/ui/EpisodesTab.qml:135
240msgid "Favourites"
241msgstr ""
242
243#: ../app/ui/EpisodesTab.qml:198
240msgid "No New Episodes"244msgid "No New Episodes"
241msgstr ""245msgstr ""
242246
243#: ../app/ui/EpisodesTab.qml:195247#: ../app/ui/EpisodesTab.qml:200
248msgid "No Downloaded Episodes"
249msgstr ""
250
251#: ../app/ui/EpisodesTab.qml:202
252msgid "No Favourited Episodes"
253msgstr ""
254
255#: ../app/ui/EpisodesTab.qml:204
244msgid "No Episodes Found"256msgid "No Episodes Found"
245msgstr ""257msgstr ""
246258
247#: ../app/ui/EpisodesTab.qml:196259#: ../app/ui/EpisodesTab.qml:210
248msgid "No more episodes to listen to!"260msgid "No more episodes to listen to!"
249msgstr ""261msgstr ""
250262
251#: ../app/ui/EpisodesTab.qml:196263#: ../app/ui/EpisodesTab.qml:212
264msgid "No episodes have been downloaded for offline listening"
265msgstr ""
266
267#: ../app/ui/EpisodesTab.qml:214
268msgid "No episodes have been favourited."
269msgstr ""
270
271#: ../app/ui/EpisodesTab.qml:216
252msgid "No Episodes found matching the search term."272msgid "No Episodes found matching the search term."
253msgstr ""273msgstr ""
254274
255#: ../app/ui/EpisodesTab.qml:332275#: ../app/ui/EpisodesTab.qml:354
256msgid "Today"276msgid "Today"
257msgstr ""277msgstr ""
258278
259#: ../app/ui/EpisodesTab.qml:336279#: ../app/ui/EpisodesTab.qml:358
260msgid "Yesterday"280msgid "Yesterday"
261msgstr ""281msgstr ""
262282
263#: ../app/ui/EpisodesTab.qml:340283#: ../app/ui/EpisodesTab.qml:362
264msgid "Older"284msgid "Older"
265msgstr ""285msgstr ""
266286
@@ -509,10 +529,10 @@
509msgid "Finish"529msgid "Finish"
510msgstr ""530msgstr ""
511531
512#: /home/krnekhelesh/Development/devel-branch-build/po/Podbird.desktop.in.h:1532#: /home/krnekhelesh/Development/add-favourites-view-build/po/Podbird.desktop.in.h:1
513msgid "The chirpiest podcast manager for Ubuntu"533msgid "The chirpiest podcast manager for Ubuntu"
514msgstr ""534msgstr ""
515535
516#: /home/krnekhelesh/Development/devel-branch-build/po/Podbird.desktop.in.h:2536#: /home/krnekhelesh/Development/add-favourites-view-build/po/Podbird.desktop.in.h:2
517msgid "podcast;audio;itunes;broadcast;digital;stream;podcatcher;video;vodcast;"537msgid "podcast;audio;itunes;broadcast;digital;stream;podcatcher;video;vodcast;"
518msgstr ""538msgstr ""

Subscribers

People subscribed via source and target branches