Mark podcast episodes as listened when they're listened to

This commit is contained in:
David Sansome 2012-03-11 12:27:48 +00:00
parent 19a971c7cd
commit 8cc971fa93
6 changed files with 45 additions and 2 deletions

View File

@ -37,4 +37,8 @@ CREATE INDEX podcast_idx_url ON podcasts(url);
CREATE INDEX podcast_episodes_idx_podcast_id ON podcast_episodes(podcast_id);
CREATE INDEX podcast_episodes_idx_url ON podcast_episodes(url);
CREATE INDEX podcast_episodes_idx_local_url ON podcast_episodes(local_url);
UPDATE schema_version SET version=37;

View File

@ -143,7 +143,7 @@ void PodcastBackend::UpdateEpisodes(const PodcastEpisodeList& episodes) {
foreach (const PodcastEpisode& episode, episodes) {
q.bindValue(":listened", episode.listened());
q.bindValue(":downloaded", episode.downloaded());
q.bindValue(":local_url", episode.local_url());
q.bindValue(":local_url", episode.local_url().toEncoded());
q.bindValue(":id", episode.database_id());
q.exec();
db_->CheckErrors(q);
@ -260,7 +260,26 @@ PodcastEpisode PodcastBackend::GetEpisodeByUrl(const QUrl& url) {
QSqlQuery q("SELECT ROWID, " + PodcastEpisode::kColumnSpec +
" FROM podcast_episodes"
" WHERE url = :url", db);
q.bindValue(":url", url);
q.bindValue(":url", url.toEncoded());
q.exec();
if (!db_->CheckErrors(q) && q.next()) {
ret.InitFromQuery(q);
}
return ret;
}
PodcastEpisode PodcastBackend::GetEpisodeByUrlOrLocalUrl(const QUrl& url) {
PodcastEpisode ret;
QMutexLocker l(db_->Mutex());
QSqlDatabase db(db_->Connect());
QSqlQuery q("SELECT ROWID, " + PodcastEpisode::kColumnSpec +
" FROM podcast_episodes"
" WHERE url = :url"
" OR local_url = :url", db);
q.bindValue(":url", url.toEncoded());
q.exec();
if (!db_->CheckErrors(q) && q.next()) {
ret.InitFromQuery(q);

View File

@ -52,6 +52,7 @@ public:
PodcastEpisodeList GetEpisodes(int podcast_id);
PodcastEpisode GetEpisodeById(int id);
PodcastEpisode GetEpisodeByUrl(const QUrl& url);
PodcastEpisode GetEpisodeByUrlOrLocalUrl(const QUrl& url);
// Adds episodes to the database. Every episode must have a valid
// podcast_database_id set already.

View File

@ -44,6 +44,8 @@ public:
Song ToSong(const Podcast& podcast) const;
bool is_valid() const { return database_id() != -1; }
int database_id() const;
int podcast_database_id() const;
const QString& title() const;

View File

@ -64,6 +64,8 @@ PodcastService::PodcastService(Application* app, InternetModel* parent)
connect(backend_, SIGNAL(SubscriptionRemoved(Podcast)), SLOT(SubscriptionRemoved(Podcast)));
connect(backend_, SIGNAL(EpisodesAdded(QList<PodcastEpisode>)), SLOT(EpisodesAdded(QList<PodcastEpisode>)));
connect(backend_, SIGNAL(EpisodesUpdated(QList<PodcastEpisode>)), SLOT(EpisodesUpdated(QList<PodcastEpisode>)));
connect(app_->playlist_manager(), SIGNAL(CurrentSongChanged(Song)), SLOT(CurrentSongChanged(Song)));
}
PodcastService::~PodcastService() {
@ -434,3 +436,16 @@ void PodcastService::DownloadProgressChanged(const PodcastEpisode& episode,
void PodcastService::ShowConfig() {
app_->OpenSettingsDialogAtPage(SettingsDialog::Page_Podcasts);
}
void PodcastService::CurrentSongChanged(const Song& metadata) {
// Check whether this song is one of our podcast episodes.
PodcastEpisode episode = backend_->GetEpisodeByUrlOrLocalUrl(metadata.url());
if (!episode.is_valid())
return;
// Mark it as listened if it's not already
if (!episode.listened()) {
episode.set_listened(true);
backend_->UpdateEpisodes(PodcastEpisodeList() << episode);
}
}

View File

@ -78,6 +78,8 @@ private slots:
PodcastDownloader::State state,
int percent);
void CurrentSongChanged(const Song& metadata);
private:
void PopulatePodcastList(QStandardItem* parent);
void UpdatePodcastText(QStandardItem* item, int unlistened_count) const;