diff --git a/xbmc/Application.cpp b/xbmc/Application.cpp index 62a986765c428..ff877c7b5f401 100644 --- a/xbmc/Application.cpp +++ b/xbmc/Application.cpp @@ -3002,9 +3002,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; @@ -3174,30 +3174,12 @@ PlayBackRet CApplication::PlayFile(CFileItem item, const std::string& player, bo 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; @@ -3210,7 +3192,7 @@ PlayBackRet CApplication::PlayFile(CFileItem item, const std::string& player, bo } // 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 dad37989aa9e2..b0cf1c916fb30 100644 --- a/xbmc/FileItem.cpp +++ b/xbmc/FileItem.cpp @@ -788,13 +788,7 @@ bool CFileItem::IsPVRRadioRDS() 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/VideoPlayer/DVDInputStreams/DVDInputStreamBluray.cpp b/xbmc/cores/VideoPlayer/DVDInputStreams/DVDInputStreamBluray.cpp index f37668e08eca7..a579683d77f02 100644 --- a/xbmc/cores/VideoPlayer/DVDInputStreams/DVDInputStreamBluray.cpp +++ b/xbmc/cores/VideoPlayer/DVDInputStreams/DVDInputStreamBluray.cpp @@ -40,6 +40,7 @@ #include "settings/DiscSettings.h" #include "utils/LangCodeExpander.h" #include "filesystem/SpecialProtocol.h" +#include "storage/MediaManager.h" #ifdef TARGET_POSIX #include "linux/XTimeUtils.h" @@ -273,13 +274,16 @@ bool CDVDInputStreamBluray::Open() 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/VideoPlayer/VideoPlayer.cpp b/xbmc/cores/VideoPlayer/VideoPlayer.cpp index fc3746c795e70..ee85a94369b9c 100644 --- a/xbmc/cores/VideoPlayer/VideoPlayer.cpp +++ b/xbmc/cores/VideoPlayer/VideoPlayer.cpp @@ -778,7 +778,8 @@ bool CVideoPlayer::OpenInputStream() // correct the filename if needed std::string filename(m_item.GetPath()); 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_item.SetPath(g_mediaManager.TranslateDevicePath("")); } diff --git a/xbmc/dialogs/GUIDialogSimpleMenu.cpp b/xbmc/dialogs/GUIDialogSimpleMenu.cpp index 5dd1f9ac7c656..2015c673b7642 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 b8008d22aa0c5..ff74fb0c8121e 100644 --- a/xbmc/settings/AdvancedSettings.cpp +++ b/xbmc/settings/AdvancedSettings.cpp @@ -384,9 +384,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|.webp|.jp2|.apng"; 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|.mpd|.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|.mpd|.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 090377b125f65..4e347a3b91100 100644 --- a/xbmc/video/VideoDatabase.cpp +++ b/xbmc/video/VideoDatabase.cpp @@ -2851,7 +2851,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; @@ -3591,7 +3594,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 d8e81cb20011e..a00ba7351a31f 100644 --- a/xbmc/video/windows/GUIWindowVideoBase.cpp +++ b/xbmc/video/windows/GUIWindowVideoBase.cpp @@ -646,7 +646,10 @@ bool CGUIWindowVideoBase::OnFileAction(int iItem, int action, std::string player { 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 } @@ -834,7 +837,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); } @@ -920,7 +926,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].get())); stack->m_lStartOffset = 0;