Private
Public Access
1
0

Use struct for track info to allow better track data management. Use reported track duration instead of qt mediaplayer guessing.

This commit is contained in:
2020-04-23 12:56:06 -04:00
parent de831a0cb8
commit 845068db63
2 changed files with 22 additions and 15 deletions

View File

@@ -45,7 +45,7 @@ bool MiniMediaPlayer::nextTrack()
m_player->pause(); m_player->pause();
m_player->setPosition(0); m_player->setPosition(0);
QtConcurrent::run([this]() { QtConcurrent::run([this]() {
m_player->setMedia(getStreamUrlFromUrl(playlist.first().second)); m_player->setMedia(getStreamUrlFromUrl(playlist.first().trackURL));
emit playlistChanged(getTrackNames()); emit playlistChanged(getTrackNames());
}); });
return true; return true;
@@ -66,7 +66,7 @@ qint64 MiniMediaPlayer::getCurrentPosition()
qint64 MiniMediaPlayer::getTrackDuration() qint64 MiniMediaPlayer::getTrackDuration()
{ {
return m_player->duration(); return playlist.first().trackLength;
} }
int MiniMediaPlayer::getVolume() int MiniMediaPlayer::getVolume()
@@ -97,9 +97,9 @@ bool MiniMediaPlayer::playPauseTrack(bool playing)
QList<QString> MiniMediaPlayer::getTrackNames() QList<QString> MiniMediaPlayer::getTrackNames()
{ {
QList<QString> playlistTitles; QList<QString> playlistTitles;
for(QPair<QString,QUrl> item: playlist) for(trackInfo item: playlist)
{ {
playlistTitles.append(item.first); playlistTitles.append(item.trackName);
} }
return playlistTitles; return playlistTitles;
} }
@@ -107,7 +107,7 @@ QList<QString> MiniMediaPlayer::getTrackNames()
QMap<QString, qint64> MiniMediaPlayer::currentState() QMap<QString, qint64> MiniMediaPlayer::currentState()
{ {
QMap<QString,qint64> state; QMap<QString,qint64> state;
state.insert("duration",m_player->duration()); state.insert("duration",playlist.first().trackLength);
state.insert("position",m_player->position()); state.insert("position",m_player->position());
state.insert("state",isPlaying()); state.insert("state",isPlaying());
return state; return state;
@@ -115,7 +115,7 @@ QMap<QString, qint64> MiniMediaPlayer::currentState()
void MiniMediaPlayer::durationChanged(qint64 length) void MiniMediaPlayer::durationChanged(qint64 length)
{ {
emit trackDurationChanged(length); //emit trackDurationChanged(length); //Don't emit duration changed since we already have duration. TODO: might want to use this still if implement another media source besides youtube-dl.
} }
void MiniMediaPlayer::positionChanged(qint64 position) void MiniMediaPlayer::positionChanged(qint64 position)
@@ -130,7 +130,7 @@ void MiniMediaPlayer::addURLToPlaylist(QUrl mediaUrl)
{ {
bool shouldStartPlaying = false; bool shouldStartPlaying = false;
if(playlist.size() == 0) shouldStartPlaying = true; if(playlist.size() == 0) shouldStartPlaying = true;
QList<QPair<QString,QUrl>> tracks = getStreamTitlesAndUrlsFromUrl(mediaUrl); QList<trackInfo> tracks = getStreamTitlesAndUrlsFromUrl(mediaUrl);
if(tracks.size() > 0) if(tracks.size() > 0)
{ {
playlist.append(tracks); playlist.append(tracks);
@@ -138,7 +138,7 @@ void MiniMediaPlayer::addURLToPlaylist(QUrl mediaUrl)
} }
if(shouldStartPlaying && playlist.size() > 0) if(shouldStartPlaying && playlist.size() > 0)
{ {
m_player->setMedia(getStreamUrlFromUrl(playlist.first().second)); m_player->setMedia(getStreamUrlFromUrl(playlist.first().trackURL));
} }
} }
}); });
@@ -205,9 +205,9 @@ void MiniMediaPlayer::mediaStatusChanged(QMediaPlayer::MediaStatus status)
} }
} }
QList<QPair<QString,QUrl>> MiniMediaPlayer::getStreamTitlesAndUrlsFromUrl(QUrl mediaUrl) QList<MiniMediaPlayer::trackInfo> MiniMediaPlayer::getStreamTitlesAndUrlsFromUrl(QUrl mediaUrl)
{ {
QList<QPair<QString,QUrl>> tracks; QList<trackInfo> tracks;
//Run youtube-dl on Url and return json given back. //Run youtube-dl on Url and return json given back.
QProcess youtubedl; QProcess youtubedl;
youtubedl.start("youtube-dl --no-warnings -f bestaudio -j "+mediaUrl.toString()); youtubedl.start("youtube-dl --no-warnings -f bestaudio -j "+mediaUrl.toString());
@@ -224,10 +224,11 @@ QList<QPair<QString,QUrl>> MiniMediaPlayer::getStreamTitlesAndUrlsFromUrl(QUrl m
QJsonDocument info = QJsonDocument::fromJson(jsonTrack.toUtf8()); QJsonDocument info = QJsonDocument::fromJson(jsonTrack.toUtf8());
if(!info.isNull() && info.isObject()) if(!info.isNull() && info.isObject())
{ {
QPair<QString,QUrl> track; trackInfo track;
QJsonObject jsonTrackInfo = info.object(); QJsonObject jsonTrackInfo = info.object();
track.first = jsonTrackInfo["title"].toString(); track.trackName = jsonTrackInfo["title"].toString();
track.second = QUrl(jsonTrackInfo["webpage_url"].toString()); track.trackURL = QUrl(jsonTrackInfo["webpage_url"].toString());
track.trackLength = jsonTrackInfo["duration"].toInt() * 1000; //convert seconds to milliseconds
tracks.append(track); tracks.append(track);
} }
} }

View File

@@ -51,6 +51,12 @@ public:
void setVolume(int volume); void setVolume(int volume);
struct trackInfo {
QString trackName;
QUrl trackURL;
qint64 trackLength;
};
signals: signals:
void playStateChanged(bool isPlaying); void playStateChanged(bool isPlaying);
void playlistChanged(QStringList trackTitles); void playlistChanged(QStringList trackTitles);
@@ -66,11 +72,11 @@ private slots:
private: private:
QMediaPlayer *m_player; QMediaPlayer *m_player;
QList<QPair<QString,QUrl>> playlist; QList<trackInfo> playlist;
bool isValidMediaUrl(QUrl mediaUrl); bool isValidMediaUrl(QUrl mediaUrl);
QUrl getStreamUrlFromUrl(QUrl mediaUrl); QUrl getStreamUrlFromUrl(QUrl mediaUrl);
QList<QPair<QString,QUrl>> getStreamTitlesAndUrlsFromUrl(QUrl mediaUrl); QList<trackInfo> getStreamTitlesAndUrlsFromUrl(QUrl mediaUrl);
}; };