summaryrefslogtreecommitdiffstats
path: root/xbmc/playlists/PlayListB4S.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/playlists/PlayListB4S.cpp')
-rw-r--r--xbmc/playlists/PlayListB4S.cpp133
1 files changed, 133 insertions, 0 deletions
diff --git a/xbmc/playlists/PlayListB4S.cpp b/xbmc/playlists/PlayListB4S.cpp
new file mode 100644
index 0000000..52a06fb
--- /dev/null
+++ b/xbmc/playlists/PlayListB4S.cpp
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2005-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#include "PlayListB4S.h"
+
+#include "FileItem.h"
+#include "Util.h"
+#include "filesystem/File.h"
+#include "music/tags/MusicInfoTag.h"
+#include "utils/StringUtils.h"
+#include "utils/URIUtils.h"
+#include "utils/XBMCTinyXML.h"
+#include "utils/XMLUtils.h"
+#include "utils/log.h"
+
+#include <iostream>
+#include <string>
+
+using namespace XFILE;
+using namespace PLAYLIST;
+
+/* ------------------------ example b4s playlist file ---------------------------------
+ <?xml version="1.0" encoding='UTF-8' standalone="yes"?>
+ <WinampXML>
+ <!-- Generated by: Nullsoft Winamp3 version 3.0d -->
+ <playlist num_entries="2" label="Playlist 001">
+ <entry Playstring="file:E:\Program Files\Winamp3\demo.mp3">
+ <Name>demo</Name>
+ <Length>5982</Length>
+ </entry>
+ <entry Playstring="file:E:\Program Files\Winamp3\demo.mp3">
+ <Name>demo</Name>
+ <Length>5982</Length>
+ </entry>
+ </playlist>
+ </WinampXML>
+------------------------ end of example b4s playlist file ---------------------------------*/
+CPlayListB4S::CPlayListB4S(void) = default;
+
+CPlayListB4S::~CPlayListB4S(void) = default;
+
+
+bool CPlayListB4S::LoadData(std::istream& stream)
+{
+ CXBMCTinyXML xmlDoc;
+
+ stream >> xmlDoc;
+
+ if (xmlDoc.Error())
+ {
+ CLog::Log(LOGERROR, "Unable to parse B4S info Error: {}", xmlDoc.ErrorDesc());
+ return false;
+ }
+
+ TiXmlElement* pRootElement = xmlDoc.RootElement();
+ if (!pRootElement ) return false;
+
+ TiXmlElement* pPlayListElement = pRootElement->FirstChildElement("playlist");
+ if (!pPlayListElement ) return false;
+ m_strPlayListName = XMLUtils::GetAttribute(pPlayListElement, "label");
+
+ TiXmlElement* pEntryElement = pPlayListElement->FirstChildElement("entry");
+
+ if (!pEntryElement) return false;
+ while (pEntryElement)
+ {
+ std::string strFileName = XMLUtils::GetAttribute(pEntryElement, "Playstring");
+ size_t iColon = strFileName.find(':');
+ if (iColon != std::string::npos)
+ {
+ iColon++;
+ strFileName.erase(0, iColon);
+ }
+ if (strFileName.size())
+ {
+ TiXmlNode* pNodeInfo = pEntryElement->FirstChild("Name");
+ TiXmlNode* pNodeLength = pEntryElement->FirstChild("Length");
+ long lDuration = 0;
+ if (pNodeLength)
+ {
+ lDuration = atol(pNodeLength->FirstChild()->Value());
+ }
+ if (pNodeInfo)
+ {
+ std::string strInfo = pNodeInfo->FirstChild()->Value();
+ strFileName = URIUtils::SubstitutePath(strFileName);
+ CUtil::GetQualifiedFilename(m_strBasePath, strFileName);
+ CFileItemPtr newItem(new CFileItem(strInfo));
+ newItem->SetPath(strFileName);
+ newItem->GetMusicInfoTag()->SetDuration(lDuration);
+ Add(newItem);
+ }
+ }
+ pEntryElement = pEntryElement->NextSiblingElement();
+ }
+ return true;
+}
+
+void CPlayListB4S::Save(const std::string& strFileName) const
+{
+ if (!m_vecItems.size()) return ;
+ std::string strPlaylist = strFileName;
+ strPlaylist = CUtil::MakeLegalPath(strPlaylist);
+ CFile file;
+ if (!file.OpenForWrite(strPlaylist, true))
+ {
+ CLog::Log(LOGERROR, "Could not save B4S playlist: [{}]", strPlaylist);
+ return ;
+ }
+ std::string write;
+ write += StringUtils::Format("<?xml version={}1.0{} encoding='UTF-8' standalone={}yes{}?>\n", 34,
+ 34, 34, 34);
+ write += StringUtils::Format("<WinampXML>\n");
+ write += StringUtils::Format(" <playlist num_entries=\"{0}\" label=\"{1}\">\n",
+ m_vecItems.size(), m_strPlayListName);
+ for (int i = 0; i < (int)m_vecItems.size(); ++i)
+ {
+ const CFileItemPtr item = m_vecItems[i];
+ write += StringUtils::Format(" <entry Playstring={}file:{}{}>\n", 34, item->GetPath(), 34);
+ write += StringUtils::Format(" <Name>{}</Name>\n", item->GetLabel().c_str());
+ write +=
+ StringUtils::Format(" <Length>{}</Length>\n", item->GetMusicInfoTag()->GetDuration());
+ }
+ write += StringUtils::Format(" </playlist>\n");
+ write += StringUtils::Format("</WinampXML>\n");
+ file.Write(write.c_str(), write.size());
+ file.Close();
+}