bool CPlayListFactory::IsPlaylist(const CFileItem& item) { CStdString strMimeType = item.GetMimeType(); strMimeType.ToLower(); /* These are abit uncertain if(strMimeType == "video/x-ms-asf" || strMimeType == "video/x-ms-asx" || strMimeType == "video/x-ms-wmv" || strMimeType == "video/x-ms-wma" || strMimeType == "video/x-ms-wfs" || strMimeType == "video/x-ms-wvx" || strMimeType == "video/x-ms-wax" || strMimeType == "video/x-ms-asf") return true; */ // online m3u8 files are hls:// -- do not treat as playlist if (item.IsInternetStream() && item.IsType(".m3u8")) return false; if(strMimeType == "audio/x-pn-realaudio" || strMimeType == "playlist" || strMimeType == "audio/x-mpegurl") return true; return IsPlaylist(item.GetPath()); }
bool CGUIMultiImage::CMultiImageJob::DoWork() { // check to see if we have a single image or a folder of images CFileItem item(m_path, false); item.FillInMimeType(); if (item.IsPicture() || StringUtils::StartsWithNoCase(item.GetMimeType(), "image/")) { m_files.push_back(m_path); } else { // Load in images from the directory specified // m_path is relative (as are all skin paths) std::string realPath = CServiceBroker::GetGUI()->GetTextureManager().GetTexturePath(m_path, true); if (realPath.empty()) return true; URIUtils::AddSlashAtEnd(realPath); CFileItemList items; CDirectory::GetDirectory(realPath, items, CServiceBroker::GetFileExtensionProvider().GetPictureExtensions()+ "|.tbn|.dds", DIR_FLAG_NO_FILE_DIRS | DIR_FLAG_NO_FILE_INFO); for (int i=0; i < items.Size(); i++) { CFileItem* pItem = items[i].get(); if (pItem && (pItem->IsPicture() || StringUtils::StartsWithNoCase(pItem->GetMimeType(), "image/"))) m_files.push_back(pItem->GetPath()); } } return true; }
bool CGUIMultiImage::CMultiImageJob::DoWork() { // check to see if we have a single image or a folder of images CFileItem item(m_path, false); item.FillInMimeType(); if (item.IsPicture() || item.GetMimeType().Left(6).Equals("image/")) { m_files.push_back(m_path); } else { // Load in images from the directory specified // m_path is relative (as are all skin paths) CStdString realPath = g_TextureManager.GetTexturePath(m_path, true); if (realPath.IsEmpty()) return true; URIUtils::AddSlashAtEnd(realPath); CFileItemList items; CDirectory::GetDirectory(realPath, items, g_advancedSettings.m_pictureExtensions + "|.tbn|.dds", DIR_FLAG_NO_FILE_DIRS | DIR_FLAG_NO_FILE_INFO); for (int i=0; i < items.Size(); i++) { CFileItem* pItem = items[i].get(); if (pItem && (pItem->IsPicture() || pItem->GetMimeType().Left(6).Equals("image/"))) m_files.push_back(pItem->GetPath()); } } return true; }
void CPlayerSelectionRule::GetPlayers(const CFileItem& item, VECPLAYERCORES &vecCores) { 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_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.IsDVDImage()) return; CRegExp regExp; 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; 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, vecCores); PLAYERCOREID playerCoreId = GetPlayerCore(); if (playerCoreId != EPC_NONE) { CLog::Log(LOGDEBUG, "CPlayerSelectionRule::GetPlayers: adding player: %s (%d) for rule: %s", m_playerName.c_str(), playerCoreId, m_name.c_str()); vecCores.push_back(GetPlayerCore()); } }
bool CAudioDecoder::Create(const CFileItem &file, __int64 seekOffset, unsigned int nBufferSize) { Destroy(); CSingleLock lock(m_critSection); // create our pcm buffer m_pcmBuffer.Create((int)std::max<unsigned int>(2, nBufferSize) * INTERNAL_BUFFER_LENGTH); // reset our playback timing variables m_eof = false; // get correct cache size unsigned int filecache = g_guiSettings.GetInt("cacheaudio.internet"); if ( file.IsHD() ) filecache = g_guiSettings.GetInt("cache.harddisk"); else if ( file.IsOnDVD() ) filecache = g_guiSettings.GetInt("cacheaudio.dvdrom"); else if ( file.IsOnLAN() ) filecache = g_guiSettings.GetInt("cacheaudio.lan"); // create our codec m_codec=CodecFactory::CreateCodecDemux(file.GetPath(), file.GetMimeType(), filecache * 1024); if (!m_codec || !m_codec->Init(file.GetPath(), filecache * 1024)) { CLog::Log(LOGERROR, "CAudioDecoder: Unable to Init Codec while loading file %s", file.GetPath().c_str()); Destroy(); return false; } m_blockSize = m_codec->m_Channels * m_codec->m_BitsPerSample / 8; // set total time from the given tag if (file.HasMusicInfoTag() && file.GetMusicInfoTag()->GetDuration()) m_codec->SetTotalTime(file.GetMusicInfoTag()->GetDuration()); if (seekOffset) m_codec->Seek(seekOffset); m_status = STATUS_QUEUING; return true; }
bool CPlayListFactory::IsPlaylist(const CFileItem& item) { CStdString strMimeType = item.GetMimeType(); strMimeType.ToLower(); /* These are abit uncertain if(strMimeType == "video/x-ms-asf" || strMimeType == "video/x-ms-asx" || strMimeType == "video/x-ms-wmv" || strMimeType == "video/x-ms-wma" || strMimeType == "video/x-ms-wfs" || strMimeType == "video/x-ms-wvx" || strMimeType == "video/x-ms-wax" || strMimeType == "video/x-ms-asf") return true; */ if(strMimeType == "audio/x-pn-realaudio" || strMimeType == "playlist" || strMimeType == "audio/x-mpegurl") return true; return IsPlaylist(item.m_strPath); }
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); } }
/*---------------------------------------------------------------------- | CUPnPDirectory::GetDirectory +---------------------------------------------------------------------*/ bool CUPnPDirectory::GetResource(const CURL& path, CFileItem &item) { if(path.GetProtocol() != "upnp") return false; CUPnP* upnp = CUPnP::GetInstance(); if(!upnp) return false; CStdString uuid = path.GetHostName(); CStdString object = path.GetFileName(); object.TrimRight("/"); CURL::Decode(object); PLT_DeviceDataReference device; if(!FindDeviceWait(upnp, uuid.c_str(), device)) return false; PLT_MediaObjectListReference list; if (NPT_FAILED(upnp->m_MediaBrowser->BrowseSync(device, object.c_str(), list, true))) return false; PLT_MediaObjectList::Iterator entry = list->GetFirstItem(); if (entry == 0) return false; PLT_MediaItemResource resource; // look for a resource with "xbmc-get" protocol // if we can't find one, keep the first resource if(NPT_FAILED(NPT_ContainerFind((*entry)->m_Resources, CProtocolFinder("xbmc-get"), resource))) { if((*entry)->m_Resources.GetItemCount()) resource = (*entry)->m_Resources[0]; else return false; } // store original path so we remember it item.SetProperty("original_listitem_url", item.GetPath()); item.SetProperty("original_listitem_mime", item.GetMimeType(false)); // if it's an item, path is the first url to the item // we hope the server made the first one reachable for us // (it could be a format we dont know how to play however) item.SetPath((const char*) resource.m_Uri); // look for content type in protocol info if (resource.m_ProtocolInfo.IsValid()) { CLog::Log(LOGDEBUG, "CUPnPDirectory::GetResource - resource protocol info '%s'", (const char*)(resource.m_ProtocolInfo.ToString())); if (resource.m_ProtocolInfo.GetContentType().Compare("application/octet-stream") != 0) { item.SetMimeType((const char*)resource.m_ProtocolInfo.GetContentType()); } } else { CLog::Log(LOGERROR, "CUPnPDirectory::GetResource - invalid protocol info '%s'", (const char*)(resource.m_ProtocolInfo.ToString())); } // look for subtitles unsigned subs = 0; for(unsigned r = 0; r < (*entry)->m_Resources.GetItemCount(); r++) { PLT_MediaItemResource& res = (*entry)->m_Resources[r]; PLT_ProtocolInfo& info = res.m_ProtocolInfo; static const char* allowed[] = { "text/srt" , "text/ssa" , "text/sub" , "text/idx" }; for(unsigned type = 0; type < sizeof(allowed)/sizeof(allowed[0]); type++) { if(info.Match(PLT_ProtocolInfo("*", "*", allowed[type], "*"))) { CStdString prop; prop.Format("upnp:subtitle:%d", ++subs); item.SetProperty(prop, (const char*)res.m_Uri); break; } } } return true; }