bool CGUIDialogSimpleMenu::ShowPlaySelection(CFileItem& item) { /* if asked to resume somewhere, we should not show anything */ if (item.m_lStartOffset || (item.HasVideoInfoTag() && item.GetVideoInfoTag()->m_iBookmarkId > 0)) return true; if (CSettings::GetInstance().GetInt(CSettings::SETTING_DISC_PLAYBACK) != BD_PLAYBACK_SIMPLE_MENU) return true; std::string path; if (item.IsVideoDb()) path = item.GetVideoInfoTag()->m_strFileNameAndPath; else path = item.GetPath(); if (item.IsBDFile()) { std::string root = URIUtils::GetParentPath(path); URIUtils::RemoveSlashAtEnd(root); if (URIUtils::GetFileName(root) == "BDMV") { CURL url("bluray://"); url.SetHostName(URIUtils::GetParentPath(root)); url.SetFileName("root"); return ShowPlaySelection(item, url.Get()); } } if (item.IsDiscImage()) { CURL url2("udf://"); url2.SetHostName(item.GetPath()); url2.SetFileName("BDMV/index.bdmv"); if (XFILE::CFile::Exists(url2.Get())) { url2.SetFileName(""); CURL url("bluray://"); url.SetHostName(url2.Get()); url.SetFileName("root"); return ShowPlaySelection(item, url.Get()); } } return true; }
void CPlayerSelectionRule::GetPlayers(const CFileItem& item, std::vector<std::string>&validPlayers, std::vector<std::string>&players) { CLog::Log(LOGDEBUG, "CPlayerSelectionRule::GetPlayers: considering rule: %s", m_name.c_str()); if (m_bStreamDetails && !item.HasVideoInfoTag()) return; if (m_tAudio >= 0 && (m_tAudio > 0) != item.IsAudio()) return; if (m_tVideo >= 0 && (m_tVideo > 0) != item.IsVideo()) return; if (m_tInternetStream >= 0 && (m_tInternetStream > 0) != item.IsInternetStream()) return; if (m_tRemote >= 0 && (m_tRemote > 0) != item.IsRemote()) return; if (m_tBD >= 0 && (m_tBD > 0) != (item.IsBDFile() && item.IsOnDVD())) return; if (m_tDVD >= 0 && (m_tDVD > 0) != item.IsDVD()) return; if (m_tDVDFile >= 0 && (m_tDVDFile > 0) != item.IsDVDFile()) return; if (m_tDVDImage >= 0 && (m_tDVDImage > 0) != item.IsDiscImage()) return; CRegExp regExp(false, CRegExp::autoUtf8); if (m_bStreamDetails) { if (!item.GetVideoInfoTag()->HasStreamDetails()) { CLog::Log(LOGDEBUG, "CPlayerSelectionRule::GetPlayers: cannot check rule: %s, no StreamDetails", m_name.c_str()); return; } CStreamDetails streamDetails = item.GetVideoInfoTag()->m_streamDetails; if (CompileRegExp(m_audioCodec, regExp) && !MatchesRegExp(streamDetails.GetAudioCodec(), regExp)) return; std::stringstream itoa; itoa << streamDetails.GetAudioChannels(); std::string audioChannelsstr = itoa.str(); if (CompileRegExp(m_audioChannels, regExp) && !MatchesRegExp(audioChannelsstr, regExp)) return; if (CompileRegExp(m_videoCodec, regExp) && !MatchesRegExp(streamDetails.GetVideoCodec(), regExp)) return; if (CompileRegExp(m_videoResolution, regExp) && !MatchesRegExp(CStreamDetails::VideoDimsToResolutionDescription(streamDetails.GetVideoWidth(), streamDetails.GetVideoHeight()), regExp)) return; if (CompileRegExp(m_videoAspect, regExp) && !MatchesRegExp(CStreamDetails::VideoAspectToAspectDescription(streamDetails.GetVideoAspect()), regExp)) return; } CURL url(item.GetPath()); if (CompileRegExp(m_fileTypes, regExp) && !MatchesRegExp(url.GetFileType(), regExp)) return; if (CompileRegExp(m_protocols, regExp) && !MatchesRegExp(url.GetProtocol(), regExp)) return; if (CompileRegExp(m_mimeTypes, regExp) && !MatchesRegExp(item.GetMimeType(), regExp)) return; if (CompileRegExp(m_fileName, regExp) && !MatchesRegExp(item.GetPath(), regExp)) return; CLog::Log(LOGDEBUG, "CPlayerSelectionRule::GetPlayers: matches rule: %s", m_name.c_str()); for (unsigned int i = 0; i < vecSubRules.size(); i++) vecSubRules[i]->GetPlayers(item, validPlayers, players); if (std::find(validPlayers.begin(), validPlayers.end(), m_playerName) != validPlayers.end()) { CLog::Log(LOGDEBUG, "CPlayerSelectionRule::GetPlayers: adding player: %s for rule: %s", m_playerName.c_str(), m_name.c_str()); players.push_back(m_playerName); } }
bool CApplicationPlayer::OpenFile(const CFileItem& item, const CPlayerOptions& options, const CPlayerCoreFactory &factory, const std::string &playerName, IPlayerCallback& callback) { // get player type std::string newPlayer; if (!playerName.empty()) newPlayer = playerName; else newPlayer = factory.GetDefaultPlayer(item); // check if we need to close current player // VideoPlayer can open a new file while playing std::shared_ptr<IPlayer> player = GetInternal(); if (player && player->IsPlaying()) { bool needToClose = false; if (item.IsDiscImage() || item.IsDVDFile()) needToClose = true; if (player->m_name != newPlayer) needToClose = true; if (player->m_type != "video") needToClose = true; if (needToClose) { m_nextItem.pItem = std::make_shared<CFileItem>(item); m_nextItem.options = options; m_nextItem.playerName = newPlayer; m_nextItem.callback = &callback; CloseFile(); if (player->m_name != newPlayer) { CSingleLock lock(m_playerLock); m_pPlayer.reset(); } return true; } } if (!player) { CreatePlayer(factory, newPlayer, callback); player = GetInternal(); if (!player) return false; } bool ret = player->OpenFile(item, options); m_nextItem.pItem.reset(); // reset caching timers m_audioStreamUpdate.SetExpired(); m_videoStreamUpdate.SetExpired(); m_subtitleStreamUpdate.SetExpired(); return ret; }