Skip to content

Commit

Permalink
Improve support for disc stubs
Browse files Browse the repository at this point in the history
  • Loading branch information
phate89 committed Aug 1, 2015
1 parent 66c6781 commit a827939
Show file tree
Hide file tree
Showing 8 changed files with 47 additions and 40 deletions.
28 changes: 5 additions & 23 deletions xbmc/Application.cpp
Expand Up @@ -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;
Expand Down Expand Up @@ -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;

Expand All @@ -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<CFileItem&>(item)))
Expand Down
8 changes: 1 addition & 7 deletions xbmc/FileItem.cpp
Expand Up @@ -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
Expand Down
8 changes: 6 additions & 2 deletions xbmc/cores/dvdplayer/DVDInputStreams/DVDInputStreamBluray.cpp
Expand Up @@ -38,6 +38,7 @@
#include "dialogs/GUIDialogKaiToast.h"
#include "guilib/LocalizeStrings.h"
#include "settings/DiscSettings.h"
#include "storage/MediaManager.h"

#define LIBBLURAY_BYTESEEK 0

Expand Down Expand Up @@ -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);
Expand Down
3 changes: 2 additions & 1 deletion xbmc/cores/dvdplayer/DVDPlayer.cpp
Expand Up @@ -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("");
}
Expand Down
14 changes: 14 additions & 0 deletions xbmc/dialogs/GUIDialogSimpleMenu.cpp
Expand Up @@ -31,6 +31,7 @@
#include "video/VideoInfoTag.h"
#include "URL.h"
#include "utils/Variant.h"
#include "storage/MediaManager.h"

bool CGUIDialogSimpleMenu::ShowPlaySelection(CFileItem& item)
{
Expand Down Expand Up @@ -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;
}

Expand Down
3 changes: 1 addition & 2 deletions xbmc/settings/AdvancedSettings.cpp
Expand Up @@ -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
Expand Down
10 changes: 8 additions & 2 deletions xbmc/video/VideoDatabase.cpp
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
13 changes: 10 additions & 3 deletions xbmc/video/windows/GUIWindowVideoBase.cpp
Expand Up @@ -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
}

Expand Down Expand Up @@ -1064,7 +1067,10 @@ void CGUIWindowVideoBase::GetContextButtons(int itemNumber, CContextButtons &but
if (URIUtils::IsStack(path))
{
std::vector<int> 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);
}

Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit a827939

Please sign in to comment.