Save last playing track in database instead of config file

This commit is contained in:
Bart De Vries 2021-04-17 20:55:01 +02:00
parent ed2d1ee2c8
commit 4fa45b0075
5 changed files with 35 additions and 10 deletions

View File

@ -58,8 +58,8 @@ AudioManager::AudioManager(QObject *parent) : QObject(parent), d(std::make_uniqu
// we'll send custom seekableChanged signal to work around QMediaPlayer glitches
// Check if an entry was playing when the program was shut down and restore it
if (SettingsManager::self()->lastPlayingEntry() != QStringLiteral("none"))
setEntry(DataManager::instance().getEntry(SettingsManager::self()->lastPlayingEntry()));
if (DataManager::instance().lastPlayingEntry() != QStringLiteral("none"))
setEntry(DataManager::instance().getEntry(DataManager::instance().lastPlayingEntry()));
}
AudioManager::~AudioManager()
@ -182,7 +182,7 @@ void AudioManager::setEntry(Entry* entry)
Q_EMIT entryChanged(entry);
d->m_player.setMedia(QUrl(QStringLiteral("file://")+d->m_entry->enclosure()->path()));
// save the current playing track in the settingsfile for restoring on startup
SettingsManager::self()->setLastPlayingEntry(d->m_entry->id());
DataManager::instance().setLastPlayingEntry(d->m_entry->id());
qDebug() << "Changed source to" << d->m_entry->title();
qint64 startingPosition = d->m_entry->enclosure()->playPosition();
@ -225,7 +225,7 @@ void AudioManager::setEntry(Entry* entry)
d->m_isSeekable = true;
Q_EMIT seekableChanged(true);
} else {
SettingsManager::self()->setLastPlayingEntry(QStringLiteral("none"));
DataManager::instance().setLastPlayingEntry(QStringLiteral("none"));
d->m_entry = nullptr;
Q_EMIT entryChanged(nullptr);
d->m_readyToPlay = false;

View File

@ -51,7 +51,7 @@ bool Database::migrateTo1()
TRUE_OR_RETURN(execute(QStringLiteral("CREATE TABLE IF NOT EXISTS Entries (feed TEXT, id TEXT UNIQUE, title TEXT, content TEXT, created INTEGER, updated INTEGER, link TEXT, read bool, new bool, hasEnclosure BOOL, image TEXT);")));
TRUE_OR_RETURN(execute(QStringLiteral("CREATE TABLE IF NOT EXISTS Authors (feed TEXT, id TEXT, name TEXT, uri TEXT, email TEXT);")));
TRUE_OR_RETURN(execute(QStringLiteral("CREATE TABLE IF NOT EXISTS Enclosures (feed TEXT, id TEXT, duration INTEGER, size INTEGER, title TEXT, type TEXT, url TEXT, playposition INTEGER);"))); //, filename TEXT);")));
TRUE_OR_RETURN(execute(QStringLiteral("CREATE TABLE IF NOT EXISTS Queue (listnr INTEGER, feed TEXT, id TEXT);")));
TRUE_OR_RETURN(execute(QStringLiteral("CREATE TABLE IF NOT EXISTS Queue (listnr INTEGER, feed TEXT, id TEXT, playing BOOL);")));
TRUE_OR_RETURN(execute(QStringLiteral("PRAGMA user_version = 1;")));
return true;
}

View File

@ -322,10 +322,11 @@ void DataManager::addToQueue(const QString &feedurl, const QString &id)
// Add to Queue database
QSqlQuery query;
query.prepare(QStringLiteral("INSERT INTO Queue VALUES (:index, :feedurl, :id);"));
query.prepare(QStringLiteral("INSERT INTO Queue VALUES (:index, :feedurl, :id, :playing);"));
query.bindValue(QStringLiteral(":index"), index);
query.bindValue(QStringLiteral(":feedurl"), feedurl);
query.bindValue(QStringLiteral(":id"), id);
query.bindValue(QStringLiteral(":playing"), false);
Database::instance().execute(query);
// Make sure that the QueueModel is aware of the changes
@ -378,6 +379,31 @@ void DataManager::removeQueueItem(Entry* entry)
removeQueueItem(m_queuemap.indexOf(entry->id()));
}
QString DataManager::lastPlayingEntry()
{
QSqlQuery query;
query.prepare(QStringLiteral("SELECT id FROM Queue WHERE playing=:playing;"));
query.bindValue(QStringLiteral(":playing"), true);
Database::instance().execute(query);
if (!query.next()) return QStringLiteral("none");
return query.value(QStringLiteral("id")).toString();
}
void DataManager::setLastPlayingEntry(const QString& id)
{
QSqlQuery query;
// First set playing to false for all Queue items
query.prepare(QStringLiteral("UPDATE Queue SET playing=:playing;"));
query.bindValue(QStringLiteral(":playing"), false);
Database::instance().execute(query);
// Now set the correct track to playing=true
query.prepare(QStringLiteral("UPDATE Queue SET playing=:playing WHERE id=:id;"));
query.bindValue(QStringLiteral(":playing"), true);
query.bindValue(QStringLiteral(":id"), id);
Database::instance().execute(query);
}
void DataManager::importFeeds(const QString &path)
{
QUrl url(path);

View File

@ -50,6 +50,9 @@ public:
Q_INVOKABLE void removeQueueItem(const QString id);
Q_INVOKABLE void removeQueueItem(Entry* entry);
Q_INVOKABLE QString lastPlayingEntry();
Q_INVOKABLE void setLastPlayingEntry(const QString& id);
Q_INVOKABLE void importFeeds(const QString &path);
Q_INVOKABLE void exportFeeds(const QString &path);

View File

@ -43,10 +43,6 @@
<label>The top-level page that was open at shutdown</label>
<default>FeedListPage</default>
</entry>
<entry name="lastPlayingEntry" type="String">
<label>The entry that was being played at shutdown</label>
<default>none</default>
</entry>
<entry name="showRemainingTime" type="Bool">
<label>Whether the player shows remaining track time instead of total track time</label>
<default>false</default>