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 }