/* 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 .
*/
#include "playlistparser.h"
#include "xspfparser.h"
#include "m3uparser.h"
#include "plsparser.h"
#include "asxparser.h"
#include "asxiniparser.h"
#include
const int PlaylistParser::kMagicSize = 512;
PlaylistParser::PlaylistParser(QObject *parent)
: QObject(parent)
{
default_parser_ = new XSPFParser(this);
parsers_ << new M3UParser(this);
parsers_ << default_parser_;
parsers_ << new PLSParser(this);
parsers_ << new ASXParser(this);
parsers_ << new AsxIniParser(this);
}
QStringList PlaylistParser::file_extensions() const {
QStringList ret;
foreach (ParserBase* parser, parsers_) {
ret << parser->file_extensions();
}
qStableSort(ret);
return ret;
}
QString PlaylistParser::filters() const {
QStringList filters;
QStringList all_extensions;
foreach (ParserBase* parser, parsers_) {
filters << FilterForParser(parser, &all_extensions);
}
filters.prepend(tr("All playlists (%1)").arg(all_extensions.join(" ")));
return filters.join(";;");
}
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_);
}
ParserBase* PlaylistParser::ParserForExtension(const QString& suffix) const {
foreach (ParserBase* p, parsers_) {
if (p->file_extensions().contains(suffix))
return p;
}
return NULL;
}
ParserBase* PlaylistParser::MaybeGetParserForMagic(const QByteArray& data,
const QString& mime_type) const {
foreach (ParserBase* p, parsers_) {
if ((!mime_type.isEmpty() && mime_type == p->mime_type()) ||
p->TryMagic(data))
return p;
}
return NULL;
}
SongList PlaylistParser::Load(const QString &filename, ParserBase* p) const {
QFileInfo info(filename);
// Find a parser that supports this file extension
ParserBase* parser = p ? p : ParserForExtension(info.suffix());
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());
}