#include "player.h" // HOLY GRAIL // https://doc.qt.io/qt-6/qaudiobufferoutput.html Player::Player(QObject *parent) : QObject(parent), player(this), output(this) { QObject::connect(&this->player, &QMediaPlayer::mediaStatusChanged, this, [this] () { const QMediaPlayer::MediaStatus status = this->player.mediaStatus(); if (status == QMediaPlayer::NoMedia) { qDebug("Player::Player(): NoMedia"); this->unloadVideo(); } else if (status == QMediaPlayer::BufferingMedia || status == QMediaPlayer::LoadingMedia) { qDebug("Player::Player() loadingChanged"); this->m_loading = true; emit this->loadingChanged(); } else if (status == QMediaPlayer::EndOfMedia) { qDebug("Player::Player() playingChanged"); emit this->playingChanged(); } else { if (this->m_position == 0) { this->player.play(); } this->m_loading = false; emit this->loadingChanged(); } }); QObject::connect(&this->player, &QMediaPlayer::positionChanged, this, [this] () { this->m_position = this->player.position(); emit this->positionChanged(); }); // QObject::connect(&this->player, &QMediaPlayer::bufferProgressChanged, this, [this] () { // this->m_buffered = this->player.bufferedTimeRange().latestTime() / this->m_duration; // emit this->bufferedChanged(); // }); QObject::connect(&this->player, &QMediaPlayer::errorOccurred, this, [this] () { this->m_failed = true; qDebug("Player::Player() failedChanged"); emit this->failedChanged(); }); QObject::connect(&this->player, &QMediaPlayer::playbackStateChanged, this, [this] () { qDebug("Player::Player() playingChanged"); emit this->playingChanged(); }); QObject::connect(&this->output, &QAudioOutput::volumeChanged, this, [this] () { emit this->volumeChanged(); }); this->output.setVolume(0.2); this->player.setAudioOutput(&this->output); qDebug("Player::Player(): Constructed"); } Player::~Player() { qDebug("Player::~Player(): Destructed"); } // ******** // Read // ******** bool Player::playing() const { return this->player.playbackState() == QMediaPlayer::PlayingState; } float Player::volume() const { return this->output.volume(); } // ********* // Write // ********* void Player::setVolume(float newVolume) { this->output.setVolume(newVolume); } void Player::setPosition(float newPosition) { this->player.setPosition(newPosition); } // *********** // Methods // *********** // For QYouRadio: // QEventLoop loop(this); // QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); // loop.exec(); // const QJsonDocument data = QJsonDocument::fromJson(reply->readAll()); void Player::loadVideo(QString id, QString extension, QString title, float position) { if (this->m_id != id) { this->unloadVideo(); } this->m_id = id; emit this->idChanged(); this->player.setSource(QUrl("https://youvideo.nonamesoft.xyz/youvideo/api/videofile/with_extension/" + id + extension)); this->m_title = title; emit this->titleChanged(); this->m_position = position; emit this->positionChanged(); this->m_buffered = 0; emit this->bufferedChanged(); this->m_loading = true; emit this->loadingChanged(); this->m_failed = false; emit this->failedChanged(); qDebug() << "Player::loadVideo(): Loaded video https://youvideo.nonamesoft.xyz/youvideo/api/videofile/with_extension/" + id + extension; } void Player::unloadVideo() { qDebug("Player::unloadVideo(): Video unloaded"); this->m_id = ""; emit this->idChanged(); this->player.setSource(QUrl("")); this->player.stop(); this->m_title = ""; emit this->titleChanged(); this->m_loading = false; emit this->loadingChanged(); this->m_failed = false; emit this->failedChanged(); } void Player::play() { if (this->m_id.length() == 0 || this->m_loading) { return; } this->player.play(); } void Player::pause() { if (this->m_id.length() == 0 || this->m_loading) { return; } this->player.pause(); }