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
1=== modified file 'app/podcasts.js'
2--- app/podcasts.js 2016-03-04 10:04:32 +0000
3+++ app/podcasts.js 2016-03-05 21:27:27 +0000
4@@ -21,17 +21,18 @@
5
6 db.transaction(function(tx) {
7 tx.executeSql('CREATE TABLE IF NOT EXISTS Podcast(artist TEXT, name TEXT, description TEXT, feed TEXT, image TEXT, lastupdate TIMESTAMP)');
8- 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))');
9+ 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))');
10 });
11
12 /*
13- Schema Upgrade to v1.1 which adds a new queued boolean variable which is needed to track the queued status
14- of a episode properly.
15+ Schema Upgrade to v1.2 which adds a new favourited boolean variable which is needed to track the favourite status
16+ of an episode.
17 */
18- if (db.version == "1.0") {
19- db.changeVersion("1.0", "1.1", function(tx) {
20- tx.executeSql('ALTER TABLE Episode ADD queued BOOLEAN');
21- tx.executeSql('UPDATE Episode SET queued=0');
22+ if (db.version != "1.2") {
23+ console.log("Upgrading database from %1 -> v1.2".arg(db.version))
24+ db.changeVersion(db.version, "1.2", function(tx) {
25+ tx.executeSql('ALTER TABLE Episode ADD favourited BOOLEAN');
26+ tx.executeSql('UPDATE Episode SET favourited=?', [false]);
27 });
28 }
29
30@@ -110,13 +111,14 @@
31 db.transaction(function(tx2) {
32 var ers = tx2.executeSql("SELECT rowid FROM Episode WHERE guid=?", [track.guid]);
33 if (ers.rows.length === 0) {
34- tx2.executeSql("INSERT INTO Episode(podcast, name, description, audiourl, guid, listened, queued, duration, published) VALUES(?, ?, ? , ?, ?, ?, ?, ?, ?)", [pid,
35+ tx2.executeSql("INSERT INTO Episode(podcast, name, description, audiourl, guid, listened, queued, favourited, duration, published) VALUES(?, ?, ? , ?, ?, ?, ?, ?, ?, ?)", [pid,
36 track.name,
37 track.description,
38 track.audiourl,
39 track.guid,
40 false,
41 false,
42+ false,
43 track.duration,
44 track.published]);
45 }
46
47=== modified file 'app/ui/EpisodesPage.qml'
48--- app/ui/EpisodesPage.qml 2016-03-05 17:07:27 +0000
49+++ app/ui/EpisodesPage.qml 2016-03-05 21:27:27 +0000
50@@ -523,6 +523,20 @@
51 },
52
53 Action {
54+ iconName: model.favourited ? "unlike" : "like"
55+ onTriggered: {
56+ var db = Podcasts.init();
57+ db.transaction(function (tx) {
58+ if (model.favourited)
59+ tx.executeSql("UPDATE Episode SET favourited=0 WHERE guid=?", [model.guid])
60+ else
61+ tx.executeSql("UPDATE Episode SET favourited=1 WHERE guid=?", [model.guid])
62+ refreshModel();
63+ });
64+ }
65+ },
66+
67+ Action {
68 iconName: "info"
69 onTriggered: {
70 var popup = PopupUtils.open(episodeDescriptionDialog, episodesPage);
71@@ -581,10 +595,10 @@
72 for(i = 0; i < rs.rows.length; i++) {
73 episode = rs.rows.item(i);
74 if (!episode.listened) {
75- 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});
76+ 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});
77 newCount++;
78 } else {
79- 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});
80+ 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});
81 }
82 }
83 });
84
85=== modified file 'app/ui/EpisodesTab.qml'
86--- app/ui/EpisodesTab.qml 2016-03-05 17:07:27 +0000
87+++ app/ui/EpisodesTab.qml 2016-03-05 21:27:27 +0000
88@@ -132,7 +132,7 @@
89 selectedSectionColor: podbird.appTheme.focusText
90 }
91
92- model: [i18n.tr("What's New"), i18n.tr("Downloaded")]
93+ model: [i18n.tr("What's New"), i18n.tr("Downloaded"), i18n.tr("Favourites")]
94 onSelectedIndexChanged: {
95 refreshModel();
96 }
97@@ -192,8 +192,30 @@
98 id: emptyStateComponent
99 EmptyState {
100 icon.source: episodesModel.count === 0 ? Qt.resolvedUrl("../graphics/owlSearch.svg") : Qt.resolvedUrl("../graphics/notFound.svg")
101- title: episodesModel.count === 0 ? i18n.tr("No New Episodes") : i18n.tr("No Episodes Found")
102- subTitle: episodesModel.count === 0 ? i18n.tr("No more episodes to listen to!") : i18n.tr("No Episodes found matching the search term.")
103+ title: {
104+ if (episodesModel.count === 0 && episodesPage.header === standardHeader) {
105+ if (episodesPageHeaderSections.selectedIndex === 0)
106+ return i18n.tr("No New Episodes")
107+ else if (episodesPageHeaderSections.selectedIndex === 1)
108+ return i18n.tr("No Downloaded Episodes")
109+ else if (episodesPageHeaderSections.selectedIndex === 2)
110+ return i18n.tr("No Favourited Episodes")
111+ } else {
112+ return i18n.tr("No Episodes Found")
113+ }
114+ }
115+ subTitle: {
116+ if (episodesModel.count === 0 && episodesPage.header === standardHeader) {
117+ if (episodesPageHeaderSections.selectedIndex === 0)
118+ return i18n.tr("No more episodes to listen to!")
119+ else if (episodesPageHeaderSections.selectedIndex === 1)
120+ return i18n.tr("No episodes have been downloaded for offline listening")
121+ else if (episodesPageHeaderSections.selectedIndex === 2)
122+ return i18n.tr("No episodes have been favourited.")
123+ } else {
124+ return i18n.tr("No Episodes found matching the search term.")
125+ }
126+ }
127 }
128 }
129
130@@ -440,9 +462,29 @@
131 else {
132 tx.executeSql("UPDATE Episode SET listened=1 WHERE guid=?", [model.guid])
133 episodesModel.setProperty(model.index, "listened", 1)
134- if (episodesPage.head.sections.selectedIndex === 0) {
135- episodesModel.remove(model.index, 1)
136- }
137+ if (episodesPageHeaderSections.selectedIndex === 0) {
138+ episodesModel.remove(model.index, 1)
139+ }
140+ }
141+ });
142+ }
143+ },
144+
145+ Action {
146+ iconName: model.favourited ? "unlike" : "like"
147+ onTriggered: {
148+ var db = Podcasts.init();
149+ db.transaction(function (tx) {
150+ if (model.favourited) {
151+ tx.executeSql("UPDATE Episode SET favourited=0 WHERE guid=?", [model.guid])
152+ episodesModel.setProperty(model.index, "favourited", 0)
153+ if (episodesPageHeaderSections.selectedIndex === 2) {
154+ episodesModel.remove(model.index, 1)
155+ }
156+ }
157+ else {
158+ tx.executeSql("UPDATE Episode SET favourited=1 WHERE guid=?", [model.guid])
159+ episodesModel.setProperty(model.index, "favourited", 1)
160 }
161 });
162 }
163@@ -515,13 +557,13 @@
164 diff = Math.floor((today - episode.published)/dayToMs)
165 if (diff < 7 && !episode.listened) {
166 if (diff < 1) {
167- 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"})
168+ 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"})
169 todayCount++;
170 } else if (diff < 2) {
171- 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"})
172+ 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"})
173 yesterdayCount++;
174 } else {
175- 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"})
176+ 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"})
177 }
178 } else if (diff >= 7){
179 break
180@@ -545,7 +587,28 @@
181 for (j=0; j < rs2.rows.length; j++) {
182 episode = rs2.rows.item(j)
183 if (episode.downloadedfile) {
184- 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"})
185+ 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"})
186+ }
187+ }
188+
189+ if (podcast.lastupdate === null && !episodesUpdating) {
190+ updateEpisodesDatabase();
191+ }
192+ }
193+ });
194+ }
195+
196+ // Episode Model for the favourites view
197+ else if (episodesPageHeaderSections.selectedIndex === 2) {
198+ db.transaction(function (tx) {
199+ var rs = tx.executeSql("SELECT rowid, * FROM Podcast ORDER BY name ASC");
200+ for (i=0; i < rs.rows.length; i++) {
201+ var podcast = rs.rows.item(i);
202+ var rs2 = tx.executeSql("SELECT rowid, * FROM Episode WHERE podcast=? ORDER BY published DESC", [rs.rows.item(i).rowid]);
203+ for (j=0; j < rs2.rows.length; j++) {
204+ episode = rs2.rows.item(j)
205+ if (episode.favourited) {
206+ 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"})
207 }
208 }
209
210
211=== modified file 'po/podbird.nik90.pot'
212--- po/podbird.nik90.pot 2016-03-05 17:30:32 +0000
213+++ po/podbird.nik90.pot 2016-03-05 21:27:27 +0000
214@@ -8,7 +8,7 @@
215 msgstr ""
216 "Project-Id-Version: \n"
217 "Report-Msgid-Bugs-To: \n"
218-"POT-Creation-Date: 2016-03-05 22:39+0530\n"
219+"POT-Creation-Date: 2016-03-06 01:51+0530\n"
220 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
221 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
222 "Language-Team: LANGUAGE <LL@li.org>\n"
223@@ -44,17 +44,17 @@
224 msgid "No podcasts listened to today"
225 msgstr ""
226
227-#: ../app/podcasts.js:180
228+#: ../app/podcasts.js:182
229 #, no-c-format, qt-format
230 msgid "%1 hr %2 min"
231 msgstr ""
232
233-#: ../app/podcasts.js:189
234+#: ../app/podcasts.js:191
235 #, no-c-format, qt-format
236 msgid "%1 hr"
237 msgstr ""
238
239-#: ../app/podcasts.js:197
240+#: ../app/podcasts.js:199
241 #, no-c-format, qt-format
242 msgid "%1 min"
243 msgstr ""
244@@ -195,11 +195,11 @@
245 msgid "Cancel"
246 msgstr ""
247
248-#: ../app/ui/EpisodesPage.qml:224 ../app/ui/EpisodesTab.qml:273
249+#: ../app/ui/EpisodesPage.qml:224 ../app/ui/EpisodesTab.qml:295
250 msgid "Episode Description"
251 msgstr ""
252
253-#: ../app/ui/EpisodesPage.qml:236 ../app/ui/EpisodesTab.qml:285
254+#: ../app/ui/EpisodesPage.qml:236 ../app/ui/EpisodesTab.qml:307
255 #: ../app/ui/SearchPage.qml:170
256 msgid "Close"
257 msgstr ""
258@@ -236,31 +236,51 @@
259 msgid "What's New"
260 msgstr ""
261
262-#: ../app/ui/EpisodesTab.qml:195
263+#: ../app/ui/EpisodesTab.qml:135
264+msgid "Favourites"
265+msgstr ""
266+
267+#: ../app/ui/EpisodesTab.qml:198
268 msgid "No New Episodes"
269 msgstr ""
270
271-#: ../app/ui/EpisodesTab.qml:195
272+#: ../app/ui/EpisodesTab.qml:200
273+msgid "No Downloaded Episodes"
274+msgstr ""
275+
276+#: ../app/ui/EpisodesTab.qml:202
277+msgid "No Favourited Episodes"
278+msgstr ""
279+
280+#: ../app/ui/EpisodesTab.qml:204
281 msgid "No Episodes Found"
282 msgstr ""
283
284-#: ../app/ui/EpisodesTab.qml:196
285+#: ../app/ui/EpisodesTab.qml:210
286 msgid "No more episodes to listen to!"
287 msgstr ""
288
289-#: ../app/ui/EpisodesTab.qml:196
290+#: ../app/ui/EpisodesTab.qml:212
291+msgid "No episodes have been downloaded for offline listening"
292+msgstr ""
293+
294+#: ../app/ui/EpisodesTab.qml:214
295+msgid "No episodes have been favourited."
296+msgstr ""
297+
298+#: ../app/ui/EpisodesTab.qml:216
299 msgid "No Episodes found matching the search term."
300 msgstr ""
301
302-#: ../app/ui/EpisodesTab.qml:332
303+#: ../app/ui/EpisodesTab.qml:354
304 msgid "Today"
305 msgstr ""
306
307-#: ../app/ui/EpisodesTab.qml:336
308+#: ../app/ui/EpisodesTab.qml:358
309 msgid "Yesterday"
310 msgstr ""
311
312-#: ../app/ui/EpisodesTab.qml:340
313+#: ../app/ui/EpisodesTab.qml:362
314 msgid "Older"
315 msgstr ""
316
317@@ -509,10 +529,10 @@
318 msgid "Finish"
319 msgstr ""
320
321-#: /home/krnekhelesh/Development/devel-branch-build/po/Podbird.desktop.in.h:1
322+#: /home/krnekhelesh/Development/add-favourites-view-build/po/Podbird.desktop.in.h:1
323 msgid "The chirpiest podcast manager for Ubuntu"
324 msgstr ""
325
326-#: /home/krnekhelesh/Development/devel-branch-build/po/Podbird.desktop.in.h:2
327+#: /home/krnekhelesh/Development/add-favourites-view-build/po/Podbird.desktop.in.h:2
328 msgid "podcast;audio;itunes;broadcast;digital;stream;podcatcher;video;vodcast;"
329 msgstr ""

Subscribers

People subscribed via source and target branches