File indexing completed on 2024-05-19 15:54:40

0001 // SPDX-FileCopyrightText: 2021 Jonah BrĂ¼chert <jbb@kaidan.im>
0002 //
0003 // SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0004 
0005 #include "videoinfoextractor.h"
0006 
0007 #include "asyncytmusic.h"
0008 
0009 VideoInfoExtractor::VideoInfoExtractor(QObject *parent)
0010     : QObject(parent)
0011 {
0012     connect(this, &VideoInfoExtractor::videoIdChanged, this, [this] {
0013         if (m_videoId.isEmpty()) {
0014             m_videoInfo = {};
0015             Q_EMIT songChanged();
0016             return;
0017         }
0018 
0019         setLoading(true);
0020 
0021         auto future = YTMusicThread::instance()->extractVideoInfo(QString::fromStdString(m_videoId.toStdString()));
0022         QCoro::connect(std::move(future), this, [this](const video_info::VideoInfo &videoInfo) {
0023             m_videoInfo = videoInfo;
0024             setLoading(false);
0025             Q_EMIT songChanged();
0026         });
0027     });
0028 }
0029 
0030 QUrl VideoInfoExtractor::audioUrl() const
0031 {
0032     if (m_videoInfo.formats.empty()) {
0033         return {};
0034     }
0035 
0036     std::vector<video_info::Format> audioFormats;
0037 
0038     // filter audio only formats
0039     std::copy_if(m_videoInfo.formats.begin(), m_videoInfo.formats.end(), std::back_inserter(audioFormats),
0040         [](const video_info::Format &format) {
0041         return format.acodec != "none" && format.vcodec == "none";
0042     });
0043 
0044     if (audioFormats.empty()) {
0045         return {};
0046     }
0047 
0048     std::sort(audioFormats.begin(), audioFormats.end(),
0049               [](const video_info::Format &a, const video_info::Format &b) {
0050         return a.quality > b.quality;
0051     });
0052 
0053     return QUrl(QString::fromStdString(audioFormats.front().url));
0054 }
0055 
0056 QString VideoInfoExtractor::videoId() const
0057 {
0058     return m_videoId;
0059 }
0060 
0061 void VideoInfoExtractor::setVideoId(const QString &videoId)
0062 {
0063     if (m_videoId == videoId || videoId.isEmpty()) {
0064         return;
0065     }
0066     m_videoId = videoId;
0067     Q_EMIT videoIdChanged();
0068 }
0069 
0070 QString VideoInfoExtractor::title() const
0071 {
0072     return QString::fromStdString(m_videoInfo.title);
0073 }
0074 
0075 QString VideoInfoExtractor::artist() const
0076 {
0077     return QString::fromStdString(m_videoInfo.artist);
0078 }
0079 
0080 QString VideoInfoExtractor::channel() const
0081 {
0082     return QString::fromStdString(m_videoInfo.channel);
0083 }
0084 
0085 QString VideoInfoExtractor::thumbnail() const
0086 {
0087     return QString::fromStdString(m_videoInfo.thumbnail);
0088 }
0089 
0090 bool VideoInfoExtractor::loading() const
0091 {
0092     return m_loading;
0093 }
0094 
0095 void VideoInfoExtractor::setLoading(bool loading)
0096 {
0097     m_loading = loading;
0098     Q_EMIT loadingChanged();
0099 }