akashi-esquizolandia/core/src/music_manager.cpp
Salanto 021aefb78c Fix music load order
* Fixes empty-songlist due to incorrect loading order in the MusicManager
2022-07-24 14:59:23 +02:00

239 lines
7.5 KiB
C++

#include "include/music_manager.h"
#include "include/config_manager.h"
#include "include/packet/packet_factory.h"
MusicManager::MusicManager(QStringList f_cdns, MusicList f_root_list, QStringList f_root_ordered, QObject *parent) :
QObject(parent),
m_root_list(f_root_list),
m_root_ordered(f_root_ordered)
{
m_custom_lists = new QHash<int, QMap<QString, QPair<QString, int>>>;
if (!f_cdns.isEmpty()) {
m_cdns = f_cdns;
}
}
MusicManager::~MusicManager()
{
}
QStringList MusicManager::musiclist(int f_area_id)
{
if (m_global_enabled.value(f_area_id)) {
QStringList l_combined_list = m_root_ordered;
l_combined_list.append(m_customs_ordered.value(f_area_id));
return l_combined_list;
}
return m_custom_lists->value(f_area_id).keys();
}
QStringList MusicManager::rootMusiclist()
{
return m_root_ordered;
}
bool MusicManager::registerArea(int f_area_id)
{
if (m_custom_lists->contains(f_area_id)) {
// This area is already registered. We can't add it.
return false;
}
m_custom_lists->insert(f_area_id, {});
m_global_enabled.insert(f_area_id, true);
return true;
}
bool MusicManager::validateSong(QString f_song_name, QStringList f_approved_cdns)
{
QStringList l_extensions = {".opus", ".ogg", ".mp3", ".wav"};
bool l_cdn_approved = false;
// Check if URL formatted.
if (f_song_name.contains("/")) {
// Only allow HTTPS/HTTP sources.
if (f_song_name.startsWith("https://") || f_song_name.startsWith("http://")) {
for (const QString &l_cdn : qAsConst(f_approved_cdns)) {
// Iterate trough all available CDNs to find an approved match
if (f_song_name.startsWith("https://" + l_cdn + "/", Qt::CaseInsensitive) || f_song_name.startsWith("http://" + l_cdn + "/", Qt::CaseInsensitive)) {
l_cdn_approved = true;
break;
}
}
if (!l_cdn_approved) {
return false;
}
}
else {
return false;
}
}
bool l_suffix_found = false;
;
for (const QString &suffix : qAsConst(l_extensions)) {
if (f_song_name.endsWith(suffix)) {
l_suffix_found = true;
break;
}
}
if (!l_suffix_found) {
return false;
}
return true;
}
bool MusicManager::addCustomSong(QString f_song_name, QString f_real_name, int f_duration, int f_area_id)
{
// Validate if simple name.
QString l_song_name = f_song_name;
if (f_song_name.split(".").size() == 1) {
l_song_name = l_song_name + ".opus";
}
QString l_real_name = f_real_name;
if (f_real_name.split(".").size() == 1) {
l_real_name = l_real_name + ".opus";
}
if (!(validateSong(l_song_name, m_cdns) && validateSong(l_real_name, m_cdns))) {
return false;
}
// Avoid conflicts by checking if it exists.
if (m_root_list.contains(l_song_name) && m_global_enabled[f_area_id]) {
return false;
}
if (m_custom_lists->value(f_area_id).contains(f_song_name)) {
return false;
}
if (m_customs_ordered.value(f_area_id).contains(l_song_name)) {
return false;
}
// There should be a way to directly insert into the QMap. Too bad!
MusicList l_custom_list = m_custom_lists->value(f_area_id);
l_custom_list.insert(l_song_name, {l_real_name, f_duration});
m_custom_lists->insert(f_area_id, l_custom_list);
m_customs_ordered.insert(f_area_id, (QStringList{m_customs_ordered.value(f_area_id)} << l_song_name));
emit sendAreaFMPacket(PacketFactory::createPacket("FM", musiclist(f_area_id)), f_area_id);
return true;
}
bool MusicManager::addCustomCategory(QString f_category_name, int f_area_id)
{
if (f_category_name.split(".").size() > 1) {
return false;
}
QString l_category_name = f_category_name;
if (!f_category_name.startsWith("==")) {
l_category_name = "==" + l_category_name + "==";
}
// Avoid conflicts by checking if it exists.
if (m_root_list.contains(l_category_name) && m_global_enabled.value(f_area_id)) {
return false;
}
if (m_custom_lists->value(f_area_id).contains(l_category_name)) {
return false;
}
QMap<QString, QPair<QString, int>> l_custom_list = m_custom_lists->value(f_area_id);
l_custom_list.insert(l_category_name, {l_category_name, 0});
m_custom_lists->insert(f_area_id, l_custom_list);
m_customs_ordered.insert(f_area_id, (QStringList{m_customs_ordered.value(f_area_id)} << l_category_name));
emit sendAreaFMPacket(PacketFactory::createPacket("FM", musiclist(f_area_id)), f_area_id);
return true;
}
bool MusicManager::removeCategorySong(QString f_songcategory_name, int f_area_id)
{
if (!m_root_list.contains(f_songcategory_name)) {
MusicList l_custom_list = m_custom_lists->value(f_area_id);
if (l_custom_list.contains(f_songcategory_name)) {
l_custom_list.remove(f_songcategory_name);
m_custom_lists->insert(f_area_id, l_custom_list);
// Updating the list alias too.
QStringList l_customs_ordered = m_customs_ordered.value(f_area_id);
l_customs_ordered.removeAll(f_songcategory_name);
m_customs_ordered.insert(f_area_id, l_customs_ordered);
emit sendAreaFMPacket(PacketFactory::createPacket("FM", musiclist(f_area_id)), f_area_id);
return true;
} // Fallthrough
}
return false;
}
bool MusicManager::toggleRootEnabled(int f_area_id)
{
m_global_enabled.insert(f_area_id, !m_global_enabled.value(f_area_id));
if (m_global_enabled.value(f_area_id)) {
sanitiseCustomList(f_area_id);
}
emit sendAreaFMPacket(PacketFactory::createPacket("FM", musiclist(f_area_id)), f_area_id);
return m_global_enabled.value(f_area_id);
}
void MusicManager::sanitiseCustomList(int f_area_id)
{
MusicList l_sanitised_list;
QStringList l_sanitised_ordered = m_customs_ordered.value(f_area_id);
for (auto iterator = m_custom_lists->value(f_area_id).keyBegin(),
end = m_custom_lists->value(f_area_id).keyEnd();
iterator != end; ++iterator) {
QString l_key = iterator.operator*();
if (!m_root_list.contains(l_key)) {
l_sanitised_list.insert(l_key, m_custom_lists->value(f_area_id).value(l_key));
}
else {
l_sanitised_ordered.removeAll(l_key);
}
}
m_custom_lists->insert(f_area_id, l_sanitised_list);
m_customs_ordered.insert(f_area_id, l_sanitised_ordered);
}
void MusicManager::clearCustomList(int f_area_id)
{
m_custom_lists->remove(f_area_id);
m_custom_lists->insert(f_area_id, {});
m_customs_ordered.remove(f_area_id);
m_customs_ordered.insert(f_area_id, {});
}
QPair<QString, int> MusicManager::songInformation(QString f_song_name, int f_area_id)
{
if (m_root_list.contains(f_song_name)) {
return m_root_list.value(f_song_name);
}
return m_custom_lists->value(f_area_id).value(f_song_name);
}
bool MusicManager::isCustom(int f_area_id, QString f_song_name)
{
if (m_customs_ordered.value(f_area_id).contains(f_song_name, Qt::CaseInsensitive)) {
return true;
}
return false;
}
void MusicManager::reloadRequest()
{
m_root_list = ConfigManager::musiclist();
m_root_ordered = ConfigManager::ordered_songs();
m_cdns = ConfigManager::cdnList();
}
void MusicManager::userJoinedArea(int f_area_index, int f_user_id)
{
emit sendFMPacket(PacketFactory::createPacket("FM", musiclist(f_area_index)), f_user_id);
}