/*************************************************************************** * Copyright (C) 2008-2020 by Ilya Kotov * * forkotov02@ya.ru * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #include #include #include "qmmpuisettings.h" #include "metadatahelper_p.h" #include "playlisttrack.h" PlayListTrack::PlayListTrack() : TrackInfo(), PlayListItem() { m_track_index = -1; m_settings = QmmpUiSettings::instance(); m_helper = MetaDataHelper::instance(); m_refCount = 0; m_sheduledForDeletion = false; } PlayListTrack::PlayListTrack(const PlayListTrack &other) : TrackInfo(other), PlayListItem() { m_track_index = -1; m_settings = QmmpUiSettings::instance(); m_helper = MetaDataHelper::instance(); m_refCount = 0; m_sheduledForDeletion = false; m_formattedTitles = other.m_formattedTitles; m_group = other.m_group; m_formattedLength = other.m_formattedLength; m_titleFormats = other.m_titleFormats; m_groupFormat = other.m_groupFormat; setSelected(other.isSelected()); m_formattedLength = other.m_formattedLength; } PlayListTrack::PlayListTrack(TrackInfo *info) : TrackInfo(*info), PlayListItem() { m_track_index = -1; m_settings = QmmpUiSettings::instance(); m_helper = MetaDataHelper::instance(); m_refCount = 0; m_sheduledForDeletion = false; } PlayListTrack::~PlayListTrack() { if(m_refCount != 0) qWarning("PlayListTrack: deleting busy track"); } PlayListTrack &PlayListTrack::operator=(const PlayListTrack &other) { TrackInfo::operator =(other); m_formattedTitles = other.m_formattedTitles; m_group = other.m_group; m_formattedLength = other.m_formattedLength; m_titleFormats = other.m_titleFormats; m_groupFormat = other.m_groupFormat; setSelected(other.isSelected()); m_formattedLength = other.m_formattedLength; return *this; } void PlayListTrack::updateMetaData(const TrackInfo *info) { setValues(info->metaData()); if(info->parts() & TrackInfo::Properties) setValues(info->properties()); if(info->parts() & TrackInfo::ReplayGainInfo) setValues(info->replayGainInfo()); setDuration(info->duration()); setPath(info->path()); m_formattedTitles.clear(); m_formattedLength.clear(); formatGroup(); } void PlayListTrack::updateMetaData() { QList list = MetaDataManager::instance()->createPlayList(path()); if(!list.isEmpty() && !list.first()->path().contains("://")) { TrackInfo *info = list.first(); updateMetaData(info); } qDeleteAll(list); } const QString &PlayListTrack::groupName() { if(m_group.isEmpty() || m_groupFormat != m_settings->groupFormat()) { m_groupFormat = m_settings->groupFormat(); formatGroup(); } return m_group; } bool PlayListTrack::isGroup() const { return false; } void PlayListTrack::setTrackIndex(int track_index) { m_track_index = track_index; } int PlayListTrack::trackIndex() const { return m_track_index; } void PlayListTrack::beginUsage() { m_refCount++; } void PlayListTrack::endUsage() { m_refCount--; } void PlayListTrack::deleteLater() { m_sheduledForDeletion = true; } bool PlayListTrack::isSheduledForDeletion() const { return m_sheduledForDeletion; } bool PlayListTrack::isUsed() const { return (m_refCount != 0); } QString PlayListTrack::formattedTitle(int column) { if(m_formattedTitles.count() != m_helper->columnCount()) { while(m_formattedTitles.count() > m_helper->columnCount()) m_formattedTitles.takeLast(); while(m_formattedTitles.count() < m_helper->columnCount()) m_formattedTitles.append(QString()); while(m_titleFormats.count() > m_helper->columnCount()) m_titleFormats.takeLast(); while(m_titleFormats.count() < m_helper->columnCount()) m_titleFormats.append(QString()); } if(column < 0 || column >= m_formattedTitles.size()) { qWarning("PlayListTrack: column number is out of range"); return QString(); } if(m_formattedTitles[column].isEmpty() || m_titleFormats[column] != m_helper->titleFormatter(column)->pattern()) { m_titleFormats[column] = m_helper->titleFormatter(column)->pattern(); formatTitle(column); } return m_formattedTitles[column]; } QStringList PlayListTrack::formattedTitles() { if(m_formattedTitles.count() != m_helper->columnCount()) { while(m_formattedTitles.count() > m_helper->columnCount()) m_formattedTitles.takeLast(); while(m_formattedTitles.count() < m_helper->columnCount()) m_formattedTitles.append(QString()); while(m_titleFormats.count() > m_helper->columnCount()) m_titleFormats.takeLast(); while(m_titleFormats.count() < m_helper->columnCount()) m_titleFormats.append(QString()); } for(int column = 0; column < m_helper->columnCount(); column++) { if(m_formattedTitles[column].isEmpty() || m_titleFormats[column] != m_helper->titleFormatter(column)->pattern() || m_titleFormats[column].contains("%I")) { m_titleFormats[column] = m_helper->titleFormatter(column)->pattern(); formatTitle(column); } } return m_formattedTitles; } QString PlayListTrack::formattedLength() { if(duration() > 0 && m_formattedLength.isEmpty()) m_formattedLength = MetaDataFormatter::formatDuration(duration()); else if(duration() <= 0 && !m_formattedLength.isEmpty()) m_formattedLength.clear(); return m_formattedLength; } void PlayListTrack::formatTitle(int column) { m_formattedTitles[column] = m_helper->titleFormatter(column)->format(this); if(m_formattedTitles.count() == 1) { if (m_formattedTitles[column].isEmpty()) m_formattedTitles[column] = path().section('/',-1); if (m_formattedTitles[column].isEmpty()) m_formattedTitles[column] = path(); } if (m_settings->convertUnderscore()) m_formattedTitles[column].replace("_", " "); if (m_settings->convertTwenty()) m_formattedTitles[column].replace("%20", " "); } void PlayListTrack::formatGroup() { if(duration() <= 0 && path().contains("://")) { m_group = qApp->translate("PlayListTrack", "Streams"); return; } m_group = m_helper->groupFormatter()->format(this); if (m_group.isEmpty()) m_group = qApp->translate("PlayListTrack", "Empty group"); if (m_settings->convertUnderscore()) m_group.replace("_", " "); if (m_settings->convertTwenty()) m_group.replace("%20", " "); }