2010-05-22 22:06:19 +02:00
|
|
|
/* This file is part of Clementine.
|
|
|
|
|
|
|
|
Clementine 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 3 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
Clementine 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 Clementine. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "playlistparser.h"
|
|
|
|
#include "xspfparser.h"
|
|
|
|
#include "m3uparser.h"
|
2010-05-22 23:11:22 +02:00
|
|
|
#include "plsparser.h"
|
2010-05-27 22:55:34 +02:00
|
|
|
#include "asxparser.h"
|
2010-07-10 20:39:41 +02:00
|
|
|
#include "asxiniparser.h"
|
2010-05-22 22:06:19 +02:00
|
|
|
|
|
|
|
#include <QtDebug>
|
|
|
|
|
2010-06-15 15:24:17 +02:00
|
|
|
const int PlaylistParser::kMagicSize = 512;
|
|
|
|
|
2010-05-22 22:06:19 +02:00
|
|
|
PlaylistParser::PlaylistParser(QObject *parent)
|
|
|
|
: QObject(parent)
|
|
|
|
{
|
2010-07-31 15:10:08 +02:00
|
|
|
default_parser_ = new XSPFParser(this);
|
2010-05-22 22:06:19 +02:00
|
|
|
parsers_ << new M3UParser(this);
|
2010-07-31 15:10:08 +02:00
|
|
|
parsers_ << default_parser_;
|
2010-05-22 23:11:22 +02:00
|
|
|
parsers_ << new PLSParser(this);
|
2010-05-27 22:55:34 +02:00
|
|
|
parsers_ << new ASXParser(this);
|
2010-07-10 20:39:41 +02:00
|
|
|
parsers_ << new AsxIniParser(this);
|
2010-05-22 22:06:19 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
QStringList PlaylistParser::file_extensions() const {
|
|
|
|
QStringList ret;
|
|
|
|
|
|
|
|
foreach (ParserBase* parser, parsers_) {
|
|
|
|
ret << parser->file_extensions();
|
|
|
|
}
|
|
|
|
|
|
|
|
qStableSort(ret);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2010-05-23 00:29:52 +02:00
|
|
|
QString PlaylistParser::filters() const {
|
|
|
|
QStringList filters;
|
|
|
|
QStringList all_extensions;
|
|
|
|
foreach (ParserBase* parser, parsers_) {
|
2010-07-31 15:10:08 +02:00
|
|
|
filters << FilterForParser(parser, &all_extensions);
|
2010-05-23 00:29:52 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
filters.prepend(tr("All playlists (%1)").arg(all_extensions.join(" ")));
|
|
|
|
|
|
|
|
return filters.join(";;");
|
2010-05-22 22:28:11 +02:00
|
|
|
}
|
|
|
|
|
2010-07-31 15:10:08 +02:00
|
|
|
QString PlaylistParser::FilterForParser(const ParserBase *parser, QStringList *all_extensions) const {
|
|
|
|
QStringList extensions;
|
|
|
|
foreach (const QString& extension, parser->file_extensions())
|
|
|
|
extensions << "*." + extension;
|
|
|
|
|
|
|
|
if (all_extensions)
|
|
|
|
*all_extensions << extensions;
|
|
|
|
|
|
|
|
return tr("%1 playlists (%2)").arg(parser->name(), extensions.join(" "));
|
|
|
|
}
|
|
|
|
|
|
|
|
QString PlaylistParser::default_extension() const {
|
|
|
|
return default_parser_->file_extensions()[0];
|
|
|
|
}
|
|
|
|
|
|
|
|
QString PlaylistParser::default_filter() const {
|
|
|
|
return FilterForParser(default_parser_);
|
|
|
|
}
|
|
|
|
|
2010-05-22 22:06:19 +02:00
|
|
|
ParserBase* PlaylistParser::ParserForExtension(const QString& suffix) const {
|
|
|
|
foreach (ParserBase* p, parsers_) {
|
|
|
|
if (p->file_extensions().contains(suffix))
|
|
|
|
return p;
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2010-06-15 16:52:42 +02:00
|
|
|
ParserBase* PlaylistParser::MaybeGetParserForMagic(const QByteArray& data,
|
|
|
|
const QString& mime_type) const {
|
2010-06-15 15:24:17 +02:00
|
|
|
foreach (ParserBase* p, parsers_) {
|
2010-06-15 16:52:42 +02:00
|
|
|
if ((!mime_type.isEmpty() && mime_type == p->mime_type()) ||
|
|
|
|
p->TryMagic(data))
|
2010-06-15 15:24:17 +02:00
|
|
|
return p;
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
SongList PlaylistParser::Load(const QString &filename, ParserBase* p) const {
|
2010-05-22 22:06:19 +02:00
|
|
|
QFileInfo info(filename);
|
|
|
|
|
|
|
|
// Find a parser that supports this file extension
|
2010-06-15 15:24:17 +02:00
|
|
|
ParserBase* parser = p ? p : ParserForExtension(info.suffix());
|
2010-05-22 22:06:19 +02:00
|
|
|
if (!parser) {
|
|
|
|
qWarning() << "Unknown filetype:" << filename;
|
|
|
|
return SongList();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Open the file
|
|
|
|
QFile file(filename);
|
|
|
|
file.open(QIODevice::ReadOnly);
|
|
|
|
|
|
|
|
return parser->Load(&file, info.absolutePath());
|
|
|
|
}
|
|
|
|
|
|
|
|
void PlaylistParser::Save(const SongList &songs, const QString &filename) const {
|
|
|
|
QFileInfo info(filename);
|
|
|
|
|
|
|
|
// Find a parser that supports this file extension
|
|
|
|
ParserBase* parser = ParserForExtension(info.suffix());
|
|
|
|
if (!parser) {
|
|
|
|
qWarning() << "Unknown filetype:" << filename;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Open the file
|
|
|
|
QFile file(filename);
|
|
|
|
file.open(QIODevice::WriteOnly);
|
|
|
|
|
|
|
|
return parser->Save(songs, &file, info.absolutePath());
|
|
|
|
}
|