bool CGUIWindowMusicBase::GetDirectory(const CStdString &strDirectory, CFileItemList &items) { items.SetThumbnailImage(""); bool bResult = CGUIMediaWindow::GetDirectory(strDirectory,items); if (bResult) items.SetMusicThumb(); // add in the "New Playlist" item if we're in the playlists folder if (items.m_strPath == "special://musicplaylists/" && !items.Contains("newplaylist://")) { CFileItem* newPlaylist = new CFileItem(g_settings.GetUserDataItem("PartyMode.xsp"),false); newPlaylist->SetLabel(g_localizeStrings.Get(16035)); newPlaylist->SetLabelPreformated(true); newPlaylist->m_bIsFolder = true; items.Add(newPlaylist); newPlaylist = new CFileItem("newplaylist://", false); newPlaylist->SetLabel(g_localizeStrings.Get(525)); newPlaylist->SetLabelPreformated(true); newPlaylist->SetCanQueue(false); items.Add(newPlaylist); newPlaylist = new CFileItem("newsmartplaylist://music", false); newPlaylist->SetLabel(g_localizeStrings.Get(21437)); newPlaylist->SetLabelPreformated(true); newPlaylist->SetCanQueue(false); items.Add(newPlaylist); } return bResult; }
bool CFileOperations::FillFileItem(const CFileItemPtr &originalItem, CFileItem &item, CStdString media /* = "" */) { if (originalItem.get() == NULL) return false; // copy all the available details item = *originalItem; bool status = false; CStdString strFilename = originalItem->GetPath(); if (!strFilename.empty() && (CDirectory::Exists(strFilename) || CFile::Exists(strFilename))) { if (media.Equals("video")) status = CVideoLibrary::FillFileItem(strFilename, item); else if (media.Equals("music")) status = CAudioLibrary::FillFileItem(strFilename, item); if (status && item.GetLabel().empty()) { CStdString label = originalItem->GetLabel(); if (label.empty()) { bool isDir = CDirectory::Exists(strFilename); label = CUtil::GetTitleFromPath(strFilename, isDir); if (label.empty()) label = URIUtils::GetFileName(strFilename); } item.SetLabel(label); } else if (!status) { if (originalItem->GetLabel().empty()) { bool isDir = CDirectory::Exists(strFilename); CStdString label = CUtil::GetTitleFromPath(strFilename, isDir); if (label.empty()) return false; item.SetLabel(label); item.SetPath(strFilename); item.m_bIsFolder = isDir; } else item = *originalItem.get(); status = true; } } return status; }
bool CCMythDirectory::GetDirectory(const CStdString& strPath, CFileItemList &items) { CURL url(strPath); CStdString base(strPath); CUtil::RemoveSlashAtEnd(base); m_session = CCMythSession::AquireSession(strPath); if(!m_session) return false; m_dll = m_session->GetLibrary(); if(!m_dll) return false; if(url.GetFileName().IsEmpty()) { CFileItem *item; item = new CFileItem(base + "/channels/", true); item->SetLabel("Live Channels"); item->SetLabelPreformated(true); items.Add(item); item = new CFileItem(base + "/recordings/", true); item->SetLabel("Recordings"); item->SetLabelPreformated(true); items.Add(item); item = new CFileItem(base + "/guide/", true); item->SetLabel("Guide"); item->SetLabelPreformated(true); items.Add(item); return true; } else if(url.GetFileName() == "channels/") return GetChannels(base, items); else if(url.GetFileName() == "channelsdb/") return GetChannelsDb(base, items); else if(url.GetFileName() == "recordings/") return GetRecordings(base, items); else if(url.GetFileName().Left(5) == "guide") return GetGuide(base, items); return false; }
bool CUPnPAvDirectory::GetResource(const CURI& path, CFileItem &item) { CStdString strFileName = path.GetFileName(); CStdString strHostName = path.GetHostName(); CStdString strHddPath; CUtil::UrlDecode(strHostName); strHddPath.Format("%s/%s/%s", UPNP_MNT, strHostName, strFileName); if(!CFile::Exists(strHddPath)) { CLog::Log(LOGERROR, "CUPnPAvDirectory::%s - upnp node [%s] for [%s] doesnt exists", __func__, strHddPath.c_str(), path.Get().c_str()); return false; } item.m_strPath = strHddPath; item.SetLabel(path.Get()); struct stat st; if (stat(strHddPath.c_str(),&st) == 0) { item.m_bIsFolder = S_ISDIR(st.st_mode); } return true; }
bool CFileOperations::FillFileItem(const CFileItemPtr &originalItem, CFileItem &item, CStdString media /* = "" */) { if (originalItem.get() == NULL) return false; bool status = false; CStdString strFilename = originalItem->GetPath(); if (!strFilename.empty() && (CDirectory::Exists(strFilename) || CFile::Exists(strFilename))) { if (media.Equals("video")) status = CVideoLibrary::FillFileItem(strFilename, item); else if (media.Equals("music")) status = CAudioLibrary::FillFileItem(strFilename, item); if (!status && originalItem->GetLabel().empty()) { bool isDir = CDirectory::Exists(strFilename); CStdString label = CUtil::GetTitleFromPath(strFilename, isDir); if (!label.empty()) { item = CFileItem(strFilename, isDir); item.SetLabel(label); status = true; } } } return status; }
JSONRPC_STATUS CFavouritesOperations::AddFavourite(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { std::string type = parameterObject["type"].asString(); if (type.compare("unknown") == 0) return InvalidParams; if ((type.compare("media") == 0 || type.compare("script") == 0) && !ParameterNotNull(parameterObject, "path")) { result["method"] = "Favourites.AddFavourite"; result["stack"]["message"] = "Missing parameter"; result["stack"]["name"] = "path"; result["stack"]["type"] = "string"; return InvalidParams; } if (type.compare("window") == 0 && !ParameterNotNull(parameterObject, "window")) { result["method"] = "Favourites.AddFavourite"; result["stack"]["message"] = "Missing parameter"; result["stack"]["name"] = "window"; result["stack"]["type"] = "string"; return InvalidParams; } std::string title = parameterObject["title"].asString(); std::string path = parameterObject["path"].asString(); CFileItem item; int contextWindow = 0; if (type.compare("window") == 0) { item = CFileItem(parameterObject["windowparameter"].asString(), true); contextWindow = CWindowTranslator::TranslateWindow(parameterObject["window"].asString()); if (contextWindow == WINDOW_INVALID) return InvalidParams; } else if (type.compare("script") == 0) { if (!URIUtils::IsScript(path)) path = "script://" + path; item = CFileItem(path, false); } else if (type.compare("media") == 0) { item = CFileItem(path, false); } else return InvalidParams; item.SetLabel(title); if (ParameterNotNull(parameterObject,"thumbnail")) item.SetArt("thumb", parameterObject["thumbnail"].asString()); if (CServiceBroker::GetFavouritesService().AddOrRemove(item, contextWindow)) return ACK; else return FailedToExecute; }
bool CNfsDirectory::GetResource(const CURI& path, CFileItem &item) { if(path.GetProtocol() != "nfs") { CLog::Log(LOGERROR, "CNfsDirectory::%s - invalid protocol [%s]", __func__, path.GetProtocol().c_str()); return false; } CStdString strHostName = path.GetHostName(); CStdString strFullPath = path.GetFileName(); CStdString strFileName, strExportDir; int iPos = strFullPath.Find(":", 0); if (iPos != -1) { strExportDir = strFullPath.substr(0, iPos); strFileName = strFullPath.substr(iPos + 1, strFullPath.length()); } else { strExportDir = strFullPath; } CStdString strMountPoint = GetMountPoint("nfs", strHostName, strExportDir); // path is not mounted - need to mount it if(!CUtil::IsMountpoint(strMountPoint) && CUtil::GetFsMagic(strMountPoint+strFileName) != NFS_SUPER_MAGIC) { CStdString nfsPath = strHostName + ":" + "/" + strExportDir; CLog::Log(LOGDEBUG, "CNfsDirectory::%s - mounting NFS share [%s] ==> [%s]", __func__, nfsPath.c_str(), strMountPoint.c_str()); if(MountShare(nfsPath, strMountPoint) == false) { CLog::Log(LOGERROR, "CNfsDirectory::%s - failed to mount NFS share [%s]", __func__, nfsPath.c_str()); return false; } } CStdString strHddPath = strMountPoint + strFileName; item.m_strPath = strHddPath; item.SetLabel(path.Get()); item.SetProperty("filename", strFileName); item.SetProperty("mountpoint", strMountPoint); struct stat st; if (stat(strHddPath.c_str(),&st) == 0) { item.m_bIsFolder = S_ISDIR(st.st_mode); } return true; }
void CAppManager::LaunchHtmlApp(const CAppDescriptor& desc) { CLog::Log(LOGDEBUG, "CAppManager::LaunchHtmlApp, id = %s (applaunch)", desc.GetId().c_str()); CStdString url = desc.GetURL(); CUtil::URLEncode(url); CStdString path = "flash://"+desc.GetId()+"/?src="+url; CStdString controller = desc.GetController(); if (!controller.IsEmpty()) { CUtil::URLEncode(controller); path += "&bx-jsactions=" + controller; } CFileItem item; item.m_strPath = path; item.SetLabel(desc.GetName()); item.GetVideoInfoTag()->m_strPlot = desc.GetDescription(); item.SetProperty("appid", desc.GetId()); g_application.PlayFile(item); }
void CAppManager::LaunchUrlApp(const CAppDescriptor& desc) { CLog::Log(LOGDEBUG, "CAppManager::LaunchUrlApp, id = %s (applaunch)", desc.GetId().c_str()); if (g_windowManager.GetActiveWindow() != WINDOW_BOXEE_BROWSE_SIMPLE_APP) { CGUIWindowBoxeeBrowseSimpleApp::Show(desc.GetURL(), desc.GetName(), desc.GetBackgroundImageURL(), true, desc.GetId()); } else { CFileItem* pItem = new CFileItem(); pItem->m_strPath = desc.GetURL(); pItem->SetLabel(desc.GetName()); pItem->SetProperty("isrss", true); pItem->SetProperty("appid", desc.GetId()); pItem->SetProperty("BrowseBackgroundImage", desc.GetBackgroundImageURL().c_str()); CGUIMessage message(GUI_MSG_SET_CONTAINER_PATH, WINDOW_BOXEE_BROWSE_SIMPLE_APP, 0); message.SetPointer(pItem); g_windowManager.SendMessage(message); } }
bool CFileOperations::FillFileItem(const CStdString &strFilename, CFileItem &item, CStdString media /* = "" */) { bool status = false; if (!strFilename.empty() && !CDirectory::Exists(strFilename) && CFile::Exists(strFilename)) { if (media.Equals("video")) status |= CVideoLibrary::FillFileItem(strFilename, item); else if (media.Equals("music")) status |= CAudioLibrary::FillFileItem(strFilename, item); if (!status) { item = CFileItem(strFilename, false); if (item.GetLabel().IsEmpty()) item.SetLabel(CUtil::GetTitleFromPath(strFilename, false)); } status = true; } return status; }
bool CShoutcastDirectory::ParseGenres(TiXmlElement *root, CFileItemList &items, CURL &url) { TiXmlElement *element = root->FirstChildElement("genre"); if(element == NULL) { CLog::Log(LOGWARNING, "%s - No genres found", __FUNCTION__); return false; } items.m_idepth = 1; /* genre list */ CStdString genre, path; while(element != NULL) { genre = element->Attribute("name"); path = genre; /* genre must be urlencoded */ CUtil::URLEncode(path); url.SetOptions("?genre=" + path); url.GetURL(path); CFileItem* pItem = new CFileItem; pItem->m_bIsFolder = true; pItem->SetLabel(genre); pItem->GetMusicInfoTag()->SetGenre(genre); pItem->m_strPath = path; items.Add(pItem); element = element->NextSiblingElement("genre"); } return true; }
// TODO: Currently no support for "embedded thumb" as there is no easy way to grab it // without sending a file that has this as it's album to this class void CGUIDialogSongInfo::OnGetThumb() { CFileItemList items; // Grab the thumbnail from the web CStdString thumbFromWeb; /* CUtil::AddFileToFolder(g_advancedSettings.m_cachePath, "allmusicThumb.jpg", thumbFromWeb); if (DownloadThumbnail(thumbFromWeb)) { CFileItem *item = new CFileItem("thumb://allmusic.com", false); item->SetThumbnailImage(thumbFromWeb); item->SetLabel(g_localizeStrings.Get(20055)); items.Add(item); }*/ // Current thumb if (CFile::Exists(m_song->GetThumbnailImage())) { CFileItem *item = new CFileItem("thumb://Current", false); item->SetThumbnailImage(m_song->GetThumbnailImage()); item->SetLabel(g_localizeStrings.Get(20016)); items.Add(item); } // local thumb CStdString cachedLocalThumb; CStdString localThumb(m_song->GetUserMusicThumb(true)); if (m_song->IsMusicDb()) { CFileItem item(m_song->GetMusicInfoTag()->GetURL(), false); localThumb = item.GetUserMusicThumb(true); } if (CFile::Exists(localThumb)) { CUtil::AddFileToFolder(g_advancedSettings.m_cachePath, "localthumb.jpg", cachedLocalThumb); CPicture pic; if (pic.DoCreateThumbnail(localThumb, cachedLocalThumb)) { CFileItem *item = new CFileItem("thumb://Local", false); item->SetThumbnailImage(cachedLocalThumb); item->SetLabel(g_localizeStrings.Get(20017)); items.Add(item); } } else { // no local thumb exists, so we are just using the allmusic.com thumb or cached thumb // which is probably the allmusic.com thumb. These could be wrong, so allow the user // to delete the incorrect thumb CFileItem *item = new CFileItem("thumb://None", false); item->SetThumbnailImage("defaultAlbumCover.png"); item->SetLabel(g_localizeStrings.Get(20018)); items.Add(item); } CStdString result; if (!CGUIDialogFileBrowser::ShowAndGetImage(items, g_settings.m_musicSources, g_localizeStrings.Get(1030), result)) return; // user cancelled if (result == "thumb://Current") return; // user chose the one they have // delete the thumbnail if that's what the user wants, else overwrite with the // new thumbnail CStdString cachedThumb(CUtil::GetCachedAlbumThumb(m_song->GetMusicInfoTag()->GetAlbum(), m_song->GetMusicInfoTag()->GetArtist())); if (result == "thumb://None") { // cache the default thumb CPicture pic; pic.CacheSkinImage("defaultAlbumCover.png", cachedThumb); } else if (result == "thumb://allmusic.com") CFile::Cache(thumbFromWeb, cachedThumb); else if (result == "thumb://Local") CFile::Cache(cachedLocalThumb, cachedThumb); else if (CFile::Exists(result)) { CPicture pic; pic.DoCreateThumbnail(result, cachedThumb); } m_song->SetThumbnailImage(cachedThumb); // tell our GUI to completely reload all controls (as some of them // are likely to have had this image in use so will need refreshing) CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_REFRESH_THUMBS); g_graphicsContext.SendMessage(msg); // m_hasUpdatedThumb = true; }
// \brief Set window to a specific directory // \param strDirectory The directory to be displayed in list/thumb control // This function calls OnPrepareFileItems() and OnFinalizeFileItems() bool CGUIMediaWindow::Update(const CStdString &strDirectory) { // get selected item int iItem = m_viewControl.GetSelectedItem(); CStdString strSelectedItem = ""; if (iItem >= 0 && iItem < m_vecItems->Size()) { CFileItem* pItem = m_vecItems->Get(iItem); if (!pItem->IsParentFolder()) { GetDirectoryHistoryString(pItem, strSelectedItem); } } CStdString strOldDirectory = m_vecItems->m_strPath; m_history.SetSelectedItem(strSelectedItem, strOldDirectory); ClearFileItems(); m_vecItems->ClearProperties(); m_vecItems->SetThumbnailImage(""); if (!GetDirectory(strDirectory, *m_vecItems)) { CLog::Log(LOGERROR,"CGUIMediaWindow::GetDirectory(%s) failed", strDirectory.c_str()); // if the directory is the same as the old directory, then we'll return // false. Else, we assume we can get the previous directory if (strDirectory.Equals(strOldDirectory)) return false; // We assume, we can get the parent // directory again, but we have to // return false to be able to eg. show // an error message. CStdString strParentPath = m_history.GetParentPath(); m_history.RemoveParentPath(); Update(strParentPath); return false; } // if we're getting the root source listing // make sure the path history is clean if (strDirectory.IsEmpty()) m_history.ClearPathHistory(); int iWindow = GetID(); bool bOkay = (iWindow == WINDOW_MUSIC_FILES || iWindow == WINDOW_VIDEO_FILES || iWindow == WINDOW_FILES || iWindow == WINDOW_PICTURES || iWindow == WINDOW_PROGRAMS); if (strDirectory.IsEmpty() && bOkay && (m_vecItems->Size() == 0 || !m_guiState->DisableAddSourceButtons())) // add 'add source button' { CStdString strLabel = g_localizeStrings.Get(1026); CFileItem *pItem = new CFileItem(strLabel); pItem->m_strPath = "add"; pItem->SetThumbnailImage("DefaultAddSource.png"); pItem->SetLabel(strLabel); pItem->SetLabelPreformated(true); m_vecItems->Add(pItem); } m_iLastControl = GetFocusedControlID(); // Ask the derived class if it wants to load additional info // for the fileitems like media info or additional // filtering on the items, setting thumbs. OnPrepareFileItems(*m_vecItems); m_vecItems->FillInDefaultIcons(); m_guiState.reset(CGUIViewState::GetViewState(GetID(), *m_vecItems)); FormatAndSort(*m_vecItems); // Ask the devived class if it wants to do custom list operations, // eg. changing the label OnFinalizeFileItems(*m_vecItems); UpdateButtons(); m_viewControl.SetItems(*m_vecItems); strSelectedItem = m_history.GetSelectedItem(m_vecItems->m_strPath); bool bSelectedFound = false; //int iSongInDirectory = -1; for (int i = 0; i < m_vecItems->Size(); ++i) { CFileItem* pItem = m_vecItems->Get(i); // Update selected item if (!bSelectedFound) { CStdString strHistory; GetDirectoryHistoryString(pItem, strHistory); if (strHistory == strSelectedItem) { m_viewControl.SetSelectedItem(i); bSelectedFound = true; } } } // if we haven't found the selected item, select the first item if (!bSelectedFound) m_viewControl.SetSelectedItem(0); m_history.AddPath(m_vecItems->m_strPath); //m_history.DumpPathHistory(); return true; }
bool CCMythDirectory::GetGuideForChannel(const CStdString& base, int ChanNum, CFileItemList &items) { cmyth_database_t db = m_session->GetDatabase(); if(!db) { CLog::Log(LOGERROR, "%s - Could not get database", __FUNCTION__); return false; } time_t now; time(&now); // this sets how many seconds of EPG from now we should grabb time_t end = now + (1 * 24 * 60 * 60); cmyth_program_t *prog = NULL; int count = m_dll->mysql_get_guide(db, &prog, now, end); CLog::Log(LOGDEBUG, "%s - %i entries of guide data", __FUNCTION__, count); if (count <= 0) return false; for (int i = 0; i < count; i++) { if (prog[i].channum == ChanNum) { CStdString path; path.Format("%s%s", base.c_str(), prog[i].title); CDateTime starttime(prog[i].starttime); CDateTime endtime(prog[i].endtime); CStdString title; title.Format("%s - \"%s\"", starttime.GetAsLocalizedDateTime(), prog[i].title); CFileItem *item = new CFileItem(title, false); item->SetLabel(title); item->m_dateTime = starttime; item->SetLabelPreformated(true); CVideoInfoTag* tag = item->GetVideoInfoTag(); tag->m_strAlbum = GetValue(prog[i].callsign); tag->m_strShowTitle = GetValue(prog[i].title); tag->m_strPlotOutline = GetValue(prog[i].subtitle); tag->m_strPlot = GetValue(prog[i].description); tag->m_strGenre = GetValue(prog[i].category); if(tag->m_strPlot.Left(tag->m_strPlotOutline.length()) != tag->m_strPlotOutline && !tag->m_strPlotOutline.IsEmpty()) tag->m_strPlot = tag->m_strPlotOutline + '\n' + tag->m_strPlot; tag->m_strOriginalTitle = tag->m_strShowTitle; tag->m_strTitle = tag->m_strAlbum; if(tag->m_strShowTitle.length() > 0) tag->m_strTitle += " : " + tag->m_strShowTitle; CDateTimeSpan span(endtime.GetDay() - starttime.GetDay(), endtime.GetHour() - starttime.GetHour(), endtime.GetMinute() - starttime.GetMinute(), endtime.GetSecond() - starttime.GetSecond()); StringUtils::SecondsToTimeString( span.GetSeconds() + span.GetMinutes() * 60 + span.GetHours() * 3600, tag->m_strRuntime, TIME_FORMAT_GUESS); tag->m_iSeason = 0; /* set this so xbmc knows it's a tv show */ tag->m_iEpisode = 0; tag->m_strStatus = prog[i].rec_status; items.Add(item); } } m_dll->ref_release(prog); return true; }
CFileItem *CGUIDialogAudioDSPManager::helper_CreateModeListItem(CActiveAEDSPModePtr &ModePointer, AE_DSP_MENUHOOK_CAT &MenuHook, int *ContinuesNo) { CFileItem *pItem = NULL; if (!ContinuesNo) { return pItem; } // start to get Addon and Mode properties const int AddonID = ModePointer->AddonID(); std::string addonName; if (!CServiceBroker::GetADSP().GetAudioDSPAddonName(AddonID, addonName)) { return pItem; } AE_DSP_ADDON addon; if (!CServiceBroker::GetADSP().GetAudioDSPAddon(AddonID, addon)) { return pItem; } std::string modeName = g_localizeStrings.GetAddonString(addon->ID(), ModePointer->ModeName()); std::string description; if (ModePointer->ModeDescription() > -1) { description = g_localizeStrings.GetAddonString(addon->ID(), ModePointer->ModeDescription()); } else { description = g_localizeStrings.Get(15063); } bool isActive = ModePointer->IsEnabled(); int number = ModePointer->ModePosition(); int dialogId = helper_GetDialogId(ModePointer, MenuHook, addon, addonName); // end to get Addon and Mode properties if (isActive) { if (number <= 0) { number = *ContinuesNo; (*ContinuesNo)++; } std::string str = StringUtils::Format("%i:%i:%i:%s", number, AddonID, ModePointer->AddonModeNumber(), ModePointer->AddonModeName().c_str()); pItem = new CFileItem(str); } else { pItem = new CFileItem(modeName); } // set list item properties pItem->SetProperty("ActiveMode", isActive); pItem->SetProperty("Number", number); pItem->SetLabel(modeName); pItem->SetProperty("Description", description); pItem->SetProperty("Help", ModePointer->ModeHelp()); if (ModePointer->IconOwnModePath().empty()) pItem->SetIconImage("DefaultAddonAudioDSP.png"); else pItem->SetIconImage(ModePointer->IconOwnModePath()); pItem->SetProperty("SettingsDialog", dialogId); pItem->SetProperty("AddonId", AddonID); pItem->SetProperty("AddonModeNumber", ModePointer->AddonModeNumber()); pItem->SetLabel2(addonName); pItem->SetProperty("Changed", false); return pItem; }
bool CShoutcastDirectory::ParseStations(TiXmlElement *root, CFileItemList &items, CURL &url) { TiXmlElement *element = NULL; CStdString path; items.m_idepth = 2; /* station list */ element = root->FirstChildElement("tunein"); if(element == NULL) { CLog::Log(LOGWARNING, "%s - No tunein base found", __FUNCTION__); return false; } path = element->Attribute("base"); path.TrimLeft("/"); url.SetFileName(path); element = root->FirstChildElement("station"); if(element == NULL) { CLog::Log(LOGWARNING, "%s - No stations found", __FUNCTION__); return false; } int stations = 0; while(element != NULL && stations < 1000) { CStdString name = element->Attribute("name"); CStdString id = element->Attribute("id"); CStdString bitrate = element->Attribute("br"); CStdString genre = element->Attribute("genre"); CStdString listeners = element->Attribute("lc"); CStdString content = element->Attribute("mt"); CStdString label = name; url.SetOptions("?id=" + id); url.GetURL(path); //printf("%s: %s\n", name.c_str(), path.c_str()); CFileItem* pItem = new CFileItem; pItem->m_bIsFolder = false; /* we highjack the music tag for this stuff, they will be used by */ /* viewstates to sort and display proper information */ pItem->GetMusicInfoTag()->SetArtist(listeners); pItem->GetMusicInfoTag()->SetAlbum(bitrate); pItem->GetMusicInfoTag()->SetGenre(genre); /* this is what will be sorted upon */ pItem->GetVideoInfoTag()->m_fRating = (float)atoi(listeners.c_str()); pItem->m_dwSize = atoi(bitrate.c_str()); pItem->SetLabel(label); /* content type is known before hand, should save later lookup */ /* wonder if we could combine the contentype of the playlist and of the real stream */ pItem->SetContentType("audio/x-scpls"); pItem->m_strPath = path; items.Add(pItem); stations++; element = element->NextSiblingElement("station"); } return true; }
// Allow user to select a Fanart void CGUIWindowVideoInfo::OnGetFanart() { CFileItemList items; // Grab the thumbnails from the web CStdString strPath; CUtil::AddFileToFolder(g_advancedSettings.m_cachePath,"fanartthumbs",strPath); CUtil::WipeDir(strPath); DIRECTORY::CDirectory::Create(strPath); for (unsigned int i = 0; i < m_movieItem->GetVideoInfoTag()->m_fanart.GetNumFanarts(); i++) { CStdString thumbFromWeb; CStdString strLabel; strLabel.Format("fanart_thumb_%i.jpg", i); CUtil::AddFileToFolder(strPath, strLabel, thumbFromWeb); if (m_movieItem->GetVideoInfoTag()->m_fanart.DownloadThumb(i, thumbFromWeb)) { CStdString strItemPath; strItemPath.Format("thumb://FANART_%i",i); CFileItem *item = new CFileItem(strItemPath, false); item->SetThumbnailImage(thumbFromWeb); CStdString strLabel; item->SetLabel(g_localizeStrings.Get(20015)); items.Add(item); } else CLog::Log(LOGDEBUG, "Unable to download fanart thumb #%d", i); } CFileItem *itemNone = new CFileItem("thumb://None", false); itemNone->SetThumbnailImage("defaultVideoBig.png"); itemNone->SetLabel(g_localizeStrings.Get(20018)); items.Add(itemNone); CStdString result; if (!CGUIDialogFileBrowser::ShowAndGetImage(items, g_settings.m_videoSources, g_localizeStrings.Get(20019), result)) return; // user cancelled // delete the thumbnail if that's what the user wants, else overwrite with the // new thumbnail CFileItem item(*m_movieItem->GetVideoInfoTag()); CStdString cachedThumb(item.GetCachedVideoFanart()); if (result.Mid(0,15) == "thumb://FANART_") { CStdString strFile; CUtil::AddFileToFolder(strPath,"fanart_thumb_"+result.Mid(15)+".jpg",strFile); int iFanart = atoi(result.Mid(15).c_str()); if (CFile::Exists(strFile)) { // set new primary fanart, and update our database accordingly m_movieItem->GetVideoInfoTag()->m_fanart.SetPrimaryFanart(iFanart); m_database.SetDetailsForTvShow(m_movieItem->m_strPath, *m_movieItem->GetVideoInfoTag()); // download the fullres fanart image. TODO: FANART - this could take some time, so should probably be backgrounded m_movieItem->GetVideoInfoTag()->m_fanart.DownloadImage(cachedThumb); } else result = "thumb://None"; } else if (CFile::Exists(result)) { // local file CPicture pic; pic.CacheImage(result, cachedThumb); } else result = "thumb://None"; if (result == "thumb://None") { // remove the cached art if (CFile::Exists(cachedThumb)) CFile::Delete(cachedThumb); } CUtil::DeleteVideoDatabaseDirectoryCache(); // to get them new thumbs to show // tell our GUI to completely reload all controls (as some of them // are likely to have had this image in use so will need refreshing) CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_REFRESH_THUMBS); g_graphicsContext.SendMessage(msg); // Update our screen Update(); }
// Get Thumb from user choice. // Options are: // 1. Current thumb // 2. IMDb thumb // 3. Local thumb // 4. No thumb (if no Local thumb is available) void CGUIWindowVideoInfo::OnGetThumb() { CFileItemList items; // Grab the thumbnails from the web CStdString strPath; CUtil::AddFileToFolder(g_advancedSettings.m_cachePath,"imdbthumbs",strPath); CUtil::WipeDir(_P(strPath)); DIRECTORY::CDirectory::Create(strPath); int i=1; for (std::vector<CScraperUrl::SUrlEntry>::iterator iter=m_movieItem->GetVideoInfoTag()->m_strPictureURL.m_url.begin();iter != m_movieItem->GetVideoInfoTag()->m_strPictureURL.m_url.end();++iter) { if (iter->m_type == CScraperUrl::URL_TYPE_SEASON) continue; CStdString thumbFromWeb; CStdString strLabel; strLabel.Format("imdbthumb%i.jpg",i); CUtil::AddFileToFolder(strPath, strLabel, thumbFromWeb); if (CScraperUrl::DownloadThumbnail(thumbFromWeb,*iter)) { CStdString strItemPath; strItemPath.Format("thumb://IMDb%i",i++); CFileItem *item = new CFileItem(strItemPath, false); item->SetThumbnailImage(thumbFromWeb); CStdString strLabel; item->SetLabel(g_localizeStrings.Get(20015)); items.Add(item); } } if (CFile::Exists(m_movieItem->GetThumbnailImage())) { CFileItem *item = new CFileItem("thumb://Current", false); item->SetThumbnailImage(m_movieItem->GetThumbnailImage()); item->SetLabel(g_localizeStrings.Get(20016)); items.Add(item); } CStdString cachedLocalThumb; CStdString localThumb(m_movieItem->GetUserVideoThumb()); if (CFile::Exists(localThumb)) { CUtil::AddFileToFolder(g_advancedSettings.m_cachePath, "localthumb.jpg", cachedLocalThumb); CPicture pic; pic.DoCreateThumbnail(localThumb, cachedLocalThumb); CFileItem *item = new CFileItem("thumb://Local", false); item->SetThumbnailImage(cachedLocalThumb); item->SetLabel(g_localizeStrings.Get(20017)); items.Add(item); } else { // no local thumb exists, so we are just using the IMDb thumb or cached thumb // which is probably the IMDb thumb. These could be wrong, so allow the user // to delete the incorrect thumb CFileItem *item = new CFileItem("thumb://None", false); item->SetThumbnailImage("defaultVideoBig.png"); item->SetLabel(g_localizeStrings.Get(20018)); items.Add(item); } CStdString result; if (!CGUIDialogFileBrowser::ShowAndGetImage(items, g_settings.m_videoSources, g_localizeStrings.Get(20019), result)) return; // user cancelled if (result == "thumb://Current") return; // user chose the one they have // delete the thumbnail if that's what the user wants, else overwrite with the // new thumbnail CFileItem item(*m_movieItem->GetVideoInfoTag()); CStdString cachedThumb(item.GetCachedVideoThumb()); if (result.Mid(0,12) == "thumb://IMDb") { CStdString strFile; CUtil::AddFileToFolder(strPath,"imdbthumb"+result.Mid(12)+".jpg",strFile); if (CFile::Exists(strFile)) CFile::Cache(strFile, cachedThumb); else result = "thumb://None"; } else if (result == "thumb://Local") CFile::Cache(cachedLocalThumb, cachedThumb); else if (CFile::Exists(result)) { CPicture pic; pic.DoCreateThumbnail(result, cachedThumb); } else result = "thumb://None"; if (result == "thumb://None") { // cache the default thumb CPicture pic; pic.CacheSkinImage("defaultVideoBig.png", cachedThumb); } CUtil::DeleteVideoDatabaseDirectoryCache(); // to get them new thumbs to show m_movieItem->SetThumbnailImage(cachedThumb); // tell our GUI to completely reload all controls (as some of them // are likely to have had this image in use so will need refreshing) CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_REFRESH_THUMBS); g_graphicsContext.SendMessage(msg); // Update our screen Update(); }
bool CCMythDirectory::GetRecordings(const CStdString& base, CFileItemList &items) { cmyth_conn_t control = m_session->GetControl(); if(!control) return false; CURL url(base); cmyth_proglist_t list = m_dll->proglist_get_all_recorded(control); if(!list) { CLog::Log(LOGERROR, "%s - unable to get list of recordings", __FUNCTION__); return false; } int count = m_dll->proglist_get_count(list); for(int i=0; i<count; i++) { cmyth_proginfo_t program = m_dll->proglist_get_item(list, i); if(program) { if(GetValue(m_dll->proginfo_recgroup(program)).Equals("LiveTV")) { m_dll->ref_release(program); continue; } CStdString name, path; path = GetValue(m_dll->proginfo_pathname(program)); path = CUtil::GetFileName(path); name = GetValue(m_dll->proginfo_title(program)); CFileItem *item = new CFileItem("", false); m_session->UpdateItem(*item, program); url.SetFileName("recordings/" + path); url.GetURL(item->m_strPath); url.SetFileName("files/" + path + ".png"); url.GetURL(path); item->SetThumbnailImage(path); if(m_dll->proginfo_rec_status(program) != RS_RECORDING) name += " (" + item->m_dateTime.GetAsLocalizedDateTime() + ")"; else { name += " (Recording)"; item->SetThumbnailImage(""); } item->SetLabel(name); items.Add(item); m_dll->ref_release(program); } if (g_guiSettings.GetBool("filelists.ignorethewhensorting")) items.AddSortMethod(SORT_METHOD_LABEL_IGNORE_THE, 551, LABEL_MASKS("%Z (%J)", "%I", "%L", "")); else items.AddSortMethod(SORT_METHOD_LABEL, 551, LABEL_MASKS("%Z (%J)", "%I", "%L", "")); items.AddSortMethod(SORT_METHOD_SIZE, 553, LABEL_MASKS("%Z (%J)", "%I", "%L", "%I")); items.AddSortMethod(SORT_METHOD_DATE, 552, LABEL_MASKS("%Z", "%J %Q", "%L", "%J")); } m_dll->ref_release(list); return true; }
bool CDAVDirectory::GetDirectory(const CStdString& strPath, CFileItemList &items) { CCurlFile dav; CURL url(strPath); CStdString strRequest = "PROPFIND"; dav.SetCustomRequest(strRequest); dav.SetMimeType("text/xml; charset=\"utf-8\""); dav.SetRequestHeader("depth", 1); dav.SetPostData( "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" " <D:propfind xmlns:D=\"DAV:\">" " <D:prop>" " <D:resourcetype/>" " <D:getcontentlength/>" " <D:getlastmodified/>" " <D:creationdate/>" " <D:displayname/>" " </D:prop>" " </D:propfind>"); if (!dav.Open(url)) { CLog::Log(LOGERROR, "%s - Unable to get dav directory (%s)", __FUNCTION__, strPath.c_str()); return false; } CStdString strResponse; dav.ReadData(strResponse); CXBMCTinyXML davResponse; davResponse.Parse(strResponse.c_str()); if (!davResponse.Parse(strResponse)) { CLog::Log(LOGERROR, "%s - Unable to process dav directory (%s)", __FUNCTION__, strPath.c_str()); dav.Close(); return false; } TiXmlNode *pChild; // Iterate over all responses for (pChild = davResponse.RootElement()->FirstChild(); pChild != 0; pChild = pChild->NextSibling()) { if (CDAVCommon::ValueWithoutNamespace(pChild, "response")) { CFileItem item; ParseResponse(pChild->ToElement(), item); CURL url2(strPath); CURL url3(item.GetPath()); CStdString itemPath(URIUtils::AddFileToFolder(url2.GetWithoutFilename(), url3.GetFileName())); if (item.GetLabel().IsEmpty()) { CStdString name(itemPath); URIUtils::RemoveSlashAtEnd(name); CURL::Decode(name); item.SetLabel(URIUtils::GetFileName(name)); } if (item.m_bIsFolder) URIUtils::AddSlashAtEnd(itemPath); // Add back protocol options if (!url2.GetProtocolOptions().IsEmpty()) itemPath += "|" + url2.GetProtocolOptions(); item.SetPath(itemPath); if (!item.GetPath().Equals(strPath)) { CFileItemPtr pItem(new CFileItem(item)); items.Add(pItem); } } } dav.Close(); return true; }
bool CCMythDirectory::GetGuide(const CStdString& base, CFileItemList &items) { CURL url(base); CStdString strPath = url.GetFileName(); std::vector<CStdString> tokens; CStdString Delimiter = "/"; CUtil::Tokenize(strPath, tokens, "/"); if (tokens.size() > 1) return GetGuideForChannel(base, atoi(tokens[1].c_str()), items); else { cmyth_database_t db = m_session->GetDatabase(); if(!db) return false; cmyth_chanlist_t list = m_dll->mysql_get_chanlist(db); if(!list) { CLog::Log(LOGERROR, "%s - unable to get list of channels with url %s", __FUNCTION__, base.c_str()); return false; } CURL url(base); int count = m_dll->chanlist_get_count(list); for(int i = 0; i < count; i++) { cmyth_channel_t channel = m_dll->chanlist_get_item(list, i); if(channel) { CStdString name, path, icon; if(!m_dll->channel_visible(channel)) { m_dll->ref_release(channel); continue; } int num = m_dll->channel_channum(channel); char* str; if((str = m_dll->channel_name(channel))) { name.Format("%d - %s", num, str); m_dll->ref_release(str); } else name.Format("%d"); icon = GetValue(m_dll->channel_icon(channel)); if(num <= 0) { CLog::Log(LOGDEBUG, "%s - Channel '%s' Icon '%s' - Skipped", __FUNCTION__, name.c_str(), icon.c_str()); } else { CLog::Log(LOGDEBUG, "%s - Channel '%s' Icon '%s'", __FUNCTION__, name.c_str(), icon.c_str()); path.Format("guide/%d/", num); url.SetFileName(path); url.GetURL(path); CFileItem *item = new CFileItem(path, true); item->SetLabel(name); item->SetLabelPreformated(true); if(icon.length() > 0) { url.SetFileName("files/channels/" + CUtil::GetFileName(icon)); url.GetURL(icon); item->SetThumbnailImage(icon); } items.Add(item); } m_dll->ref_release(channel); } } m_dll->ref_release(list); return true; } }
// TODO: Currently no support for "embedded thumb" as there is no easy way to grab it // without sending a file that has this as it's album to this class void CGUIWindowMusicInfo::OnGetThumb() { CFileItemList items; // Grab the thumbnail from the web CStdString thumbFromWeb; CUtil::AddFileToFolder(g_advancedSettings.m_cachePath, "allmusicThumb", thumbFromWeb); int iDownloaded=DownloadThumbnail(thumbFromWeb,true); if (iDownloaded > 0) { for (int i=0;i<iDownloaded;++i) { CStdString strThumb; strThumb.Format("thumb://Remote%i",i); CFileItem *item = new CFileItem(strThumb, false); strThumb.Format("%s%i.tbn",thumbFromWeb,i); item->SetThumbnailImage(strThumb); item->SetLabel(g_localizeStrings.Get(20055)); items.Add(item); } } // Current thumb if (CFile::Exists(m_albumItem->GetThumbnailImage())) { CFileItem *item = new CFileItem("thumb://Current", false); item->SetThumbnailImage(m_albumItem->GetThumbnailImage()); item->SetLabel(g_localizeStrings.Get(20016)); items.Add(item); } // local thumb CStdString cachedLocalThumb; CStdString localThumb; if (m_bArtistInfo) { CMusicDatabase database; database.Open(); CStdString strArtistPath; database.GetArtistPath(m_artist.idArtist,strArtistPath); CUtil::AddFileToFolder(strArtistPath,"folder.jpg",localThumb); } else CStdString localThumb = m_albumItem->GetUserMusicThumb(); if (CFile::Exists(localThumb)) { CUtil::AddFileToFolder(g_advancedSettings.m_cachePath, "localthumb.jpg", cachedLocalThumb); CPicture pic; if (pic.DoCreateThumbnail(localThumb, cachedLocalThumb)) { CFileItem *item = new CFileItem("thumb://Local", false); item->SetThumbnailImage(cachedLocalThumb); item->SetLabel(g_localizeStrings.Get(20017)); items.Add(item); } } CFileItem *item = new CFileItem("thumb://None", false); if (m_bArtistInfo) item->SetThumbnailImage("defaultArtistBig.png"); else item->SetThumbnailImage("defaultAlbumCover.png"); item->SetLabel(g_localizeStrings.Get(20018)); items.Add(item); CStdString result; if (!CGUIDialogFileBrowser::ShowAndGetImage(items, g_settings.m_musicSources, g_localizeStrings.Get(1030), result)) return; // user cancelled if (result == "thumb://Current") return; // user chose the one they have // delete the thumbnail if that's what the user wants, else overwrite with the // new thumbnail CStdString cachedThumb; if (m_bArtistInfo) cachedThumb = m_albumItem->GetCachedArtistThumb(); else cachedThumb = CUtil::GetCachedAlbumThumb(m_album.strAlbum, m_album.strArtist); if (result == "thumb://None") { // cache the default thumb CPicture pic; pic.CacheSkinImage("defaultAlbumCover.png", cachedThumb); } else if (result.Left(14).Equals("thumb://Remote")) CFile::Cache(thumbFromWeb+result.Mid(14)+".tbn", cachedThumb); else if (result == "thumb://Local") CFile::Cache(cachedLocalThumb, cachedThumb); else if (CFile::Exists(result)) { CPicture pic; pic.DoCreateThumbnail(result, cachedThumb); } m_albumItem->SetThumbnailImage(cachedThumb); m_hasUpdatedThumb = true; // tell our GUI to completely reload all controls (as some of them // are likely to have had this image in use so will need refreshing) CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_REFRESH_THUMBS); g_graphicsContext.SendMessage(msg); // Update our screen Update(); }
bool CCMythDirectory::GetChannels(const CStdString& base, CFileItemList &items) { cmyth_conn_t control = m_session->GetControl(); if(!control) return false; std::vector<cmyth_proginfo_t> channels; for(unsigned i=0;i<16;i++) { cmyth_recorder_t recorder = m_dll->conn_get_recorder_from_num(control, i); if(!recorder) continue; cmyth_proginfo_t program; program = m_dll->recorder_get_cur_proginfo(recorder); program = m_dll->recorder_get_next_proginfo(recorder, program, BROWSE_DIRECTION_UP); if(!program) { m_dll->ref_release(m_recorder); continue; } long startchan = m_dll->proginfo_chan_id(program); long currchan = -1; while(startchan != currchan) { unsigned j; for(j=0;j<channels.size();j++) { if(m_dll->proginfo_compare(program, channels[j]) == 0) break; } if(j == channels.size()) channels.push_back(program); program = m_dll->recorder_get_next_proginfo(recorder, program, BROWSE_DIRECTION_UP); if(!program) break; currchan = m_dll->proginfo_chan_id(program); } m_dll->ref_release(recorder); } CURL url(base); for(unsigned i=0;i<channels.size();i++) { cmyth_proginfo_t program = channels[i]; CStdString num, progname, channame, icon, sign; num = GetValue(m_dll->proginfo_chanstr (program)); icon = GetValue(m_dll->proginfo_chanicon(program)); CFileItem *item = new CFileItem("", false); m_session->UpdateItem(*item, program); url.SetFileName("channels/" + num + ".ts"); url.GetURL(item->m_strPath); item->SetLabel(GetValue(m_dll->proginfo_chansign(program))); if(icon.length() > 0) { url.SetFileName("files/channels/" + CUtil::GetFileName(icon)); url.GetURL(icon); item->SetThumbnailImage(icon); } /* hack to get sorting working properly when sorting by show title */ if(item->GetVideoInfoTag()->m_strShowTitle.IsEmpty()) item->GetVideoInfoTag()->m_strShowTitle = " "; items.Add(item); m_dll->ref_release(program); } if (g_guiSettings.GetBool("filelists.ignorethewhensorting")) items.AddSortMethod(SORT_METHOD_LABEL_IGNORE_THE, 551, LABEL_MASKS("%K[ - %B]", "%Z", "%L", "")); else items.AddSortMethod(SORT_METHOD_LABEL, 551, LABEL_MASKS("%K[ - %B]", "%Z", "%L", "")); if (g_guiSettings.GetBool("filelists.ignorethewhensorting")) items.AddSortMethod(SORT_METHOD_LABEL_IGNORE_THE, 20364, LABEL_MASKS("%Z", "%B", "%L", "")); else items.AddSortMethod(SORT_METHOD_LABEL, 20364, LABEL_MASKS("%Z", "%B", "%L", "")); return true; }
void CGUIWindowMusicNav::SetThumb(int iItem, CONTEXT_BUTTON button) { CFileItem* pItem = m_vecItems->Get(iItem); CFileItemList items; CStdString picturePath; CStdString strPath=pItem->m_strPath; CStdString strThumb; CStdString cachedThumb; if (button == CONTEXT_BUTTON_SET_ARTIST_THUMB) { long idArtist = -1; if (pItem->IsMusicDb()) { CUtil::RemoveSlashAtEnd(strPath); int nPos=strPath.ReverseFind("/"); if (nPos>-1) { // try to guess where the user should start // browsing for the artist thumb idArtist=atol(strPath.Mid(nPos+1)); } } else if (pItem->IsVideoDb()) idArtist = m_musicdatabase.GetArtistByName(pItem->GetLabel()); m_musicdatabase.GetArtistPath(idArtist, picturePath); cachedThumb = pItem->GetCachedArtistThumb(); CArtist artist; m_musicdatabase.GetArtistInfo(idArtist,artist); int i=1; for (std::vector<CScraperUrl::SUrlEntry>::iterator iter=artist.thumbURL.m_url.begin();iter != artist.thumbURL.m_url.end();++iter) { CStdString thumbFromWeb; CStdString strLabel; strLabel.Format("allmusicthumb%i.jpg",i); CUtil::AddFileToFolder("z:\\", strLabel, thumbFromWeb); if (CScraperUrl::DownloadThumbnail(thumbFromWeb,*iter)) { CStdString strItemPath; strItemPath.Format("thumb://Remote%i",i++); CFileItem *item = new CFileItem(strItemPath, false); item->SetThumbnailImage(thumbFromWeb); CStdString strLabel; item->SetLabel(g_localizeStrings.Get(20015)); items.Add(item); } } } else { strPath = m_vecItems->Get(iItem)->m_strPath; strPath.Replace("plugin://music/","Q:\\plugins\\music\\"); strPath.Replace("/","\\"); picturePath = strPath; CFileItem item(strPath,true); cachedThumb = item.GetCachedProgramThumb(); } if (XFILE::CFile::Exists(cachedThumb)) { CFileItem *item = new CFileItem("thumb://Current", false); item->SetThumbnailImage(cachedThumb); item->SetLabel(g_localizeStrings.Get(20016)); items.Add(item); } if (button == CONTEXT_BUTTON_SET_PLUGIN_THUMB) { if (items.Size() == 0) { CFileItem item2(strPath,false); CUtil::AddFileToFolder(strPath,"default.py",item2.m_strPath); if (XFILE::CFile::Exists(item2.GetCachedProgramThumb())) { CFileItem *item = new CFileItem("thumb://Current", false); item->SetThumbnailImage(item2.GetCachedProgramThumb()); item->SetLabel(g_localizeStrings.Get(20016)); items.Add(item); } } CUtil::AddFileToFolder(strPath,"default.tbn",strThumb); if (XFILE::CFile::Exists(strThumb)) { CFileItem* item = new CFileItem(strThumb,false); item->SetThumbnailImage(strThumb); item->SetLabel(g_localizeStrings.Get(20017)); items.Add(item); } } CUtil::AddFileToFolder(picturePath,"folder.jpg",strThumb); if (XFILE::CFile::Exists(strThumb)) { CFileItem* pItem = new CFileItem(strThumb,false); pItem->SetLabel(g_localizeStrings.Get(20017)); pItem->SetThumbnailImage(strThumb); items.Add(pItem); } CFileItem* nItem = new CFileItem("thumb://None",false); nItem->SetLabel(g_localizeStrings.Get(20018)); if (button == CONTEXT_BUTTON_SET_ARTIST_THUMB) nItem->SetThumbnailImage("DefaultArtistBig.png"); else nItem->SetThumbnailImage("DefaultFolderBig.png"); items.Add(nItem); if (CGUIDialogFileBrowser::ShowAndGetImage(items, g_settings.m_musicSources, g_localizeStrings.Get(20019), picturePath)) { CPicture picture; if (picturePath.Equals("thumb://Current")) return; if (picturePath.Equals("thumb://None")) { XFILE::CFile::Delete(cachedThumb); if (button == CONTEXT_BUTTON_SET_PLUGIN_THUMB) { CPicture picture; picture.CacheSkinImage("DefaultFolderBig.png",cachedThumb); CFileItem item2(strPath,false); CUtil::AddFileToFolder(strPath,"default.py",item2.m_strPath); XFILE::CFile::Delete(item2.GetCachedProgramThumb()); } } else if (button == CONTEXT_BUTTON_SET_PLUGIN_THUMB) XFILE::CFile::Cache(picturePath,cachedThumb); if (picturePath.Equals("thumb://None") || picture.DoCreateThumbnail(items.Get(picturePath)->GetThumbnailImage(), cachedThumb)) { CMusicDatabaseDirectory dir; dir.ClearDirectoryCache(m_vecItems->m_strPath); CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_REFRESH_THUMBS); g_graphicsContext.SendMessage(msg); Update(m_vecItems->m_strPath); } else CLog::Log(LOGERROR, " %s Could not cache artist/plugin thumb: %s", __FUNCTION__, picturePath.c_str()); } }
void CGUIWindowVideoInfo::Update() { CStdString strTmp; strTmp = m_movieItem->GetVideoInfoTag()->m_strTitle; strTmp.Trim(); SetLabel(CONTROL_TITLE, strTmp); strTmp = m_movieItem->GetVideoInfoTag()->m_strDirector; strTmp.Trim(); SetLabel(CONTROL_DIRECTOR, strTmp); strTmp = m_movieItem->GetVideoInfoTag()->m_strStudio; strTmp.Trim(); SetLabel(CONTROL_STUDIO, strTmp); strTmp = m_movieItem->GetVideoInfoTag()->m_strWritingCredits; strTmp.Trim(); SetLabel(CONTROL_CREDITS, strTmp); strTmp = m_movieItem->GetVideoInfoTag()->m_strGenre; strTmp.Trim(); SetLabel(CONTROL_GENRE, strTmp); strTmp = m_movieItem->GetVideoInfoTag()->m_strTagLine; strTmp.Trim(); SetLabel(CONTROL_TAGLINE, strTmp); strTmp = m_movieItem->GetVideoInfoTag()->m_strPlotOutline; strTmp.Trim(); SetLabel(CONTROL_PLOTOUTLINE, strTmp); strTmp = m_movieItem->GetVideoInfoTag()->m_strTrailer; strTmp.Trim(); SetLabel(CONTROL_TRAILER, strTmp); strTmp = m_movieItem->GetVideoInfoTag()->m_strMPAARating; strTmp.Trim(); SetLabel(CONTROL_MPAARATING, strTmp); CStdString strTop250; if (m_movieItem->GetVideoInfoTag()->m_iTop250) strTop250.Format("%i", m_movieItem->GetVideoInfoTag()->m_iTop250); SetLabel(CONTROL_TOP250, strTop250); CStdString strYear; if (m_movieItem->GetVideoInfoTag()->m_iYear) strYear.Format("%i", m_movieItem->GetVideoInfoTag()->m_iYear); else strYear = g_infoManager.GetItemLabel(m_movieItem,LISTITEM_PREMIERED); SetLabel(CONTROL_YEAR, strYear); CStdString strRating_And_Votes; if (m_movieItem->GetVideoInfoTag()->m_fRating != 0.0f) // only non-zero ratings are of interest strRating_And_Votes.Format("%03.1f (%s %s)", m_movieItem->GetVideoInfoTag()->m_fRating, m_movieItem->GetVideoInfoTag()->m_strVotes, g_localizeStrings.Get(20350)); SetLabel(CONTROL_RATING_AND_VOTES, strRating_And_Votes); strTmp = m_movieItem->GetVideoInfoTag()->m_strRuntime; strTmp.Trim(); SetLabel(CONTROL_RUNTIME, strTmp); // setup plot text area strTmp = m_movieItem->GetVideoInfoTag()->m_strPlot; if (!(!m_movieItem->GetVideoInfoTag()->m_strShowTitle.IsEmpty() && m_movieItem->GetVideoInfoTag()->m_iSeason == 0)) // dont apply to tvshows if (m_movieItem->GetVideoInfoTag()->m_playCount == 0 && g_guiSettings.GetBool("videolibrary.hideplots")) strTmp = g_localizeStrings.Get(20370); strTmp.Trim(); SetLabel(CONTROL_TEXTAREA, strTmp); // setup cast list + determine type ClearCastList(); if (!m_movieItem->GetVideoInfoTag()->m_strArtist.IsEmpty()) { // music video CStdStringArray artists; StringUtils::SplitString(m_movieItem->GetVideoInfoTag()->m_strArtist, g_advancedSettings.m_videoItemSeparator, artists); for (std::vector<CStdString>::const_iterator it = artists.begin(); it != artists.end(); ++it) { CFileItem *item = new CFileItem(*it); if (CFile::Exists(item->GetCachedArtistThumb())) item->SetThumbnailImage(item->GetCachedArtistThumb()); item->SetIconImage("DefaultArtist.png"); m_castList->Add(item); } m_castList->SetContent("musicvideos"); } else { // movie/show/episode for (CVideoInfoTag::iCast it = m_movieItem->GetVideoInfoTag()->m_cast.begin(); it != m_movieItem->GetVideoInfoTag()->m_cast.end(); ++it) { CStdString character; if (it->strRole.IsEmpty()) character = it->strName; else character.Format("%s %s %s", it->strName.c_str(), g_localizeStrings.Get(20347).c_str(), it->strRole.c_str()); CFileItem *item = new CFileItem(it->strName); if (CFile::Exists(item->GetCachedActorThumb())) item->SetThumbnailImage(item->GetCachedActorThumb()); item->SetIconImage("DefaultActor.png"); item->SetLabel(character); m_castList->Add(item); } // determine type: if (m_movieItem->m_bIsFolder) m_castList->SetContent("tvshows"); else if (m_movieItem->GetVideoInfoTag()->m_iSeason > -1) m_castList->SetContent("episodes"); else m_castList->SetContent("movies"); } CGUIMessage msg(GUI_MSG_LABEL_BIND, GetID(), CONTROL_LIST, 0, 0, m_castList); OnMessage(msg); if (m_bViewReview) { if (!m_movieItem->GetVideoInfoTag()->m_strArtist.IsEmpty()) { SET_CONTROL_LABEL(CONTROL_BTN_TRACKS, 133); } else { SET_CONTROL_LABEL(CONTROL_BTN_TRACKS, 206); } SET_CONTROL_HIDDEN(CONTROL_LIST); SET_CONTROL_VISIBLE(CONTROL_TEXTAREA); } else { SET_CONTROL_LABEL(CONTROL_BTN_TRACKS, 207); SET_CONTROL_HIDDEN(CONTROL_TEXTAREA); SET_CONTROL_VISIBLE(CONTROL_LIST); } // Check for resumability CGUIWindowVideoFiles *window = (CGUIWindowVideoFiles *)m_gWindowManager.GetWindow(WINDOW_VIDEO_FILES); if (window && window->GetResumeItemOffset(m_movieItem) > 0) { CONTROL_ENABLE(CONTROL_BTN_RESUME); } else { CONTROL_DISABLE(CONTROL_BTN_RESUME); } if (m_movieItem->GetVideoInfoTag()->m_strEpisodeGuide.IsEmpty()) // disable the play button for tv show info { CONTROL_ENABLE(CONTROL_BTN_PLAY) } else { CONTROL_DISABLE(CONTROL_BTN_PLAY) } // update the thumbnail const CGUIControl* pControl = GetControl(CONTROL_IMAGE); if (pControl) { CGUIImage* pImageControl = (CGUIImage*)pControl; pImageControl->FreeResources(); pImageControl->SetFileName(m_movieItem->GetThumbnailImage()); } }
/* * Parses a <response> * * <!ELEMENT response (href, ((href*, status)|(propstat+)), responsedescription?) > * <!ELEMENT propstat (prop, status, responsedescription?) > * */ void CDAVDirectory::ParseResponse(const TiXmlElement *pElement, CFileItem &item) { const TiXmlNode *pResponseChild; const TiXmlNode *pPropstatChild; const TiXmlNode *pPropChild; /* Iterate response children elements */ for (pResponseChild = pElement->FirstChild(); pResponseChild != 0; pResponseChild = pResponseChild->NextSibling()) { if (CDAVCommon::ValueWithoutNamespace(pResponseChild, "href")) { CStdString path(pResponseChild->ToElement()->GetText()); URIUtils::RemoveSlashAtEnd(path); item.SetPath(path); } else if (CDAVCommon::ValueWithoutNamespace(pResponseChild, "propstat")) { if (CDAVCommon::GetStatusTag(pResponseChild->ToElement()) == "HTTP/1.1 200 OK") { /* Iterate propstat children elements */ for (pPropstatChild = pResponseChild->FirstChild(); pPropstatChild != 0; pPropstatChild = pPropstatChild->NextSibling()) { if (CDAVCommon::ValueWithoutNamespace(pPropstatChild, "prop")) { /* Iterate all properties available */ for (pPropChild = pPropstatChild->FirstChild(); pPropChild != 0; pPropChild = pPropChild->NextSibling()) { if (CDAVCommon::ValueWithoutNamespace(pPropChild, "getcontentlength")) { item.m_dwSize = strtoll(pPropChild->ToElement()->GetText(), NULL, 10); } else if (CDAVCommon::ValueWithoutNamespace(pPropChild, "getlastmodified")) { struct tm timeDate = {0}; strptime(pPropChild->ToElement()->GetText(), "%a, %d %b %Y %T", &timeDate); item.m_dateTime = mktime(&timeDate); } else if (CDAVCommon::ValueWithoutNamespace(pPropChild, "displayname")) { item.SetLabel(pPropChild->ToElement()->GetText()); } else if (!item.m_dateTime.IsValid() && CDAVCommon::ValueWithoutNamespace(pPropChild, "creationdate")) { struct tm timeDate = {0}; strptime(pPropChild->ToElement()->GetText(), "%Y-%m-%dT%T", &timeDate); item.m_dateTime = mktime(&timeDate); } else if (CDAVCommon::ValueWithoutNamespace(pPropChild, "resourcetype")) { if (CDAVCommon::ValueWithoutNamespace(pPropChild->FirstChild(), "collection")) { item.m_bIsFolder = true; } } } } } } } } }
bool CDAVDirectory::GetDirectory(const CStdString& strPath, CFileItemList &items) { CFileCurl dav; CURL url(strPath); CStdString strRequest = "PROPFIND"; dav.SetCustomRequest(strRequest); dav.SetMimeType("text/xml; charset=\"utf-8\""); dav.SetRequestHeader("depth", 1); dav.SetPostData( "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" " <D:propfind xmlns:D=\"DAV:\">" " <D:prop>" " <D:resourcetype/>" " <D:getcontentlength/>" " <D:getlastmodified/>" " <D:creationdate/>" " <D:displayname/>" " </D:prop>" " </D:propfind>"); if (!dav.Open(url)) { CLog::Log(LOGERROR, "%s - Unable to get dav directory (%s)", __FUNCTION__, strPath.c_str()); return false; } char buffer[MAX_PATH + 1024]; CStdString strResponse; CStdString strHeader; while (dav.ReadString(buffer, sizeof(buffer))) { if (strstr(buffer, "<D:response") != NULL) { // The header should contain the xml version/utf encoding line // followed by the <multistatus> tag if (strHeader.IsEmpty()) strHeader = strResponse; strResponse = strHeader; } strResponse.append(buffer, strlen(buffer)); if (strstr(buffer, "</D:response") != NULL) { // Close the multistatus tag from the header if (strHeader.Find("<D:multistatus")) strResponse+="</D:multistatus>\n"; TiXmlDocument davResponse; if (!davResponse.Parse(strResponse)) { CLog::Log(LOGERROR, "%s - Unable to process dav directory (%s)", __FUNCTION__, strPath.c_str()); dav.Close(); return false; } TiXmlNode *pChild; // Iterate over all responses for (pChild = davResponse.RootElement()->FirstChild(); pChild != 0; pChild = pChild->NextSibling()) { if (ValueWithoutNamespace(pChild, "response")) { CFileItem item; ParseResponse(pChild->ToElement(), item); CURL url2(strPath); CURL url3(item.m_strPath); URIUtils::AddFileToFolder(url2.GetWithoutFilename(), url3.GetFileName(), item.m_strPath); if (item.GetLabel().IsEmpty()) { CStdString name(item.m_strPath); URIUtils::RemoveSlashAtEnd(name); CURL::Decode(name); item.SetLabel(URIUtils::GetFileName(name)); } if (item.m_bIsFolder) URIUtils::AddSlashAtEnd(item.m_strPath); // Add back protocol options if (!url2.GetProtocolOptions().IsEmpty()) item.m_strPath += "|" + url2.GetProtocolOptions(); if (!item.m_strPath.Equals(strPath)) { CFileItemPtr pItem(new CFileItem(item)); items.Add(pItem); } } } strResponse.clear(); } } dav.Close(); return true; }