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:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user