diff --git a/xbmc/Application.cpp b/xbmc/Application.cpp index c47013451d001..1aed252ee5242 100644 --- a/xbmc/Application.cpp +++ b/xbmc/Application.cpp @@ -3132,9 +3132,9 @@ PlayBackRet CApplication::PlayStack(const CFileItem& item, bool bRestart) return PLAYBACK_FAIL; CVideoDatabase dbs; - - // case 1: stacked ISOs - if (CFileItem(CStackDirectory::GetFirstStackedFile(item.GetPath()),false).IsDiscImage()) + std::string firstStacked = CStackDirectory::GetFirstStackedFile(item.GetPath()); + // case 1: stacked ISOs or stub discs + if (URIUtils::IsDiscImage(firstStacked) || URIUtils::IsDiscStub(firstStacked)) { CStackDirectory dir; CFileItemList movieList; @@ -3304,30 +3304,12 @@ PlayBackRet CApplication::PlayFile(const CFileItem& item, bool bRestart) CUtil::ClearSubtitles(); } - if (item.IsEFileStub()) + if (item.IsEFileStub() || item.IsDiscStub()) { if (!CGUIDialogPlayEject::ShowAndGetInput(item)) return PLAYBACK_CANCELED; } - if (item.IsDiscStub()) - { -#ifdef HAS_DVD_DRIVE - // Display the Play Eject dialog if there is any optical disc drive - if (g_mediaManager.HasOpticalDrive()) - { - if (CGUIDialogPlayEject::ShowAndGetInput(item)) - // PlayDiscAskResume takes path to disc. No parameter means default DVD drive. - // Can't do better as CGUIDialogPlayEject calls CMediaManager::IsDiscInDrive, which assumes default DVD drive anyway - return MEDIA_DETECT::CAutorun::PlayDiscAskResume() ? PLAYBACK_OK : PLAYBACK_FAIL; - } - else -#endif - CGUIDialogOK::ShowAndGetInput(CVariant{435}, CVariant{436}); - - return PLAYBACK_OK; - } - if (item.IsPlayList()) return PLAYBACK_FAIL; @@ -3340,7 +3322,7 @@ PlayBackRet CApplication::PlayFile(const CFileItem& item, bool bRestart) } // a disc image might be Blu-Ray disc - if (item.IsBDFile() || item.IsDiscImage()) + if (item.IsBDFile() || item.IsDiscImage() || item.IsDiscStub()) { //check if we must show the simplified bd menu if (!CGUIDialogSimpleMenu::ShowPlaySelection(const_cast(item))) diff --git a/xbmc/FileItem.cpp b/xbmc/FileItem.cpp index 729a438862672..c47571b2bed41 100644 --- a/xbmc/FileItem.cpp +++ b/xbmc/FileItem.cpp @@ -740,13 +740,7 @@ bool CFileItem::IsPVRTimer() const bool CFileItem::IsDiscStub() const { - if (IsVideoDb() && HasVideoInfoTag()) - { - CFileItem dbItem(m_bIsFolder ? GetVideoInfoTag()->m_strPath : GetVideoInfoTag()->m_strFileNameAndPath, m_bIsFolder); - return dbItem.IsDiscStub(); - } - - return URIUtils::HasExtension(m_strPath, g_advancedSettings.m_discStubExtensions); + return URIUtils::IsDiscStub(m_strPath); } bool CFileItem::IsAudio() const diff --git a/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamBluray.cpp b/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamBluray.cpp index c8ed36ae4d97c..d91993f9e500b 100644 --- a/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamBluray.cpp +++ b/xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamBluray.cpp @@ -38,6 +38,7 @@ #include "dialogs/GUIDialogKaiToast.h" #include "guilib/LocalizeStrings.h" #include "settings/DiscSettings.h" +#include "storage/MediaManager.h" #define LIBBLURAY_BYTESEEK 0 @@ -262,13 +263,16 @@ bool CDVDInputStreamBluray::Open(const char* strFile, const std::string& content std::string filename; std::string root; - if(URIUtils::IsProtocol(strPath, "bluray")) + if(g_mediaManager.TranslateDevicePath("") == strPath) + strPath = URIUtils::AddFileToFolder(strFile, "BDMV/index.bdmv"); + + if (URIUtils::IsProtocol(strPath, "bluray")) { CURL url(strPath); root = url.GetHostName(); filename = URIUtils::GetFileName(url.GetFileName()); } - else if(URIUtils::HasExtension(strPath, ".iso|.img")) + else if(URIUtils::IsDiscImage(strPath)) { CURL url("udf://"); url.SetHostName(strPath); diff --git a/xbmc/cores/dvdplayer/DVDPlayer.cpp b/xbmc/cores/dvdplayer/DVDPlayer.cpp index 75ff036df4d61..54e88c621080e 100644 --- a/xbmc/cores/dvdplayer/DVDPlayer.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayer.cpp @@ -720,7 +720,8 @@ bool CDVDPlayer::OpenInputStream() // correct the filename if needed std::string filename(m_filename); if (URIUtils::IsProtocol(filename, "dvd") - || StringUtils::EqualsNoCase(filename, "iso9660://video_ts/video_ts.ifo")) + || StringUtils::EqualsNoCase(filename, "iso9660://video_ts/video_ts.ifo") + || URIUtils::IsDiscStub(filename)) { m_filename = g_mediaManager.TranslateDevicePath(""); } diff --git a/xbmc/dialogs/GUIDialogSimpleMenu.cpp b/xbmc/dialogs/GUIDialogSimpleMenu.cpp index 6911d5424c2ac..9f4e46dc6124b 100644 --- a/xbmc/dialogs/GUIDialogSimpleMenu.cpp +++ b/xbmc/dialogs/GUIDialogSimpleMenu.cpp @@ -31,6 +31,7 @@ #include "video/VideoInfoTag.h" #include "URL.h" #include "utils/Variant.h" +#include "storage/MediaManager.h" bool CGUIDialogSimpleMenu::ShowPlaySelection(CFileItem& item) { @@ -75,6 +76,19 @@ bool CGUIDialogSimpleMenu::ShowPlaySelection(CFileItem& item) return ShowPlaySelection(item, url.Get()); } } + + if (item.IsDiscStub()) + { + std::string filename(g_mediaManager.TranslateDevicePath("")); + if (XFILE::CFile::Exists(URIUtils::AddFileToFolder(filename, "BDMV/index.bdmv"))) + { + CURL url("bluray://"); + url.SetHostName(filename); + url.SetFileName("root"); + return ShowPlaySelection(item, url.Get()); + } + } + return true; } diff --git a/xbmc/settings/AdvancedSettings.cpp b/xbmc/settings/AdvancedSettings.cpp index 500036a11ee6b..952c318cb1616 100644 --- a/xbmc/settings/AdvancedSettings.cpp +++ b/xbmc/settings/AdvancedSettings.cpp @@ -379,9 +379,8 @@ void CAdvancedSettings::Initialize() m_pictureExtensions = ".png|.jpg|.jpeg|.bmp|.gif|.ico|.tif|.tiff|.tga|.pcx|.cbz|.zip|.cbr|.rar|.dng|.nef|.cr2|.crw|.orf|.arw|.erf|.3fr|.dcr|.x3f|.mef|.raf|.mrw|.pef|.sr2|.rss"; m_musicExtensions = ".nsv|.m4a|.flac|.aac|.strm|.pls|.rm|.rma|.mpa|.wav|.wma|.ogg|.mp3|.mp2|.m3u|.gdm|.imf|.m15|.sfx|.uni|.ac3|.dts|.cue|.aif|.aiff|.wpl|.ape|.mac|.mpc|.mp+|.mpp|.shn|.zip|.rar|.wv|.dsp|.xsp|.xwav|.waa|.wvs|.wam|.gcm|.idsp|.mpdsp|.mss|.spt|.rsd|.sap|.cmc|.cmr|.dmc|.mpt|.mpd|.rmt|.tmc|.tm8|.tm2|.oga|.url|.pxml|.tta|.rss|.wtv|.mka|.tak|.opus|.dff|.dsf"; - m_videoExtensions = ".m4v|.3g2|.3gp|.nsv|.tp|.ts|.ty|.strm|.pls|.rm|.rmvb|.m3u|.m3u8|.ifo|.mov|.qt|.divx|.xvid|.bivx|.vob|.nrg|.img|.iso|.pva|.wmv|.asf|.asx|.ogm|.m2v|.avi|.bin|.dat|.mpg|.mpeg|.mp4|.mkv|.mk3d|.avc|.vp3|.svq3|.nuv|.viv|.dv|.fli|.flv|.rar|.001|.wpl|.zip|.vdr|.dvr-ms|.xsp|.mts|.m2t|.m2ts|.evo|.ogv|.sdp|.avs|.rec|.url|.pxml|.vc1|.h264|.rcv|.rss|.mpls|.webm|.bdmv|.wtv|.efile"; + m_videoExtensions = ".m4v|.3g2|.3gp|.nsv|.tp|.ts|.ty|.strm|.pls|.rm|.rmvb|.m3u|.m3u8|.ifo|.mov|.qt|.divx|.xvid|.bivx|.vob|.nrg|.img|.iso|.pva|.wmv|.asf|.asx|.ogm|.m2v|.avi|.bin|.dat|.mpg|.mpeg|.mp4|.mkv|.mk3d|.avc|.vp3|.svq3|.nuv|.viv|.dv|.fli|.flv|.rar|.001|.wpl|.zip|.vdr|.dvr-ms|.xsp|.mts|.m2t|.m2ts|.evo|.ogv|.sdp|.avs|.rec|.url|.pxml|.vc1|.h264|.rcv|.rss|.mpls|.webm|.bdmv|.wtv|.efile|.disc"; m_subtitlesExtensions = ".utf|.utf8|.utf-8|.sub|.srt|.smi|.rt|.txt|.ssa|.text|.ssa|.aqt|.jss|.ass|.idx|.ifo|.rar|.zip"; - m_discStubExtensions = ".disc"; // internal music extensions m_musicExtensions += "|.cdda"; // internal video extensions diff --git a/xbmc/video/VideoDatabase.cpp b/xbmc/video/VideoDatabase.cpp index 62b7213554114..de27f733d0ac7 100644 --- a/xbmc/video/VideoDatabase.cpp +++ b/xbmc/video/VideoDatabase.cpp @@ -2634,7 +2634,10 @@ void CVideoDatabase::GetBookMarksForFile(const std::string& strFilenameAndPath, { try { - if (URIUtils::IsStack(strFilenameAndPath) && CFileItem(CStackDirectory::GetFirstStackedFile(strFilenameAndPath),false).IsDiscImage()) + std::string firstStacked = CStackDirectory::GetFirstStackedFile(strFilenameAndPath); + if (URIUtils::IsStack(strFilenameAndPath) && + (URIUtils::IsDiscImage(firstStacked) || + URIUtils::IsDiscStub(firstStacked))) { CStackDirectory dir; CFileItemList fileList; @@ -3399,7 +3402,10 @@ bool CVideoDatabase::GetResumePoint(CVideoInfoTag& tag) try { - if (URIUtils::IsStack(tag.m_strFileNameAndPath) && CFileItem(CStackDirectory::GetFirstStackedFile(tag.m_strFileNameAndPath),false).IsDiscImage()) + std::string firstStacked = CStackDirectory::GetFirstStackedFile(tag.m_strFileNameAndPath); + if (URIUtils::IsStack(tag.m_strFileNameAndPath) && + (URIUtils::IsDiscImage(firstStacked) || + URIUtils::IsDiscStub(firstStacked))) { CStackDirectory dir; CFileItemList fileList; diff --git a/xbmc/video/windows/GUIWindowVideoBase.cpp b/xbmc/video/windows/GUIWindowVideoBase.cpp index 1475761239d21..ea916c1c108e3 100644 --- a/xbmc/video/windows/GUIWindowVideoBase.cpp +++ b/xbmc/video/windows/GUIWindowVideoBase.cpp @@ -880,7 +880,10 @@ bool CGUIWindowVideoBase::OnFileAction(int iItem, int action) { std::string itemPath(item->GetPath()); itemPath = item->GetVideoInfoTag()->m_strFileNameAndPath; - if (URIUtils::IsStack(itemPath) && CFileItem(CStackDirectory::GetFirstStackedFile(itemPath),false).IsDiscImage()) + std::string firstStacked = CStackDirectory::GetFirstStackedFile(itemPath); + if (URIUtils::IsStack(itemPath) && + (URIUtils::IsDiscImage(firstStacked) || + URIUtils::IsDiscStub(firstStacked))) choices.Add(SELECT_ACTION_PLAYPART, 20324); // Play Part } @@ -1064,7 +1067,10 @@ void CGUIWindowVideoBase::GetContextButtons(int itemNumber, CContextButtons &but if (URIUtils::IsStack(path)) { std::vector times; - if (m_database.GetStackTimes(path,times) || CFileItem(CStackDirectory::GetFirstStackedFile(path),false).IsDiscImage()) + std::string firstStacked = CStackDirectory::GetFirstStackedFile(path); + if (m_database.GetStackTimes(path, times) || + (URIUtils::IsDiscImage(firstStacked) || + URIUtils::IsDiscStub(firstStacked))) buttons.Add(CONTEXT_BUTTON_PLAY_PART, 20324); } @@ -1150,7 +1156,8 @@ bool CGUIWindowVideoBase::OnPlayStackPart(int iItem) if (selectedFile > 0) { // ISO stack - if (CFileItem(CStackDirectory::GetFirstStackedFile(path),false).IsDiscImage()) + std::string firstStacked = CStackDirectory::GetFirstStackedFile(path); + if (URIUtils::IsDiscImage(firstStacked) || URIUtils::IsDiscStub(firstStacked)) { std::string resumeString = CGUIWindowVideoBase::GetResumeString(*(parts[selectedFile - 1].get())); stack->m_lStartOffset = 0;