From b45f600a4ecf9b3f6121a30794e9fcbbb2fee621 Mon Sep 17 00:00:00 2001 From: trialuser02 Date: Mon, 12 Jun 2017 12:49:11 +0000 Subject: improved m3u support (#910) git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@7227 90c681e8-e032-0410-971d-27865f9a5e38 --- .../PlayListFormats/m3u/m3uplaylistformat.cpp | 20 ++++++++++++++++---- src/plugins/PlayListFormats/m3u/m3uplaylistformat.h | 4 ++-- .../PlayListFormats/pls/plsplaylistformat.cpp | 5 +++-- src/plugins/PlayListFormats/pls/plsplaylistformat.h | 4 ++-- .../PlayListFormats/xspf/xspfplaylistformat.cpp | 5 +++-- .../PlayListFormats/xspf/xspfplaylistformat.h | 4 ++-- src/qmmpui/playlistformat.h | 7 ++++--- src/qmmpui/playlistparser.cpp | 2 +- 8 files changed, 33 insertions(+), 18 deletions(-) diff --git a/src/plugins/PlayListFormats/m3u/m3uplaylistformat.cpp b/src/plugins/PlayListFormats/m3u/m3uplaylistformat.cpp index e436eaec3..eb3fc19d1 100644 --- a/src/plugins/PlayListFormats/m3u/m3uplaylistformat.cpp +++ b/src/plugins/PlayListFormats/m3u/m3uplaylistformat.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2008-2012 by Ilya Kotov * + * Copyright (C) 2008-2017 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -20,6 +20,7 @@ #include #include +#include #include "m3uplaylistformat.h" const PlayListFormatProperties M3UPlaylistFormat::properties() const @@ -51,15 +52,26 @@ QStringList M3UPlaylistFormat::decode(const QString & contents) return out; } -QString M3UPlaylistFormat::encode(const QList & contents) +QString M3UPlaylistFormat::encode(const QList & contents, const QString &path) { QStringList out; out << QString("#EXTM3U"); + MetaDataFormatter formatter("%if(%p,%p - %t,%t)%if(%p|%t,,%f)"); + QString m3uDir = QFileInfo(path).canonicalPath(); + foreach(PlayListTrack* f,contents) { - QString info = "#EXTINF:" + QString::number(f->length()) + "," + f->value(Qmmp::TITLE); + QString info = "#EXTINF:" + QString::number(f->length()) + "," + formatter.format(f); out.append(info); - out.append(f->url()); + + if(!f->url().contains("://") && f->url().startsWith(m3uDir)) + { + QString p = f->url(); + p.remove(0, m3uDir.size() + 1); + out.append(p); + } + else + out.append(f->url()); } return out.join("\n"); } diff --git a/src/plugins/PlayListFormats/m3u/m3uplaylistformat.h b/src/plugins/PlayListFormats/m3u/m3uplaylistformat.h index ff9f19c63..379ae063e 100644 --- a/src/plugins/PlayListFormats/m3u/m3uplaylistformat.h +++ b/src/plugins/PlayListFormats/m3u/m3uplaylistformat.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2008-2012 by Ilya Kotov * + * Copyright (C) 2008-2017 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -37,7 +37,7 @@ class M3UPlaylistFormat : public QObject, public PlayListFormat public: const PlayListFormatProperties properties() const; QStringList decode(const QString& contents); - QString encode(const QList& contents); + QString encode(const QList& contents, const QString &path); }; diff --git a/src/plugins/PlayListFormats/pls/plsplaylistformat.cpp b/src/plugins/PlayListFormats/pls/plsplaylistformat.cpp index 76073a7c6..ac4954567 100644 --- a/src/plugins/PlayListFormats/pls/plsplaylistformat.cpp +++ b/src/plugins/PlayListFormats/pls/plsplaylistformat.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2008-2012 by Ilya Kotov * + * Copyright (C) 2008-2017 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -64,8 +64,9 @@ QStringList PLSPlaylistFormat::decode(const QString & contents) return QStringList(); } -QString PLSPlaylistFormat::encode(const QList & contents) +QString PLSPlaylistFormat::encode(const QList & contents, const QString &path) { + Q_UNUSED(path); QStringList out; out << QString("[playlist]"); int counter = 1; diff --git a/src/plugins/PlayListFormats/pls/plsplaylistformat.h b/src/plugins/PlayListFormats/pls/plsplaylistformat.h index 86fc18d00..7fed6d810 100644 --- a/src/plugins/PlayListFormats/pls/plsplaylistformat.h +++ b/src/plugins/PlayListFormats/pls/plsplaylistformat.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2008 by Ilya Kotov * + * Copyright (C) 2008-2017 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -37,7 +37,7 @@ class PLSPlaylistFormat : public QObject, public PlayListFormat public: const PlayListFormatProperties properties() const; QStringList decode(const QString& contents); - QString encode(const QList& contents); + QString encode(const QList& contents, const QString &path); }; diff --git a/src/plugins/PlayListFormats/xspf/xspfplaylistformat.cpp b/src/plugins/PlayListFormats/xspf/xspfplaylistformat.cpp index adea65e0e..d5ab21fb5 100644 --- a/src/plugins/PlayListFormats/xspf/xspfplaylistformat.cpp +++ b/src/plugins/PlayListFormats/xspf/xspfplaylistformat.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2008-2014 by Ilya Kotov * + * Copyright (C) 2008-2017 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -88,8 +88,9 @@ QStringList XSPFPlaylistFormat::decode(const QString & contents) // Needs more work - it's better use libSpiff there and put it as plugin. -QString XSPFPlaylistFormat::encode(const QList & files) +QString XSPFPlaylistFormat::encode(const QList & files, const QString &path) { + Q_UNUSED(path); QString out; QXmlStreamWriter xml(&out); xml.setCodec("UTF-8"); diff --git a/src/plugins/PlayListFormats/xspf/xspfplaylistformat.h b/src/plugins/PlayListFormats/xspf/xspfplaylistformat.h index d1e5c0cb9..d3b03d3ca 100644 --- a/src/plugins/PlayListFormats/xspf/xspfplaylistformat.h +++ b/src/plugins/PlayListFormats/xspf/xspfplaylistformat.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2008-2014 by Ilya Kotov * + * Copyright (C) 2008-2017 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -37,7 +37,7 @@ class XSPFPlaylistFormat : public QObject, public PlayListFormat public: const PlayListFormatProperties properties() const; QStringList decode(const QString& contents); - QString encode(const QList& contents); + QString encode(const QList& contents, const QString &path); }; #endif diff --git a/src/qmmpui/playlistformat.h b/src/qmmpui/playlistformat.h index ba7ca26f2..06927cfbf 100644 --- a/src/qmmpui/playlistformat.h +++ b/src/qmmpui/playlistformat.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2006-2013 by Ilya Kotov * + * Copyright (C) 2006-2017 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -56,9 +56,10 @@ public: virtual QStringList decode(const QString& contents) = 0; /*! * Takes the list of AbstractPlaylistItem objects, should return string of - * encoded playlist file + * encoded playlist file. + * @param dir Playlist file path (May be used to adjust playlist content). */ - virtual QString encode(const QList& contents) = 0; + virtual QString encode(const QList& contents, const QString &path) = 0; }; Q_DECLARE_INTERFACE(PlayListFormat,"PlayListFormat/1.0") diff --git a/src/qmmpui/playlistparser.cpp b/src/qmmpui/playlistparser.cpp index 083cb35d4..70c3c3fe9 100644 --- a/src/qmmpui/playlistparser.cpp +++ b/src/qmmpui/playlistparser.cpp @@ -90,7 +90,7 @@ void PlayListParser::savePlayList(QList tracks, const QString & if (file.open(QIODevice::WriteOnly)) { QTextStream ts(&file); - ts << prs->encode(tracks); + ts << prs->encode(tracks, QFileInfo(f_name).canonicalFilePath()); file.close(); } else -- cgit v1.2.3-13-gbd6f