bool CGUIWindowPVRCommon::PlayRecording(CFileItem *item, bool bPlayMinimized /* = false */) { if (item->GetPath().Left(17) != "pvr://recordings/") return false; CStdString stream = item->GetPVRRecordingInfoTag()->m_strStreamURL; if (stream == "") return false; /* Isolate the folder from the filename */ size_t found = stream.find_last_of("/"); if (found == CStdString::npos) found = stream.find_last_of("\\"); if (found != CStdString::npos) { /* Check here for asterisk at the begin of the filename */ if (stream[found+1] == '*') { /* Create a "stack://" url with all files matching the extension */ CStdString ext = URIUtils::GetExtension(stream); CStdString dir = stream.substr(0, found).c_str(); CFileItemList items; CDirectory::GetDirectory(dir, items); items.Sort(SORT_METHOD_FILE ,SORT_ORDER_ASC); vector<int> stack; for (int i = 0; i < items.Size(); ++i) { if (URIUtils::GetExtension(items[i]->GetPath()) == ext) stack.push_back(i); } if (stack.size() > 0) { /* If we have a stack change the path of the item to it */ CStackDirectory dir; CStdString stackPath = dir.ConstructStackPath(items, stack); item->SetPath(stackPath); } } else { /* If no asterisk is present play only the given stream URL */ item->SetPath(stream); } } else { CLog::Log(LOGERROR, "PVRManager - %s - can't open recording: no valid filename", __FUNCTION__); CGUIDialogOK::ShowAndGetInput(19033,0,19036,0); return false; } g_application.getApplicationMessenger().PlayFile(*item, false); return true; }
bool CDVDInputStreamStack::Open() { if (!CDVDInputStream::Open()) return false; CStackDirectory dir; CFileItemList items; const CURL pathToUrl(m_item.GetPath()); if(!dir.GetDirectory(pathToUrl, items)) { CLog::Log(LOGERROR, "CDVDInputStreamStack::Open - failed to get list of stacked items"); return false; } m_length = 0; m_eof = false; for(int index = 0; index < items.Size(); index++) { TFile file(new CFile()); if (!file->Open(items[index]->GetPath(), READ_TRUNCATED)) { CLog::Log(LOGERROR, "CDVDInputStreamStack::Open - failed to open stack part '%s' - skipping", items[index]->GetPath().c_str()); continue; } TSeg segment; segment.file = file; segment.length = file->GetLength(); if(segment.length <= 0) { CLog::Log(LOGERROR, "CDVDInputStreamStack::Open - failed to get file length for '%s' - skipping", items[index]->GetPath().c_str()); continue; } m_length += segment.length; m_files.push_back(segment); } if(m_files.empty()) return false; m_file = m_files[0].file; m_eof = false; return true; }
bool URIUtils::GetParentPath(const CStdString& strPath, CStdString& strParent) { strParent = ""; CURL url(strPath); CStdString strFile = url.GetFileName(); if ( ((url.GetProtocol() == "rar") || (url.GetProtocol() == "zip")) && strFile.IsEmpty()) { strFile = url.GetHostName(); return GetParentPath(strFile, strParent); } else if (url.GetProtocol() == "stack") { CStackDirectory dir; CFileItemList items; dir.GetDirectory(strPath,items); GetDirectory(items[0]->m_strPath,items[0]->m_strDVDLabel); if (items[0]->m_strDVDLabel.Mid(0,6).Equals("rar://") || items[0]->m_strDVDLabel.Mid(0,6).Equals("zip://")) GetParentPath(items[0]->m_strDVDLabel, strParent); else strParent = items[0]->m_strDVDLabel; for( int i=1;i<items.Size();++i) { GetDirectory(items[i]->m_strPath,items[i]->m_strDVDLabel); if (items[0]->m_strDVDLabel.Mid(0,6).Equals("rar://") || items[0]->m_strDVDLabel.Mid(0,6).Equals("zip://")) GetParentPath(items[i]->m_strDVDLabel, items[i]->m_strPath); else items[i]->m_strPath = items[i]->m_strDVDLabel; GetCommonPath(strParent,items[i]->m_strPath); } return true; } else if (url.GetProtocol() == "multipath") { // get the parent path of the first item return GetParentPath(CMultiPathDirectory::GetFirstPath(strPath), strParent); } else if (url.GetProtocol() == "plugin") { if (!url.GetOptions().IsEmpty()) { url.SetOptions(""); strParent = url.Get(); return true; } if (!url.GetFileName().IsEmpty()) { url.SetFileName(""); strParent = url.Get(); return true; } if (!url.GetHostName().IsEmpty()) { url.SetHostName(""); strParent = url.Get(); return true; } return true; // already at root } else if (url.GetProtocol() == "special") { if (HasSlashAtEnd(strFile) ) strFile = strFile.Left(strFile.size() - 1); if(strFile.ReverseFind('/') < 0) return false; } else if (strFile.size() == 0) { if (url.GetHostName().size() > 0) { // we have an share with only server or workgroup name // set hostname to "" and return true to get back to root url.SetHostName(""); strParent = url.Get(); return true; } return false; } if (HasSlashAtEnd(strFile) ) { strFile = strFile.Left(strFile.size() - 1); } int iPos = strFile.ReverseFind('/'); #ifndef _LINUX if (iPos < 0) { iPos = strFile.ReverseFind('\\'); } #endif if (iPos < 0) { url.SetFileName(""); strParent = url.Get(); return true; } strFile = strFile.Left(iPos); AddSlashAtEnd(strFile); url.SetFileName(strFile); strParent = url.Get(); return true; }
/** * This method tries to determine what type of disc is located in the given drive and starts to play the content appropriately. */ bool CAutorun::RunDisc(IDirectory* pDir, const CStdString& strDrive, int& nAddedToPlaylist, bool bRoot, bool bypassSettings /* = false */, bool startFromBeginning /* = false */) { bool bPlaying(false); CFileItemList vecItems; if ( !pDir->GetDirectory( strDrive, vecItems ) ) { return false; } // Sorting necessary for easier HDDVD handling vecItems.Sort(SortByLabel, SortOrderAscending); bool bAllowVideo = true; // bool bAllowPictures = true; bool bAllowMusic = true; if (!g_passwordManager.IsMasterLockUnlocked(false)) { bAllowVideo = !CProfilesManager::Get().GetCurrentProfile().videoLocked(); // bAllowPictures = !CProfilesManager::Get().GetCurrentProfile().picturesLocked(); bAllowMusic = !CProfilesManager::Get().GetCurrentProfile().musicLocked(); } // is this a root folder we have to check the content to determine a disc type if( bRoot ) { CStdString hddvdname = ""; CFileItemPtr phddvdItem; // check root folders next, for normal structured dvd's for (int i = 0; i < vecItems.Size(); i++) { CFileItemPtr pItem = vecItems[i]; // is the current item a (non system) folder? if (pItem->m_bIsFolder && pItem->GetPath() != "." && pItem->GetPath() != "..") { CStdString name = pItem->GetPath(); URIUtils::RemoveSlashAtEnd(name); name = URIUtils::GetFileName(name); // Check if the current foldername indicates a DVD structure (name is "VIDEO_TS") if (name.Equals("VIDEO_TS") && bAllowVideo && (bypassSettings || CSettings::Get().GetBool("dvds.autorun"))) { CStdString path = URIUtils::AddFileToFolder(pItem->GetPath(), "VIDEO_TS.IFO"); if(!CFile::Exists(path)) path = URIUtils::AddFileToFolder(pItem->GetPath(), "video_ts.ifo"); CFileItemPtr item(new CFileItem(path, false)); item->SetLabel(g_mediaManager.GetDiskLabel(strDrive)); item->GetVideoInfoTag()->m_strFileNameAndPath = g_mediaManager.GetDiskUniqueId(strDrive); if (!startFromBeginning && !item->GetVideoInfoTag()->m_strFileNameAndPath.empty()) item->m_lStartOffset = STARTOFFSET_RESUME; g_playlistPlayer.ClearPlaylist(PLAYLIST_VIDEO); g_playlistPlayer.SetShuffle (PLAYLIST_VIDEO, false); g_playlistPlayer.Add(PLAYLIST_VIDEO, item); g_playlistPlayer.SetCurrentPlaylist(PLAYLIST_VIDEO); g_playlistPlayer.Play(0); return true; } // Check if the current foldername indicates a Blu-Ray structure (default is "BDMV"). // A BR should also include an "AACS" folder for encryption, Sony-BRs can also include update folders for PS3 (PS3_UPDATE / PS3_VPRM). // ToDo: for the time beeing, the DVD autorun settings are used to determine if the BR should be started automatically. if (name.Equals("BDMV") && bAllowVideo && (bypassSettings || CSettings::Get().GetBool("dvds.autorun"))) { CFileItemPtr item(new CFileItem(URIUtils::AddFileToFolder(pItem->GetPath(), "index.bdmv"), false)); item->SetLabel(g_mediaManager.GetDiskLabel(strDrive)); item->GetVideoInfoTag()->m_strFileNameAndPath = g_mediaManager.GetDiskUniqueId(strDrive); if (!startFromBeginning && !item->GetVideoInfoTag()->m_strFileNameAndPath.empty()) item->m_lStartOffset = STARTOFFSET_RESUME; g_playlistPlayer.ClearPlaylist(PLAYLIST_VIDEO); g_playlistPlayer.SetShuffle (PLAYLIST_VIDEO, false); g_playlistPlayer.Add(PLAYLIST_VIDEO, item); g_playlistPlayer.SetCurrentPlaylist(PLAYLIST_VIDEO); g_playlistPlayer.Play(0); return true; } // Check if the current foldername indicates a HD DVD structure (default is "HVDVD_TS"). // Most HD DVD will also include an "ADV_OBJ" folder for advanced content. This folder should be handled first. // ToDo: for the time beeing, the DVD autorun settings are used to determine if the HD DVD should be started automatically. CFileItemList items, sitems; // Advanced Content HD DVD (most discs?) if (name.Equals("ADV_OBJ")) { CLog::Log(LOGINFO,"HD DVD: Checking for playlist."); // find playlist file CDirectory::GetDirectory(pItem->GetPath(), items, "*.xpl"); if (items.Size()) { // HD DVD Standard says the highest numbered playlist has to be handled first. CLog::Log(LOGINFO,"HD DVD: Playlist found. Set filetypes to *.xpl for external player."); items.Sort(SortByLabel, SortOrderDescending); phddvdItem = pItem; hddvdname = URIUtils::GetFileName(items[0]->GetPath()); CLog::Log(LOGINFO,"HD DVD: %s", items[0]->GetPath().c_str()); } } // Standard Content HD DVD (few discs?) if (name.Equals("HVDVD_TS") && bAllowVideo && (bypassSettings || CSettings::Get().GetBool("dvds.autorun"))) { if (hddvdname == "") { CLog::Log(LOGINFO,"HD DVD: Checking for ifo."); // find Video Manager or Title Set Information CDirectory::GetDirectory(pItem->GetPath(), items, "HV*.ifo"); if (items.Size()) { // HD DVD Standard says the lowest numbered ifo has to be handled first. CLog::Log(LOGINFO,"HD DVD: IFO found. Set filename to HV* and filetypes to *.ifo for external player."); items.Sort(SortByLabel, SortOrderAscending); phddvdItem = pItem; hddvdname = URIUtils::GetFileName(items[0]->GetPath()); CLog::Log(LOGINFO,"HD DVD: %s",items[0]->GetPath().c_str()); } } // Find and sort *.evo files for internal playback. // While this algorithm works for all of my HD DVDs, it may fail on other discs. If there are very large extras which are // alphabetically before the main movie they will be sorted to the top of the playlist and get played first. CDirectory::GetDirectory(pItem->GetPath(), items, "*.evo"); if (items.Size()) { // Sort *.evo files in alphabetical order. items.Sort(SortByLabel, SortOrderAscending); int64_t asize = 0; int ecount = 0; // calculate average size of elements above 1gb for (int j = 0; j < items.Size(); j++) if (items[j]->m_dwSize > 1000000000) { ecount++; asize = asize + items[j]->m_dwSize; } asize = asize / ecount; // Put largest files in alphabetical order to top of new list. for (int j = 0; j < items.Size(); j++) if (items[j]->m_dwSize >= asize) sitems.Add (items[j]); // Sort *.evo files by size. items.Sort(SortBySize, SortOrderDescending); // Add other files with descending size to bottom of new list. for (int j = 0; j < items.Size(); j++) if (items[j]->m_dwSize < asize) sitems.Add (items[j]); // Replace list with optimized list. items.Clear(); items.Copy (sitems); sitems.Clear(); } if (hddvdname != "") { CFileItem item(URIUtils::AddFileToFolder(phddvdItem->GetPath(), hddvdname), false); item.SetLabel(g_mediaManager.GetDiskLabel(strDrive)); item.GetVideoInfoTag()->m_strFileNameAndPath = g_mediaManager.GetDiskUniqueId(strDrive); if (!startFromBeginning && !item.GetVideoInfoTag()->m_strFileNameAndPath.empty()) item.m_lStartOffset = STARTOFFSET_RESUME; // get playername CStdString hddvdplayer = CPlayerCoreFactory::Get().GetPlayerName(CPlayerCoreFactory::Get().GetDefaultPlayer(item)); // Single *.xpl or *.ifo files require an external player to handle playback. // If no matching rule was found, DVDPlayer will be default player. if (hddvdplayer != "DVDPlayer") { CLog::Log(LOGINFO,"HD DVD: External singlefile playback initiated: %s",hddvdname.c_str()); g_application.PlayFile(item, false); return true; } else CLog::Log(LOGINFO,"HD DVD: No external player found. Fallback to internal one."); } // internal *.evo playback. CLog::Log(LOGINFO,"HD DVD: Internal multifile playback initiated."); g_playlistPlayer.ClearPlaylist(PLAYLIST_VIDEO); g_playlistPlayer.SetShuffle (PLAYLIST_VIDEO, false); g_playlistPlayer.Add(PLAYLIST_VIDEO, items); g_playlistPlayer.SetCurrentPlaylist(PLAYLIST_VIDEO); g_playlistPlayer.Play(0); return true; } // Video CDs can have multiple file formats. First we need to determine which one is used on the CD CStdString strExt; if (name.Equals("MPEGAV")) strExt = ".dat"; if (name.Equals("MPEG2")) strExt = ".mpg"; // If a file format was extracted we are sure this is a VCD. Autoplay if settings indicate we should. if (!strExt.empty() && bAllowVideo && (bypassSettings || CSettings::Get().GetBool("dvds.autorun"))) { CFileItemList items; CDirectory::GetDirectory(pItem->GetPath(), items, strExt); if (items.Size()) { items.Sort(SortByLabel, SortOrderAscending); g_playlistPlayer.ClearPlaylist(PLAYLIST_VIDEO); g_playlistPlayer.Add(PLAYLIST_VIDEO, items); g_playlistPlayer.SetCurrentPlaylist(PLAYLIST_VIDEO); g_playlistPlayer.Play(0); return true; } } /* Probably want this if/when we add some automedia action dialog... else if (pItem->GetPath().Find("PICTURES") != -1 && bAllowPictures && (bypassSettings)) { bPlaying = true; CStdString strExec = StringUtils::Format("XBMC.RecursiveSlideShow(%s)", pItem->GetPath().c_str()); CBuiltins::Execute(strExec); return true; } */ } } } // check video first if (!nAddedToPlaylist && !bPlaying && (bypassSettings || CSettings::Get().GetBool("dvds.autorun"))) { // stack video files CFileItemList tempItems; tempItems.Append(vecItems); if (CSettings::Get().GetBool("myvideos.stackvideos")) tempItems.Stack(); CFileItemList itemlist; for (int i = 0; i < tempItems.Size(); i++) { CFileItemPtr pItem = tempItems[i]; if (!pItem->m_bIsFolder && pItem->IsVideo()) { bPlaying = true; if (pItem->IsStack()) { // TODO: remove this once the app/player is capable of handling stacks immediately CStackDirectory dir; CFileItemList items; dir.GetDirectory(pItem->GetPath(), items); itemlist.Append(items); } else itemlist.Add(pItem); } } if (itemlist.Size()) { if (!bAllowVideo) { if (!bypassSettings) return false; if (g_windowManager.GetActiveWindow() != WINDOW_VIDEO_FILES) if (!g_passwordManager.IsMasterLockUnlocked(true)) return false; } g_playlistPlayer.ClearPlaylist(PLAYLIST_VIDEO); g_playlistPlayer.Add(PLAYLIST_VIDEO, itemlist); g_playlistPlayer.SetCurrentPlaylist(PLAYLIST_VIDEO); g_playlistPlayer.Play(0); } } // then music if (!bPlaying && (bypassSettings || CSettings::Get().GetInt("audiocds.autoaction") == AUTOCD_PLAY) && bAllowMusic) { for (int i = 0; i < vecItems.Size(); i++) { CFileItemPtr pItem = vecItems[i]; if (!pItem->m_bIsFolder && pItem->IsAudio()) { nAddedToPlaylist++; g_playlistPlayer.Add(PLAYLIST_MUSIC, pItem); } } } /* Probably want this if/when we add some automedia action dialog... // and finally pictures if (!nAddedToPlaylist && !bPlaying && bypassSettings && bAllowPictures) { for (int i = 0; i < vecItems.Size(); i++) { CFileItemPtr pItem = vecItems[i]; if (!pItem->m_bIsFolder && pItem->IsPicture()) { bPlaying = true; CStdString strExec = StringUtils::Format("XBMC.RecursiveSlideShow(%s)", strDrive.c_str()); CBuiltins::Execute(strExec); break; } } } */ // check subdirs if we are not playing yet if (!bPlaying) { for (int i = 0; i < vecItems.Size(); i++) { CFileItemPtr pItem = vecItems[i]; if (pItem->m_bIsFolder) { if (pItem->GetPath() != "." && pItem->GetPath() != ".." ) { if (RunDisc(pDir, pItem->GetPath(), nAddedToPlaylist, false, bypassSettings, startFromBeginning)) { bPlaying = true; break; } } } // if (non system) folder } // for all items in directory } // if root folder return bPlaying; }
bool URIUtils::GetParentPath(const std::string& strPath, std::string& strParent) { strParent.clear(); CURL url(strPath); std::string strFile = url.GetFileName(); if ( URIUtils::HasParentInHostname(url) && strFile.empty()) { strFile = url.GetHostName(); return GetParentPath(strFile, strParent); } else if (url.IsProtocol("stack")) { CStackDirectory dir; CFileItemList items; dir.GetDirectory(url, items); items[0]->m_strDVDLabel = GetDirectory(items[0]->GetPath()); if (IsProtocol(items[0]->m_strDVDLabel, "rar") || IsProtocol(items[0]->m_strDVDLabel, "zip")) GetParentPath(items[0]->m_strDVDLabel, strParent); else strParent = items[0]->m_strDVDLabel; for( int i=1;i<items.Size();++i) { items[i]->m_strDVDLabel = GetDirectory(items[i]->GetPath()); if (IsProtocol(items[0]->m_strDVDLabel, "rar") || IsProtocol(items[0]->m_strDVDLabel, "zip")) items[i]->SetPath(GetParentPath(items[i]->m_strDVDLabel)); else items[i]->SetPath(items[i]->m_strDVDLabel); GetCommonPath(strParent,items[i]->GetPath()); } return true; } else if (url.IsProtocol("multipath")) { // get the parent path of the first item return GetParentPath(CMultiPathDirectory::GetFirstPath(strPath), strParent); } else if (url.IsProtocol("plugin")) { if (!url.GetOptions().empty()) { url.SetOptions(""); strParent = url.Get(); return true; } if (!url.GetFileName().empty()) { url.SetFileName(""); strParent = url.Get(); return true; } if (!url.GetHostName().empty()) { url.SetHostName(""); strParent = url.Get(); return true; } return true; // already at root } else if (url.IsProtocol("special")) { if (HasSlashAtEnd(strFile)) strFile.erase(strFile.size() - 1); if(strFile.rfind('/') == std::string::npos) return false; } else if (strFile.size() == 0) { if (url.GetHostName().size() > 0) { // we have an share with only server or workgroup name // set hostname to "" and return true to get back to root url.SetHostName(""); strParent = url.Get(); return true; } return false; } if (HasSlashAtEnd(strFile) ) { strFile.erase(strFile.size() - 1); } size_t iPos = strFile.rfind('/'); #ifndef TARGET_POSIX if (iPos == std::string::npos) { iPos = strFile.rfind('\\'); } #endif if (iPos == std::string::npos) { url.SetFileName(""); strParent = url.Get(); return true; } strFile.erase(iPos); AddSlashAtEnd(strFile); url.SetFileName(strFile); strParent = url.Get(); return true; }
bool CVideoThumbLoader::LoadItem(CFileItem* pItem, bool bCanBlock) { if (pItem->m_bIsShareOrDrive) return false; bool retVal = false; if (pItem->IsVideoDb() && pItem->HasVideoInfoTag() && !pItem->HasThumbnail()) { if (pItem->m_bIsFolder && pItem->GetVideoInfoTag()->m_iSeason > -1) return false; CFileItem item(*pItem->GetVideoInfoTag()); bool bResult = LoadItem(&item, bCanBlock); if (bResult) { pItem->SetProperty("HasAutoThumb",item.GetProperty("HasAutoThumb")); pItem->SetProperty("AutoThumbImage",item.GetProperty("AutoThumbImage")); pItem->SetProperty("fanart_image",item.GetProperty("fanart_image")); pItem->SetThumbnailImage(item.GetThumbnailImage()); pItem->GetVideoInfoTag()->m_streamDetails = item.GetVideoInfoTag()->m_streamDetails; } return bResult; } CStdString cachedThumb(pItem->GetCachedVideoThumb()); CLog::Log(LOGDEBUG, "CVideoThumbLoader::LoadItem, strItemPath = %s, cachedThumb = %s (thumb)", pItem->m_strPath.c_str(), cachedThumb.c_str()); if (!pItem->HasThumbnail()) { if (CFile::Exists(cachedThumb)) { CLog::Log(LOGDEBUG, "CVideoThumbLoader::LoadItem, EXISTS, strItemPath = %s, cachedThumb = %s (thumb)", pItem->m_strPath.c_str(), cachedThumb.c_str()); pItem->SetCachedVideoThumb(); } else if (pItem->m_bIsFolder) pItem->SetUserVideoThumb(); else { CStdString strPath, strFileName; CUtil::Split(cachedThumb, strPath, strFileName); // create unique thumb for auto generated thumbs cachedThumb = strPath + "auto-" + strFileName; if (pItem->IsVideo() && !pItem->IsInternetStream() && !pItem->IsPlayList() && !CFile::Exists(cachedThumb) && !pItem->m_bIsFolder) { if (!bCanBlock) { // we should not retreive remote (e.g. SMB) thumbs if requested not to block return false; } CStreamDetails details; if (pItem->IsStack()) { CStackDirectory stack; CVideoThumbLoader::ExtractThumb(stack.GetFirstStackedFile(pItem->m_strPath), cachedThumb, &details); } else { CVideoThumbLoader::ExtractThumb(pItem->m_strPath, cachedThumb, &details); } if (details.HasItems() && m_pStreamDetailsObs) m_pStreamDetailsObs->OnStreamDetails(details, pItem->m_strPath, -1); } if (CFile::Exists(cachedThumb)) { pItem->SetProperty("HasAutoThumb", "1"); pItem->SetProperty("AutoThumbImage", cachedThumb); pItem->SetThumbnailImage(cachedThumb); retVal = true; } else pItem->SetThumbnailImage(""); } } else { // look for remote thumbs CStdString thumb(pItem->GetThumbnailImage()); if (!CURI::IsFileOnly(thumb) && !CUtil::IsHD(thumb)) { if (pItem->GetProperty("OriginalThumb").IsEmpty()) { //when the item is loaded from the database we don't want to overwrite the original thumb by mistake because the user might have his own thumb //related to http://jira.boxee.tv/browse/BOXEE-8488 pItem->SetProperty("OriginalThumb", thumb); } if(CFile::Exists(cachedThumb)) { pItem->SetThumbnailImage(cachedThumb); retVal = true; } else { if (!bCanBlock) { // we should not retreive remote thumbs if requested not to block return false; } if(CPicture::CreateThumbnail(thumb, cachedThumb)) pItem->SetThumbnailImage(cachedThumb); else pItem->SetThumbnailImage(""); } } else { if (!CFile::Exists(cachedThumb)) { // Thumb can not be found. Going to create the thumb by fetching the original thumb and save it in cache if (!bCanBlock) { if (pItem->GetProperty("OriginalThumb").IsEmpty()) { pItem->SetProperty("OriginalThumb", thumb); } return false; } CStdString originalThumb = pItem->GetProperty("OriginalThumb"); if (!pItem->GetThumbnailImage().IsEmpty() && (CUtil::IsHD(pItem->GetThumbnailImage()) || CUtil::IsSmb(pItem->GetThumbnailImage()) || CUtil::IsUPnP(pItem->GetThumbnailImage())) && CFile::Exists(pItem->GetThumbnailImage())) { //if the user has the thumb locally, use it originalThumb = pItem->GetThumbnailImage(); } CStdString newCachedThumb = pItem->GetCachedPictureThumb(); if(CPicture::CreateThumbnail(originalThumb, newCachedThumb,true )) { pItem->SetThumbnailImage(newCachedThumb); } else { pItem->SetThumbnailImage(""); } } } } if (!pItem->HasProperty("fanart_image") && bCanBlock) { pItem->CacheFanart(); if (CFile::Exists(pItem->GetCachedFanart())) { pItem->SetProperty("fanart_image",pItem->GetCachedFanart()); retVal = true; } } if (!pItem->m_bIsFolder && !pItem->IsInternetStream() && pItem->HasVideoInfoTag() && g_guiSettings.GetBool("myvideos.extractflags") && !pItem->GetVideoInfoTag()->HasStreamDetails()) { if (CDVDFileInfo::GetFileStreamDetails(pItem) && m_pStreamDetailsObs) { CVideoInfoTag *info = pItem->GetVideoInfoTag(); m_pStreamDetailsObs->OnStreamDetails(info->m_streamDetails, "", info->m_iFileId); pItem->SetInvalid(); retVal = true; } } // if (pItem->IsVideo() && !pItem->IsInternetStream()) // CDVDPlayer::GetFileMetaData(pItem->m_strPath, pItem); return retVal; }
std::string CStackDirectory::GetStackedTitlePath(const std::string &strPath, VECCREGEXP& RegExps) { CStackDirectory stack; CFileItemList files; std::string strStackTitlePath, strCommonDir = URIUtils::GetParentPath(strPath); const CURL pathToUrl(strPath); stack.GetDirectory(pathToUrl, files); if (files.Size() > 1) { std::string strStackTitle; std::string File1 = URIUtils::GetFileName(files[0]->GetPath()); std::string File2 = URIUtils::GetFileName(files[1]->GetPath()); // Check if source path uses URL encoding if (URIUtils::HasEncodedFilename(CURL(strCommonDir))) { File1 = CURL::Decode(File1); File2 = CURL::Decode(File2); } std::vector<CRegExp>::iterator itRegExp = RegExps.begin(); int offset = 0; while (itRegExp != RegExps.end()) { if (itRegExp->RegFind(File1, offset) != -1) { std::string Title1 = itRegExp->GetMatch(1), Volume1 = itRegExp->GetMatch(2), Ignore1 = itRegExp->GetMatch(3), Extension1 = itRegExp->GetMatch(4); if (offset) Title1 = File1.substr(0, itRegExp->GetSubStart(2)); if (itRegExp->RegFind(File2, offset) != -1) { std::string Title2 = itRegExp->GetMatch(1), Volume2 = itRegExp->GetMatch(2), Ignore2 = itRegExp->GetMatch(3), Extension2 = itRegExp->GetMatch(4); if (offset) Title2 = File2.substr(0, itRegExp->GetSubStart(2)); if (StringUtils::EqualsNoCase(Title1, Title2)) { if (!StringUtils::EqualsNoCase(Volume1, Volume2)) { if (StringUtils::EqualsNoCase(Ignore1, Ignore2) && StringUtils::EqualsNoCase(Extension1, Extension2)) { // got it strStackTitle = Title1 + Ignore1 + Extension1; // Check if source path uses URL encoding if (URIUtils::HasEncodedFilename(CURL(strCommonDir))) strStackTitle = CURL::Encode(strStackTitle); itRegExp = RegExps.end(); break; } else // Invalid stack break; } else // Early match, retry with offset { offset = itRegExp->GetSubStart(3); continue; } } } } offset = 0; itRegExp++; } if (!strCommonDir.empty() && !strStackTitle.empty()) strStackTitlePath = strCommonDir + strStackTitle; } return strStackTitlePath; }
CStdString CStackDirectory::GetStackedTitlePath(const CStdString &strPath, VECCREGEXP& RegExps) { CStackDirectory stack; CFileItemList files; CStdString strStackTitlePath, strCommonDir = URIUtils::GetParentPath(strPath); stack.GetDirectory(strPath, files); if (files.Size() > 1) { CStdString strStackTitle; CStdString File1 = URIUtils::GetFileName(files[0]->m_strPath); CStdString File2 = URIUtils::GetFileName(files[1]->m_strPath); std::vector<CRegExp>::iterator itRegExp = RegExps.begin(); int offset = 0; while (itRegExp != RegExps.end()) { if (itRegExp->RegFind(File1, offset) != -1) { CStdString Title1 = itRegExp->GetMatch(1), Volume1 = itRegExp->GetMatch(2), Ignore1 = itRegExp->GetMatch(3), Extension1 = itRegExp->GetMatch(4); if (offset) Title1 = File1.substr(0, itRegExp->GetSubStart(2)); if (itRegExp->RegFind(File2, offset) != -1) { CStdString Title2 = itRegExp->GetMatch(1), Volume2 = itRegExp->GetMatch(2), Ignore2 = itRegExp->GetMatch(3), Extension2 = itRegExp->GetMatch(4); if (offset) Title2 = File2.substr(0, itRegExp->GetSubStart(2)); if (Title1.Equals(Title2)) { if (!Volume1.Equals(Volume2)) { if (Ignore1.Equals(Ignore2) && Extension1.Equals(Extension2)) { // got it strStackTitle = Title1 + Ignore1 + Extension1; itRegExp = RegExps.end(); break; } else // Invalid stack break; } else // Early match, retry with offset { offset = itRegExp->GetSubStart(3); continue; } } } } offset = 0; itRegExp++; } if (!strCommonDir.empty() && !strStackTitle.empty()) strStackTitlePath = strCommonDir + strStackTitle; } return strStackTitlePath; }
/** * This method tries to determine what type of disc is located in the given drive and starts to play the content appropriately. */ bool CAutorun::RunDisc(IDirectory* pDir, const CStdString& strDrive, int& nAddedToPlaylist, bool bRoot, bool bypassSettings /* = false */, bool startFromBeginning /* = false */) { bool bPlaying(false); CFileItemList vecItems; if ( !pDir->GetDirectory( strDrive, vecItems ) ) { return false; } bool bAllowVideo = true; // bool bAllowPictures = true; bool bAllowMusic = true; if (!g_passwordManager.IsMasterLockUnlocked(false)) { bAllowVideo = !g_settings.GetCurrentProfile().videoLocked(); // bAllowPictures = !g_settings.GetCurrentProfile().picturesLocked(); bAllowMusic = !g_settings.GetCurrentProfile().musicLocked(); } // is this a root folder we have to check the content to determine a disc type if( bRoot ) { // check root folders next, for normal structured dvd's for (int i = 0; i < vecItems.Size(); i++) { CFileItemPtr pItem = vecItems[i]; // is the current item a (non system) folder? if (pItem->m_bIsFolder && pItem->GetPath() != "." && pItem->GetPath() != "..") { CStdString name = pItem->GetPath(); URIUtils::RemoveSlashAtEnd(name); name = URIUtils::GetFileName(name); // Check if the current foldername indicates a DVD structure (name is "VIDEO_TS") if (name.Equals("VIDEO_TS") && bAllowVideo && (bypassSettings || g_guiSettings.GetBool("dvds.autorun"))) { CStdString path = URIUtils::AddFileToFolder(pItem->GetPath(), "VIDEO_TS.IFO"); if(!CFile::Exists(path)) path = URIUtils::AddFileToFolder(pItem->GetPath(), "video_ts.ifo"); CFileItem item(path, false); item.SetLabel(g_mediaManager.GetDiskLabel(strDrive)); item.GetVideoInfoTag()->m_strFileNameAndPath = g_mediaManager.GetDiskUniqueId(strDrive); if (!startFromBeginning && !item.GetVideoInfoTag()->m_strFileNameAndPath.IsEmpty()) item.m_lStartOffset = STARTOFFSET_RESUME; g_application.PlayFile(item, false); bPlaying = true; return true; } // Check if the current foldername indicates a Blu-Ray structure (default is "BDMV"). // A BR should also include an "AACS" folder for encryption, Sony-BRs can also include update folders for PS3 (PS3_UPDATE / PS3_VPRM). // ToDo: for the time beeing, the DVD autorun settings are used to determine if the BR should be started automatically. if (name.Equals("BDMV") && bAllowVideo && (bypassSettings || g_guiSettings.GetBool("dvds.autorun"))) { CFileItem item(URIUtils::AddFileToFolder(pItem->GetPath(), "index.bdmv"), false); item.SetLabel(g_mediaManager.GetDiskLabel(strDrive)); item.GetVideoInfoTag()->m_strFileNameAndPath = g_mediaManager.GetDiskUniqueId(strDrive); if (!startFromBeginning && !item.GetVideoInfoTag()->m_strFileNameAndPath.IsEmpty()) item.m_lStartOffset = STARTOFFSET_RESUME; g_application.PlayFile(item, false); bPlaying = true; return true; } // Video CDs can have multiple file formats. First we need to determine which one is used on the CD CStdString strExt; if (name.Equals("MPEGAV")) strExt = ".dat"; if (name.Equals("MPEG2")) strExt = ".mpg"; // If a file format was extracted we are sure this is a VCD. Autoplay if settings indicate we should. if (!strExt.IsEmpty() && bAllowVideo && (bypassSettings || g_guiSettings.GetBool("dvds.autorun"))) { CFileItemList items; CDirectory::GetDirectory(pItem->GetPath(), items, strExt); if (items.Size()) { items.Sort(SORT_METHOD_LABEL, SortOrderAscending); g_playlistPlayer.ClearPlaylist(PLAYLIST_VIDEO); g_playlistPlayer.Add(PLAYLIST_VIDEO, items); g_playlistPlayer.SetCurrentPlaylist(PLAYLIST_VIDEO); g_playlistPlayer.Play(0); bPlaying = true; return true; } } /* Probably want this if/when we add some automedia action dialog... else if (pItem->GetPath().Find("PICTURES") != -1 && bAllowPictures && (bypassSettings)) { bPlaying = true; CStdString strExec; strExec.Format("XBMC.RecursiveSlideShow(%s)", pItem->GetPath().c_str()); CBuiltins::Execute(strExec); return true; } */ } } } // check video first if (!nAddedToPlaylist && !bPlaying && (bypassSettings || g_guiSettings.GetBool("dvds.autorun"))) { // stack video files CFileItemList tempItems; tempItems.Append(vecItems); if (g_settings.m_videoStacking) tempItems.Stack(); CFileItemList itemlist; for (int i = 0; i < tempItems.Size(); i++) { CFileItemPtr pItem = tempItems[i]; if (!pItem->m_bIsFolder && pItem->IsVideo()) { bPlaying = true; if (pItem->IsStack()) { // TODO: remove this once the app/player is capable of handling stacks immediately CStackDirectory dir; CFileItemList items; dir.GetDirectory(pItem->GetPath(), items); itemlist.Append(items); } else itemlist.Add(pItem); } } if (itemlist.Size()) { if (!bAllowVideo) { if (!bypassSettings) return false; if (g_windowManager.GetActiveWindow() != WINDOW_VIDEO_FILES) if (!g_passwordManager.IsMasterLockUnlocked(true)) return false; } g_playlistPlayer.ClearPlaylist(PLAYLIST_VIDEO); g_playlistPlayer.Add(PLAYLIST_VIDEO, itemlist); g_playlistPlayer.SetCurrentPlaylist(PLAYLIST_VIDEO); g_playlistPlayer.Play(0); } } // then music if (!bPlaying && (bypassSettings || g_guiSettings.GetInt("audiocds.autoaction") == AUTOCD_PLAY) && bAllowMusic) { for (int i = 0; i < vecItems.Size(); i++) { CFileItemPtr pItem = vecItems[i]; if (!pItem->m_bIsFolder && pItem->IsAudio()) { nAddedToPlaylist++; g_playlistPlayer.Add(PLAYLIST_MUSIC, pItem); } } } /* Probably want this if/when we add some automedia action dialog... // and finally pictures if (!nAddedToPlaylist && !bPlaying && bypassSettings && bAllowPictures) { for (int i = 0; i < vecItems.Size(); i++) { CFileItemPtr pItem = vecItems[i]; if (!pItem->m_bIsFolder && pItem->IsPicture()) { bPlaying = true; CStdString strExec; strExec.Format("XBMC.RecursiveSlideShow(%s)", strDrive.c_str()); CBuiltins::Execute(strExec); break; } } } */ // check subdirs if we are not playing yet if (!bPlaying) { for (int i = 0; i < vecItems.Size(); i++) { CFileItemPtr pItem = vecItems[i]; if (pItem->m_bIsFolder) { if (pItem->GetPath() != "." && pItem->GetPath() != ".." ) { if (RunDisc(pDir, pItem->GetPath(), nAddedToPlaylist, false, bypassSettings, startFromBeginning)) { bPlaying = true; break; } } } // if (non system) folder } // for all items in directory } // if root folder return bPlaying; }
bool CVideoThumbLoader::LoadItem(CFileItem* pItem) { if (pItem->m_bIsShareOrDrive) return true; CStdString cachedThumb(pItem->GetCachedVideoThumb()); if (!pItem->HasThumbnail()) { pItem->SetUserVideoThumb(); if (!CFile::Exists(cachedThumb)) { CStdString strPath, strFileName; CUtil::Split(cachedThumb, strPath, strFileName); // create unique thumb for auto generated thumbs cachedThumb = strPath + "auto-" + strFileName; if (pItem->IsVideo() && !pItem->IsInternetStream() && !pItem->IsPlayList() && !CFile::Exists(cachedThumb)) { if (pItem->IsStack()) { CStackDirectory stack; CVideoThumbLoader::ExtractThumb(stack.GetFirstStackedFile(pItem->m_strPath), cachedThumb); } else { CVideoThumbLoader::ExtractThumb(pItem->m_strPath, cachedThumb); } } if (CFile::Exists(cachedThumb)) { pItem->SetProperty("HasAutoThumb", "1"); pItem->SetProperty("AutoThumbImage", cachedThumb); pItem->SetThumbnailImage(cachedThumb); } } } else { // look for remote thumbs CStdString thumb(pItem->GetThumbnailImage()); if (!CURL::IsFileOnly(thumb) && !CUtil::IsHD(thumb)) { if(CFile::Exists(cachedThumb)) pItem->SetThumbnailImage(cachedThumb); else { CPicture pic; if(pic.DoCreateThumbnail(thumb, cachedThumb)) pItem->SetThumbnailImage(cachedThumb); else pItem->SetThumbnailImage(""); } } } if (!pItem->HasProperty("fanart_image")) { pItem->CacheFanart(); if (pItem->GetQuickFanart().size() > 0) { if (CFile::Exists(pItem->GetCachedProgramFanart())) pItem->SetProperty("fanart_image",pItem->GetCachedProgramFanart()); } else { if (CFile::Exists(pItem->GetCachedFanart())) pItem->SetProperty("fanart_image",pItem->GetCachedFanart()); } } return true; }
bool CAutorun::RunDisc(IDirectory* pDir, const CStdString& strDrive, int& nAddedToPlaylist, bool bRoot, bool bypassSettings /* = false */) { bool bPlaying(false); CFileItemList vecItems; char szSlash = '\\'; if (strDrive.Find("iso9660") != -1) szSlash = '/'; if ( !pDir->GetDirectory( strDrive, vecItems ) ) { return false; } bool bAllowVideo = true; bool bAllowPictures = true; bool bAllowMusic = true; if (!g_passwordManager.IsMasterLockUnlocked(false)) { bAllowVideo = !g_settings.m_vecProfiles[g_settings.m_iLastLoadedProfileIndex].videoLocked(); bAllowPictures = !g_settings.m_vecProfiles[g_settings.m_iLastLoadedProfileIndex].picturesLocked(); bAllowMusic = !g_settings.m_vecProfiles[g_settings.m_iLastLoadedProfileIndex].musicLocked(); } if( bRoot ) { // check root folders first, for normal structured dvd's for (int i = 0; i < vecItems.Size(); i++) { CFileItem* pItem = vecItems[i]; if (pItem->m_bIsFolder && pItem->m_strPath != "." && pItem->m_strPath != "..") { if (pItem->m_strPath.Find( "VIDEO_TS" ) != -1 && bAllowVideo && (bypassSettings || g_guiSettings.GetBool("autorun.dvd"))) { CUtil::PlayDVD(); bPlaying = true; return true; } else if (pItem->m_strPath.Find("MPEGAV") != -1 && bAllowVideo && (bypassSettings || g_guiSettings.GetBool("autorun.vcd"))) { CFileItemList items; CDirectory::GetDirectory(pItem->m_strPath, items, ".dat"); if (items.Size()) { items.Sort(SORT_METHOD_LABEL, SORT_ORDER_ASC); g_playlistPlayer.ClearPlaylist(PLAYLIST_VIDEO); g_playlistPlayer.Add(PLAYLIST_VIDEO, items); g_playlistPlayer.SetCurrentPlaylist(PLAYLIST_VIDEO); g_playlistPlayer.Play(0); bPlaying = true; return true; } } else if (pItem->m_strPath.Find("MPEG2") != -1 && bAllowVideo && (bypassSettings || g_guiSettings.GetBool("autorun.vcd"))) { CFileItemList items; CDirectory::GetDirectory(pItem->m_strPath, items, ".mpg"); if (items.Size()) { items.Sort(SORT_METHOD_LABEL, SORT_ORDER_ASC); g_playlistPlayer.ClearPlaylist(PLAYLIST_VIDEO); g_playlistPlayer.Add(PLAYLIST_VIDEO, items); g_playlistPlayer.SetCurrentPlaylist(PLAYLIST_VIDEO); g_playlistPlayer.Play(0); bPlaying = true; return true; } } else if (pItem->m_strPath.Find("PICTURES") != -1 && bAllowPictures && (bypassSettings || g_guiSettings.GetBool("autorun.pictures"))) { bPlaying = true; CStdString strExec; strExec.Format("XBMC.RecursiveSlideShow(%s)", pItem->m_strPath.c_str()); CUtil::ExecBuiltIn(strExec); return true; } } } } // check video first if (!nAddedToPlaylist && !bPlaying && (bypassSettings || g_guiSettings.GetBool("autorun.video"))) { // stack video files CFileItemList tempItems; tempItems.Append(vecItems); tempItems.Stack(); CFileItemList itemlist; for (int i = 0; i < tempItems.Size(); i++) { CFileItem *pItem = tempItems[i]; if (!pItem->m_bIsFolder && pItem->IsVideo()) { bPlaying = true; if (pItem->IsStack()) { // TODO: remove this once the app/player is capable of handling stacks immediately CStackDirectory dir; CFileItemList items; dir.GetDirectory(pItem->m_strPath, items); for (int i = 0; i < items.Size(); i++) { itemlist.Add(new CFileItem(*items[i])); } } else itemlist.Add(new CFileItem(*pItem)); } } if (itemlist.Size()) { if (!bAllowVideo) { if (!bypassSettings) return false; if (m_gWindowManager.GetActiveWindow() != WINDOW_VIDEO_FILES) if (!g_passwordManager.IsMasterLockUnlocked(true)) return false; } g_playlistPlayer.ClearPlaylist(PLAYLIST_VIDEO); g_playlistPlayer.Add(PLAYLIST_VIDEO, itemlist); g_playlistPlayer.SetCurrentPlaylist(PLAYLIST_VIDEO); g_playlistPlayer.Play(0); } } // then music if (!bPlaying && (bypassSettings || g_guiSettings.GetBool("autorun.music")) && bAllowMusic) { for (int i = 0; i < vecItems.Size(); i++) { CFileItem *pItem = vecItems[i]; if (!pItem->m_bIsFolder && pItem->IsAudio()) { nAddedToPlaylist++; g_playlistPlayer.Add(PLAYLIST_MUSIC, pItem); } } } // and finally pictures if (!nAddedToPlaylist && !bPlaying && (bypassSettings || g_guiSettings.GetBool("autorun.pictures")) && bAllowPictures) { for (int i = 0; i < vecItems.Size(); i++) { CFileItem *pItem = vecItems[i]; if (!pItem->m_bIsFolder && pItem->IsPicture()) { bPlaying = true; CStdString strExec; strExec.Format("XBMC.RecursiveSlideShow(%s)", strDrive.c_str()); CUtil::ExecBuiltIn(strExec); break; } } } // check subdirs if we are not playing yet if (!bPlaying) { for (int i = 0; i < vecItems.Size(); i++) { CFileItem* pItem = vecItems[i]; if (pItem->m_bIsFolder) { if (pItem->m_strPath != "." && pItem->m_strPath != ".." ) { if (RunDisc(pDir, pItem->m_strPath, nAddedToPlaylist, false, bypassSettings)) { bPlaying = true; break; } } } } } return bPlaying; }
bool CVideoThumbLoader::LoadItem(CFileItem* pItem) { if (pItem->m_bIsShareOrDrive) return true; if (pItem->IsVideoDb() && pItem->HasVideoInfoTag() && !pItem->HasThumbnail()) { if (pItem->m_bIsFolder && pItem->GetVideoInfoTag()->m_iSeason > -1) return false; CFileItem item(*pItem->GetVideoInfoTag()); bool bResult = LoadItem(&item); if (bResult) { pItem->SetProperty("HasAutoThumb",item.GetProperty("HasAutoThumb")); pItem->SetProperty("AutoThumbImage",item.GetProperty("AutoThumbImage")); pItem->SetProperty("fanart_image",item.GetProperty("fanart_image")); pItem->SetThumbnailImage(item.GetThumbnailImage()); } return bResult; } CStdString cachedThumb(pItem->GetCachedVideoThumb()); if (!pItem->HasThumbnail()) { pItem->SetUserVideoThumb(); if (!CFile::Exists(cachedThumb)) { CStdString strPath, strFileName; CUtil::Split(cachedThumb, strPath, strFileName); // create unique thumb for auto generated thumbs cachedThumb = strPath + "auto-" + strFileName; if (pItem->IsVideo() && !pItem->IsInternetStream() && !pItem->IsPlayList() && !CFile::Exists(cachedThumb)) { if (pItem->IsStack()) { CStackDirectory stack; CVideoThumbLoader::ExtractThumb(stack.GetFirstStackedFile(pItem->m_strPath), cachedThumb); } else { CVideoThumbLoader::ExtractThumb(pItem->m_strPath, cachedThumb); } } if (CFile::Exists(cachedThumb)) { pItem->SetProperty("HasAutoThumb", "1"); pItem->SetProperty("AutoThumbImage", cachedThumb); pItem->SetThumbnailImage(cachedThumb); } } } else LoadRemoteThumb(pItem); if (!pItem->HasProperty("fanart_image")) { pItem->CacheFanart(); if (CFile::Exists(pItem->GetCachedFanart())) pItem->SetProperty("fanart_image",pItem->GetCachedFanart()); } // if (pItem->IsVideo() && !pItem->IsInternetStream()) // CDVDPlayer::GetFileMetaData(pItem->m_strPath, pItem); return true; }