aboutsummaryrefslogtreecommitdiff
path: root/xbmc/windows/GUIMediaWindow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/windows/GUIMediaWindow.cpp')
-rw-r--r--xbmc/windows/GUIMediaWindow.cpp59
1 files changed, 27 insertions, 32 deletions
diff --git a/xbmc/windows/GUIMediaWindow.cpp b/xbmc/windows/GUIMediaWindow.cpp
index aab1d37e0c..4e6464e48e 100644
--- a/xbmc/windows/GUIMediaWindow.cpp
+++ b/xbmc/windows/GUIMediaWindow.cpp
@@ -61,6 +61,7 @@
#include "utils/Variant.h"
#include "utils/log.h"
#include "video/VideoFileItemClassify.h"
+#include "video/VideoInfoTag.h"
#include "view/GUIViewState.h"
#include <inttypes.h>
@@ -1528,40 +1529,34 @@ bool CGUIMediaWindow::OnPlayAndQueueMedia(const CFileItemPtr& item, const std::s
PLAYLIST::Id playlistId = m_guiState->GetPlaylist();
if (playlistId != PLAYLIST::TYPE_NONE)
{
+ // Remove ZIP, RAR files and folders
+ CFileItemList playlist;
+ playlist.Copy(*m_vecItems, true);
+ playlist.erase(std::remove_if(playlist.begin(), playlist.end(),
+ [](const std::shared_ptr<CFileItem>& i)
+ { return i->IsZIP() || i->IsRAR() || i->m_bIsFolder; }),
+ playlist.end());
+
+ // Remove duplicates (eg. ISO/VIDEO_TS)
+ playlist.erase(
+ std::unique(playlist.begin(), playlist.end(),
+ [](const std::shared_ptr<CFileItem>& i, const std::shared_ptr<CFileItem>& j) {
+ return i->GetVideoInfoTag()->m_basePath == j->GetVideoInfoTag()->m_basePath;
+ }),
+ playlist.end());
+
+ // Chosen item
+ int mediaToPlay =
+ std::distance(playlist.begin(), std::find_if(playlist.begin(), playlist.end(),
+ [&item](const std::shared_ptr<CFileItem>& i) {
+ return i->GetVideoInfoTag()->m_basePath ==
+ item->GetVideoInfoTag()->m_basePath;
+ }));
+
+ // Add to playlist
CServiceBroker::GetPlaylistPlayer().ClearPlaylist(playlistId);
CServiceBroker::GetPlaylistPlayer().Reset();
- int mediaToPlay = 0;
-
- // first try to find mainDVD file (VIDEO_TS.IFO).
- // If we find this we should not allow to queue VOB files
- std::string mainDVD;
- for (int i = 0; i < m_vecItems->Size(); i++)
- {
- std::string path = URIUtils::GetFileName(m_vecItems->Get(i)->GetDynPath());
- if (StringUtils::EqualsNoCase(path, "VIDEO_TS.IFO"))
- {
- mainDVD = path;
- break;
- }
- }
-
- // now queue...
- for ( int i = 0; i < m_vecItems->Size(); i++ )
- {
- CFileItemPtr nItem = m_vecItems->Get(i);
-
- if (nItem->m_bIsFolder)
- continue;
-
- if (!nItem->IsZIP() && !nItem->IsRAR() &&
- (!IsDVDFile(*nItem) || (URIUtils::GetFileName(nItem->GetDynPath()) == mainDVD)))
- CServiceBroker::GetPlaylistPlayer().Add(playlistId, nItem);
-
- if (item->IsSamePath(nItem.get()))
- { // item that was clicked
- mediaToPlay = CServiceBroker::GetPlaylistPlayer().GetPlaylist(playlistId).size() - 1;
- }
- }
+ CServiceBroker::GetPlaylistPlayer().Add(playlistId, playlist);
// Save current window and directory to know where the selected item was
if (m_guiState)