Support for saving .pls files
This commit is contained in:
parent
211ae65e3d
commit
06c6bebe15
@ -30,6 +30,7 @@ bool ParserBase::ParseTrackLocation(const QString& filename_or_url,
|
|||||||
QUrl temp(filename_or_url);
|
QUrl temp(filename_or_url);
|
||||||
if (temp.isValid()) {
|
if (temp.isValid()) {
|
||||||
song->set_filename(temp.toString());
|
song->set_filename(temp.toString());
|
||||||
|
song->set_filetype(Song::Type_Stream);
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
|
@ -41,7 +41,10 @@ SongList PLSParser::Load(QIODevice *device, const QDir &dir) const {
|
|||||||
|
|
||||||
// We try not to rely on NumberOfEntries (it might not be present), so go
|
// We try not to rely on NumberOfEntries (it might not be present), so go
|
||||||
// through each key in the file and look at ones that start with "File"
|
// through each key in the file and look at ones that start with "File"
|
||||||
foreach (const QString& key, s.childKeys()) {
|
QStringList keys(s.childKeys());
|
||||||
|
keys.sort(); // Make sure we get the tracks in order
|
||||||
|
|
||||||
|
foreach (const QString& key, keys) {
|
||||||
if (!key.toLower().startsWith("file"))
|
if (!key.toLower().startsWith("file"))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -70,5 +73,24 @@ SongList PLSParser::Load(QIODevice *device, const QDir &dir) const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void PLSParser::Save(const SongList &songs, QIODevice *device, const QDir &dir) const {
|
void PLSParser::Save(const SongList &songs, QIODevice *device, const QDir &dir) const {
|
||||||
|
QTemporaryFile temp_file;
|
||||||
|
temp_file.open();
|
||||||
|
|
||||||
|
QSettings s(temp_file.fileName(), QSettings::IniFormat);
|
||||||
|
s.beginGroup("playlist");
|
||||||
|
s.setValue("Version", 2);
|
||||||
|
s.setValue("NumberOfEntries", songs.count());
|
||||||
|
|
||||||
|
int n = 1;
|
||||||
|
foreach (const Song& song, songs) {
|
||||||
|
s.setValue("File" + QString::number(n), song.filename());
|
||||||
|
s.setValue("Title" + QString::number(n), song.title());
|
||||||
|
s.setValue("Length" + QString::number(n), song.length());
|
||||||
|
++n;
|
||||||
|
}
|
||||||
|
|
||||||
|
s.sync();
|
||||||
|
|
||||||
|
temp_file.seek(0);
|
||||||
|
device->write(temp_file.readAll());
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,8 @@
|
|||||||
|
|
||||||
#include <QBuffer>
|
#include <QBuffer>
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
|
#include <QTemporaryFile>
|
||||||
|
#include <QtDebug>
|
||||||
|
|
||||||
#include <boost/shared_ptr.hpp>
|
#include <boost/shared_ptr.hpp>
|
||||||
|
|
||||||
@ -60,3 +62,32 @@ TEST_F(PLSParserTest, ParseSomaFM) {
|
|||||||
EXPECT_EQ(-1, songs[0].length());
|
EXPECT_EQ(-1, songs[0].length());
|
||||||
EXPECT_EQ(Song::Type_Stream, songs[0].filetype());
|
EXPECT_EQ(Song::Type_Stream, songs[0].filetype());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(PLSParserTest, SaveAndLoad) {
|
||||||
|
Song one;
|
||||||
|
one.set_filename("http://www.example.com/foo.mp3");
|
||||||
|
one.set_title("Foo");
|
||||||
|
|
||||||
|
Song two;
|
||||||
|
two.set_filename("relative/bar.mp3");
|
||||||
|
two.set_title("Bar");
|
||||||
|
two.set_length(123);
|
||||||
|
|
||||||
|
SongList songs;
|
||||||
|
songs << one << two;
|
||||||
|
|
||||||
|
QTemporaryFile temp;
|
||||||
|
temp.open();
|
||||||
|
parser_.Save(songs, &temp);
|
||||||
|
|
||||||
|
temp.seek(0);
|
||||||
|
songs = parser_.Load(&temp, QDir("/meep"));
|
||||||
|
|
||||||
|
ASSERT_EQ(2, songs.count());
|
||||||
|
EXPECT_EQ(one.filename(), songs[0].filename());
|
||||||
|
EXPECT_EQ("/meep/relative/bar.mp3", songs[1].filename());
|
||||||
|
EXPECT_EQ(one.title(), songs[0].title());
|
||||||
|
EXPECT_EQ(two.title(), songs[1].title());
|
||||||
|
EXPECT_EQ(one.length(), songs[0].length());
|
||||||
|
EXPECT_EQ(two.length(), songs[1].length());
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user