void CPlayListM3U::Save(const std::string& strFileName) const { if (!m_vecItems.size()) return; std::string strPlaylist = CUtil::MakeLegalPath(strFileName); CFile file; if (!file.OpenForWrite(strPlaylist,true)) { CLog::Log(LOGERROR, "Could not save M3U playlist: [%s]", strPlaylist.c_str()); return; } std::string strLine = StringUtils::Format("%s\n",M3U_START_MARKER); if (file.Write(strLine.c_str(), strLine.size()) != static_cast<ssize_t>(strLine.size())) return; // error for (int i = 0; i < (int)m_vecItems.size(); ++i) { CFileItemPtr item = m_vecItems[i]; std::string strDescription=item->GetLabel(); g_charsetConverter.utf8ToStringCharset(strDescription); strLine = StringUtils::Format( "%s:%i,%s\n", M3U_INFO_MARKER, item->GetMusicInfoTag()->GetDuration() / 1000, strDescription.c_str() ); if (file.Write(strLine.c_str(), strLine.size()) != static_cast<ssize_t>(strLine.size())) return; // error if (item->m_lStartOffset != 0 || item->m_lEndOffset != 0) { strLine = StringUtils::Format("%s:%i,%i\n", M3U_OFFSET_MARKER, item->m_lStartOffset, item->m_lEndOffset); file.Write(strLine.c_str(),strLine.size()); } std::string strFileName = ResolveURL(item); g_charsetConverter.utf8ToStringCharset(strFileName); strLine = StringUtils::Format("%s\n",strFileName.c_str()); if (file.Write(strLine.c_str(), strLine.size()) != static_cast<ssize_t>(strLine.size())) return; // error } file.Close(); }
bool CGUIWindowMusicBase::OnPlayMedia(int iItem) { CFileItemPtr pItem = m_vecItems->Get(iItem); if (pItem->m_strPath == "add" && pItem->GetLabel() == g_localizeStrings.Get(1026)) // 'add source button' in empty root { if (CGUIDialogMediaSource::ShowAndAddMediaSource("music")) { Update(""); return true; } return false; } // party mode #ifndef _BOXEE_ if (g_partyModeManager.IsEnabled() && !pItem->IsLastFM()) { CPlayList playlistTemp; playlistTemp.Add(pItem); g_partyModeManager.AddUserSongs(playlistTemp, true); return true; } else #endif if (!pItem->IsPlayList() && !pItem->IsInternetStream()) { // single music file - if we get here then we have autoplaynextitem turned off, but we // still want to use the playlist player in order to handle more queued items following etc. g_playlistPlayer.Reset(); g_playlistPlayer.ClearPlaylist(PLAYLIST_MUSIC); g_playlistPlayer.Add(PLAYLIST_MUSIC, pItem); g_playlistPlayer.SetCurrentPlaylist(PLAYLIST_MUSIC); g_playlistPlayer.Play(); return true; } return CGUIMediaWindow::OnPlayMedia(iItem); }
void CGUIWindowPVRSearch::GetContextButtons(int itemNumber, CContextButtons &buttons) const { if (itemNumber < 0 || itemNumber >= m_parent->m_vecItems->Size()) return; CFileItemPtr pItem = m_parent->m_vecItems->Get(itemNumber); if (pItem->GetLabel() != g_localizeStrings.Get(19027)) { if (pItem->GetEPGInfoTag()->EndAsLocalTime() > CDateTime::GetCurrentDateTime()) { if (!pItem->GetEPGInfoTag()->HasTimer()) { if (pItem->GetEPGInfoTag()->StartAsLocalTime() < CDateTime::GetCurrentDateTime()) buttons.Add(CONTEXT_BUTTON_START_RECORD, 264); /* RECORD programme */ else buttons.Add(CONTEXT_BUTTON_START_RECORD, 19061); /* Create a Timer */ } else { if (pItem->GetEPGInfoTag()->StartAsLocalTime() < CDateTime::GetCurrentDateTime()) buttons.Add(CONTEXT_BUTTON_STOP_RECORD, 19059); /* Stop recording */ else buttons.Add(CONTEXT_BUTTON_STOP_RECORD, 19060); /* Delete Timer */ } } buttons.Add(CONTEXT_BUTTON_INFO, 19047); /* Epg info button */ buttons.Add(CONTEXT_BUTTON_SORTBY_CHANNEL, 19062); /* Sort by channel */ buttons.Add(CONTEXT_BUTTON_SORTBY_NAME, 103); /* Sort by Name */ buttons.Add(CONTEXT_BUTTON_SORTBY_DATE, 104); /* Sort by Date */ buttons.Add(CONTEXT_BUTTON_CLEAR, 19232); /* Clear search results */ if (pItem->GetEPGInfoTag()->HasPVRChannel() && g_PVRClients->HasMenuHooks(pItem->GetEPGInfoTag()->ChannelTag()->ClientID())) buttons.Add(CONTEXT_BUTTON_MENU_HOOKS, 19195); /* PVR client specific action */ } }
bool CFileItemHandler::FillFileItemList(const CVariant ¶meterObject, CFileItemList &list) { CAudioLibrary::FillFileItemList(parameterObject, list); CVideoLibrary::FillFileItemList(parameterObject, list); CFileOperations::FillFileItemList(parameterObject, list); CStdString file = parameterObject["file"].asString(); if (!file.empty() && (URIUtils::IsURL(file) || (CFile::Exists(file) && !CDirectory::Exists(file)))) { bool added = false; for (int index = 0; index < list.Size(); index++) { if (list[index]->GetPath() == file) { added = true; break; } } if (!added) { CFileItemPtr item = CFileItemPtr(new CFileItem(file, false)); if (item->IsPicture()) { CPictureInfoTag picture; picture.Load(item->GetPath()); *item->GetPictureInfoTag() = picture; } if (item->GetLabel().IsEmpty()) item->SetLabel(CUtil::GetTitleFromPath(file, false)); list.Add(item); } } return (list.Size() > 0); }
bool CGUIWindowPrograms::OnContextButton(int itemNumber, CONTEXT_BUTTON button) { CFileItemPtr item = (itemNumber >= 0 && itemNumber < m_vecItems->Size()) ? m_vecItems->Get(itemNumber) : CFileItemPtr(); if (item && m_vecItems->IsVirtualDirectoryRoot()) { if (CGUIDialogContextMenu::OnContextButton("programs", item, button)) { Update(""); return true; } } switch (button) { case CONTEXT_BUTTON_RENAME: { CStdString strDescription; CShortcut cut; if (item->IsShortCut()) { cut.Create(item->GetPath()); strDescription = cut.m_strLabel; } else strDescription = item->GetLabel(); if (CGUIDialogKeyboard::ShowAndGetInput(strDescription, g_localizeStrings.Get(16008), false)) { if (item->IsShortCut()) { cut.m_strLabel = strDescription; cut.Save(item->GetPath()); } else { // SetXBEDescription will truncate to 40 characters. //CUtil::SetXBEDescription(item->GetPath(),strDescription); //m_database.SetDescription(item->GetPath(),strDescription); } Update(m_vecItems->GetPath()); } return true; } case CONTEXT_BUTTON_GOTO_ROOT: Update(""); return true; case CONTEXT_BUTTON_LAUNCH: OnClick(itemNumber); return true; case CONTEXT_BUTTON_INFO: OnInfo(itemNumber); return true; default: break; } return CGUIMediaWindow::OnContextButton(itemNumber, button); }
void CGUIWindowVideoNav::OnDeleteItem(CFileItemPtr pItem) { if (m_vecItems->IsParentFolder()) return; if (!m_vecItems->IsVideoDb() && !pItem->IsVideoDb()) { if (!pItem->IsPath("newsmartplaylist://video") && !pItem->IsPath("special://videoplaylists/") && !pItem->IsPath("sources://video/") && !URIUtils::IsProtocol(pItem->GetPath(), "newtag")) CGUIWindowVideoBase::OnDeleteItem(pItem); } else if (StringUtils::StartsWithNoCase(pItem->GetPath(), "videodb://movies/sets/") && pItem->GetPath().size() > 22 && pItem->m_bIsFolder) { CGUIDialogYesNo* pDialog = (CGUIDialogYesNo*)g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO); pDialog->SetHeading(CVariant{432}); std::string strLabel = StringUtils::Format(g_localizeStrings.Get(433).c_str(),pItem->GetLabel().c_str()); pDialog->SetLine(1, CVariant{std::move(strLabel)}); pDialog->SetLine(2, CVariant{""}); pDialog->Open(); if (pDialog->IsConfirmed()) { CFileItemList items; CDirectory::GetDirectory(pItem->GetPath(),items,"",DIR_FLAG_NO_FILE_DIRS); for (int i=0;i<items.Size();++i) OnDeleteItem(items[i]); CVideoDatabaseDirectory dir; CQueryParams params; dir.GetQueryParams(pItem->GetPath(),params); m_database.DeleteSet(params.GetSetId()); } } else if (m_vecItems->GetContent() == "tags" && pItem->m_bIsFolder) { CGUIDialogYesNo* pDialog = (CGUIDialogYesNo*)g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO); pDialog->SetHeading(CVariant{432}); pDialog->SetLine(1, CVariant{ StringUtils::Format(g_localizeStrings.Get(433).c_str(), pItem->GetLabel().c_str()) }); pDialog->SetLine(2, CVariant{""}); pDialog->Open(); if (pDialog->IsConfirmed()) { CVideoDatabaseDirectory dir; CQueryParams params; dir.GetQueryParams(pItem->GetPath(), params); m_database.DeleteTag(params.GetTagId(), (VIDEODB_CONTENT_TYPE)params.GetContentType()); } } else if (m_vecItems->IsPath(CUtil::VideoPlaylistsLocation()) || m_vecItems->IsPath("special://videoplaylists/")) { pItem->m_bIsFolder = false; CFileUtils::DeleteItem(pItem); } else { if (!CGUIDialogVideoInfo::DeleteVideoItem(pItem)) return; } int itemNumber = m_viewControl.GetSelectedItem(); int select = itemNumber >= m_vecItems->Size()-1 ? itemNumber-1 : itemNumber; m_viewControl.SetSelectedItem(select); CUtil::DeleteVideoDatabaseDirectoryCache(); }
bool CRecentlyAddedJob::UpdateVideo() { CGUIWindow* home = g_windowManager.GetWindow(WINDOW_HOME); if ( home == NULL ) return false; CLog::Log(LOGDEBUG, "CRecentlyAddedJob::UpdateVideos() - Running RecentlyAdded home screen update"); int i = 0; CFileItemList items; CVideoDatabase videodatabase; std::string path; CVideoThumbLoader loader; loader.OnLoaderStart(); path = g_advancedSettings.m_recentlyAddedMoviePath; if (g_advancedSettings.m_iVideoLibraryRecentlyAddedUnseen) { CVideoDbUrl url; url.FromString(path); url.AddOption("filter", "{\"type\":\"movies\", \"rules\":[{\"field\":\"playcount\", \"operator\":\"is\", \"value\":\"0\"}]}"); path = url.ToString(); } videodatabase.Open(); if (videodatabase.GetRecentlyAddedMoviesNav(path, items, NUM_ITEMS)) { for (; i < items.Size(); ++i) { CFileItemPtr item = items.Get(i); std::string value = StringUtils::Format("%i", i + 1); std::string strRating = StringUtils::Format("%.1f", item->GetVideoInfoTag()->m_fRating); home->SetProperty("LatestMovie." + value + ".Title" , item->GetLabel()); home->SetProperty("LatestMovie." + value + ".Rating" , strRating); home->SetProperty("LatestMovie." + value + ".Year" , item->GetVideoInfoTag()->m_iYear); home->SetProperty("LatestMovie." + value + ".Plot" , item->GetVideoInfoTag()->m_strPlot); home->SetProperty("LatestMovie." + value + ".RunningTime" , item->GetVideoInfoTag()->GetDuration() / 60); home->SetProperty("LatestMovie." + value + ".Path" , item->GetVideoInfoTag()->m_strFileNameAndPath); home->SetProperty("LatestMovie." + value + ".Trailer" , item->GetVideoInfoTag()->m_strTrailer); if (!item->HasArt("thumb")) loader.LoadItem(item.get()); home->SetProperty("LatestMovie." + value + ".Thumb" , item->GetArt("thumb")); home->SetProperty("LatestMovie." + value + ".Fanart" , item->GetArt("fanart")); } } for (; i < NUM_ITEMS; ++i) { std::string value = StringUtils::Format("%i", i + 1); home->SetProperty("LatestMovie." + value + ".Title" , ""); home->SetProperty("LatestMovie." + value + ".Thumb" , ""); home->SetProperty("LatestMovie." + value + ".Rating" , ""); home->SetProperty("LatestMovie." + value + ".Year" , ""); home->SetProperty("LatestMovie." + value + ".Plot" , ""); home->SetProperty("LatestMovie." + value + ".RunningTime" , ""); home->SetProperty("LatestMovie." + value + ".Path" , ""); home->SetProperty("LatestMovie." + value + ".Trailer" , ""); home->SetProperty("LatestMovie." + value + ".Fanart" , ""); } i = 0; CFileItemList TVShowItems; path = g_advancedSettings.m_recentlyAddedEpisodePath; if (g_advancedSettings.m_iVideoLibraryRecentlyAddedUnseen) { CVideoDbUrl url; url.FromString(path); url.AddOption("filter", "{\"type\":\"episodes\", \"rules\":[{\"field\":\"playcount\", \"operator\":\"is\", \"value\":\"0\"}]}"); path = url.ToString(); } if (videodatabase.GetRecentlyAddedEpisodesNav(path, TVShowItems, NUM_ITEMS)) { for (; i < TVShowItems.Size(); ++i) { CFileItemPtr item = TVShowItems.Get(i); int EpisodeSeason = item->GetVideoInfoTag()->m_iSeason; int EpisodeNumber = item->GetVideoInfoTag()->m_iEpisode; std::string EpisodeNo = StringUtils::Format("s%02de%02d", EpisodeSeason, EpisodeNumber); std::string value = StringUtils::Format("%i", i + 1); std::string strRating = StringUtils::Format("%.1f", item->GetVideoInfoTag()->m_fRating); home->SetProperty("LatestEpisode." + value + ".ShowTitle" , item->GetVideoInfoTag()->m_strShowTitle); home->SetProperty("LatestEpisode." + value + ".EpisodeTitle" , item->GetVideoInfoTag()->m_strTitle); home->SetProperty("LatestEpisode." + value + ".Rating" , strRating); home->SetProperty("LatestEpisode." + value + ".Plot" , item->GetVideoInfoTag()->m_strPlot); home->SetProperty("LatestEpisode." + value + ".EpisodeNo" , EpisodeNo); home->SetProperty("LatestEpisode." + value + ".EpisodeSeason" , EpisodeSeason); home->SetProperty("LatestEpisode." + value + ".EpisodeNumber" , EpisodeNumber); home->SetProperty("LatestEpisode." + value + ".Path" , item->GetVideoInfoTag()->m_strFileNameAndPath); if (!item->HasArt("thumb")) loader.LoadItem(item.get()); std::string seasonThumb; if (item->GetVideoInfoTag()->m_iIdSeason > 0) seasonThumb = videodatabase.GetArtForItem(item->GetVideoInfoTag()->m_iIdSeason, MediaTypeSeason, "thumb"); home->SetProperty("LatestEpisode." + value + ".Thumb" , item->GetArt("thumb")); home->SetProperty("LatestEpisode." + value + ".ShowThumb" , item->GetArt("tvshow.thumb")); home->SetProperty("LatestEpisode." + value + ".SeasonThumb" , seasonThumb); home->SetProperty("LatestEpisode." + value + ".Fanart" , item->GetArt("fanart")); } } for (; i < NUM_ITEMS; ++i) { std::string value = StringUtils::Format("%i", i + 1); home->SetProperty("LatestEpisode." + value + ".ShowTitle" , ""); home->SetProperty("LatestEpisode." + value + ".EpisodeTitle" , ""); home->SetProperty("LatestEpisode." + value + ".Rating" , ""); home->SetProperty("LatestEpisode." + value + ".Plot" , ""); home->SetProperty("LatestEpisode." + value + ".EpisodeNo" , ""); home->SetProperty("LatestEpisode." + value + ".EpisodeSeason" , ""); home->SetProperty("LatestEpisode." + value + ".EpisodeNumber" , ""); home->SetProperty("LatestEpisode." + value + ".Path" , ""); home->SetProperty("LatestEpisode." + value + ".Thumb" , ""); home->SetProperty("LatestEpisode." + value + ".ShowThumb" , ""); home->SetProperty("LatestEpisode." + value + ".SeasonThumb" , ""); home->SetProperty("LatestEpisode." + value + ".Fanart" , ""); } i = 0; CFileItemList MusicVideoItems; path = g_advancedSettings.m_recentlyAddedMusicVideoPath; if (g_advancedSettings.m_iVideoLibraryRecentlyAddedUnseen) { CVideoDbUrl url; url.FromString(path); url.AddOption("filter", "{\"type\":\"musicvideos\", \"rules\":[{\"field\":\"playcount\", \"operator\":\"is\", \"value\":\"0\"}]}"); path = url.ToString(); } if (videodatabase.GetRecentlyAddedMusicVideosNav(path, MusicVideoItems, NUM_ITEMS)) { for (; i < MusicVideoItems.Size(); ++i) { CFileItemPtr item = MusicVideoItems.Get(i); std::string value = StringUtils::Format("%i", i + 1); home->SetProperty("LatestMusicVideo." + value + ".Title" , item->GetLabel()); home->SetProperty("LatestMusicVideo." + value + ".Year" , item->GetVideoInfoTag()->m_iYear); home->SetProperty("LatestMusicVideo." + value + ".Plot" , item->GetVideoInfoTag()->m_strPlot); home->SetProperty("LatestMusicVideo." + value + ".RunningTime" , item->GetVideoInfoTag()->GetDuration() / 60); home->SetProperty("LatestMusicVideo." + value + ".Path" , item->GetVideoInfoTag()->m_strFileNameAndPath); home->SetProperty("LatestMusicVideo." + value + ".Artist" , StringUtils::Join(item->GetVideoInfoTag()->m_artist, g_advancedSettings.m_videoItemSeparator)); if (!item->HasArt("thumb")) loader.LoadItem(item.get()); home->SetProperty("LatestMusicVideo." + value + ".Thumb" , item->GetArt("thumb")); home->SetProperty("LatestMusicVideo." + value + ".Fanart" , item->GetArt("fanart")); } } for (; i < NUM_ITEMS; ++i) { std::string value = StringUtils::Format("%i", i + 1); home->SetProperty("LatestMusicVideo." + value + ".Title" , ""); home->SetProperty("LatestMusicVideo." + value + ".Thumb" , ""); home->SetProperty("LatestMusicVideo." + value + ".Year" , ""); home->SetProperty("LatestMusicVideo." + value + ".Plot" , ""); home->SetProperty("LatestMusicVideo." + value + ".RunningTime" , ""); home->SetProperty("LatestMusicVideo." + value + ".Path" , ""); home->SetProperty("LatestMusicVideo." + value + ".Artist" , ""); home->SetProperty("LatestMusicVideo." + value + ".Fanart" , ""); } videodatabase.Close(); return true; }
bool CRecentlyAddedJob::UpdateVideo() { CGUIWindow* home = g_windowManager.GetWindow(WINDOW_HOME); if ( home == NULL ) return false; CLog::Log(LOGDEBUG, "CRecentlyAddedJob::UpdateVideos() - Running RecentlyAdded home screen update"); int i = 0; CFileItemList items; CVideoDatabase videodatabase; CVideoThumbLoader loader; loader.Initialize(); videodatabase.Open(); if (videodatabase.GetRecentlyAddedMoviesNav("videodb://4/", items, NUM_ITEMS)) { for (; i < items.Size(); ++i) { CFileItemPtr item = items.Get(i); CStdString value; CStdString strRating; value.Format("%i", i + 1); strRating.Format("%.1f", item->GetVideoInfoTag()->m_fRating); home->SetProperty("LatestMovie." + value + ".Title" , item->GetLabel()); home->SetProperty("LatestMovie." + value + ".Rating" , strRating); home->SetProperty("LatestMovie." + value + ".Year" , item->GetVideoInfoTag()->m_iYear); home->SetProperty("LatestMovie." + value + ".Plot" , item->GetVideoInfoTag()->m_strPlot); home->SetProperty("LatestMovie." + value + ".RunningTime" , item->GetVideoInfoTag()->GetDuration() / 60); home->SetProperty("LatestMovie." + value + ".Path" , item->GetVideoInfoTag()->m_strFileNameAndPath); home->SetProperty("LatestMovie." + value + ".Trailer" , item->GetVideoInfoTag()->m_strTrailer); if (!item->HasArt("thumb")) loader.LoadItem(item.get()); home->SetProperty("LatestMovie." + value + ".Thumb" , item->GetArt("thumb")); home->SetProperty("LatestMovie." + value + ".Fanart" , item->GetArt("fanart")); } } for (; i < NUM_ITEMS; ++i) { CStdString value; value.Format("%i", i + 1); home->SetProperty("LatestMovie." + value + ".Title" , ""); home->SetProperty("LatestMovie." + value + ".Thumb" , ""); home->SetProperty("LatestMovie." + value + ".Rating" , ""); home->SetProperty("LatestMovie." + value + ".Year" , ""); home->SetProperty("LatestMovie." + value + ".Plot" , ""); home->SetProperty("LatestMovie." + value + ".RunningTime" , ""); home->SetProperty("LatestMovie." + value + ".Path" , ""); home->SetProperty("LatestMovie." + value + ".Trailer" , ""); home->SetProperty("LatestMovie." + value + ".Fanart" , ""); } i = 0; CFileItemList TVShowItems; if (videodatabase.GetRecentlyAddedEpisodesNav("videodb://5/", TVShowItems, NUM_ITEMS)) { for (; i < TVShowItems.Size(); ++i) { CFileItemPtr item = TVShowItems.Get(i); int EpisodeSeason = item->GetVideoInfoTag()->m_iSeason; int EpisodeNumber = item->GetVideoInfoTag()->m_iEpisode; CStdString EpisodeNo; CStdString value; CStdString strRating; EpisodeNo.Format("s%02de%02d", EpisodeSeason, EpisodeNumber); value.Format("%i", i + 1); strRating.Format("%.1f", item->GetVideoInfoTag()->m_fRating); CFileItem show(item->GetVideoInfoTag()->m_strShowPath, true); home->SetProperty("LatestEpisode." + value + ".ShowTitle" , item->GetVideoInfoTag()->m_strShowTitle); home->SetProperty("LatestEpisode." + value + ".EpisodeTitle" , item->GetVideoInfoTag()->m_strTitle); home->SetProperty("LatestEpisode." + value + ".Rating" , strRating); home->SetProperty("LatestEpisode." + value + ".Plot" , item->GetVideoInfoTag()->m_strPlot); home->SetProperty("LatestEpisode." + value + ".EpisodeNo" , EpisodeNo); home->SetProperty("LatestEpisode." + value + ".EpisodeSeason" , EpisodeSeason); home->SetProperty("LatestEpisode." + value + ".EpisodeNumber" , EpisodeNumber); home->SetProperty("LatestEpisode." + value + ".Path" , item->GetVideoInfoTag()->m_strFileNameAndPath); if (!item->HasArt("thumb")) loader.LoadItem(item.get()); std::string seasonThumb; if (item->GetVideoInfoTag()->m_iIdSeason > 0) seasonThumb = videodatabase.GetArtForItem(item->GetVideoInfoTag()->m_iIdSeason, "season", "thumb"); home->SetProperty("LatestEpisode." + value + ".Thumb" , item->GetArt("thumb")); home->SetProperty("LatestEpisode." + value + ".ShowThumb" , item->GetArt("tvshow.thumb")); home->SetProperty("LatestEpisode." + value + ".SeasonThumb" , seasonThumb); home->SetProperty("LatestEpisode." + value + ".Fanart" , item->GetArt("fanart")); } } for (; i < NUM_ITEMS; ++i) { CStdString value; value.Format("%i", i + 1); home->SetProperty("LatestEpisode." + value + ".ShowTitle" , ""); home->SetProperty("LatestEpisode." + value + ".EpisodeTitle" , ""); home->SetProperty("LatestEpisode." + value + ".Rating" , ""); home->SetProperty("LatestEpisode." + value + ".Plot" , ""); home->SetProperty("LatestEpisode." + value + ".EpisodeNo" , ""); home->SetProperty("LatestEpisode." + value + ".EpisodeSeason" , ""); home->SetProperty("LatestEpisode." + value + ".EpisodeNumber" , ""); home->SetProperty("LatestEpisode." + value + ".Path" , ""); home->SetProperty("LatestEpisode." + value + ".Thumb" , ""); home->SetProperty("LatestEpisode." + value + ".ShowThumb" , ""); home->SetProperty("LatestEpisode." + value + ".SeasonThumb" , ""); home->SetProperty("LatestEpisode." + value + ".Fanart" , ""); } i = 0; CFileItemList MusicVideoItems; if (videodatabase.GetRecentlyAddedMusicVideosNav("videodb://6/", MusicVideoItems, NUM_ITEMS)) { for (; i < MusicVideoItems.Size(); ++i) { CFileItemPtr item = MusicVideoItems.Get(i); CStdString value; value.Format("%i", i + 1); home->SetProperty("LatestMusicVideo." + value + ".Title" , item->GetLabel()); home->SetProperty("LatestMusicVideo." + value + ".Year" , item->GetVideoInfoTag()->m_iYear); home->SetProperty("LatestMusicVideo." + value + ".Plot" , item->GetVideoInfoTag()->m_strPlot); home->SetProperty("LatestMusicVideo." + value + ".RunningTime" , item->GetVideoInfoTag()->GetDuration() / 60); home->SetProperty("LatestMusicVideo." + value + ".Path" , item->GetVideoInfoTag()->m_strFileNameAndPath); home->SetProperty("LatestMusicVideo." + value + ".Artist" , StringUtils::Join(item->GetVideoInfoTag()->m_artist, g_advancedSettings.m_videoItemSeparator)); if (!item->HasArt("thumb")) loader.LoadItem(item.get()); home->SetProperty("LatestMusicVideo." + value + ".Thumb" , item->GetArt("thumb")); home->SetProperty("LatestMusicVideo." + value + ".Fanart" , item->GetArt("fanart")); } } for (; i < NUM_ITEMS; ++i) { CStdString value; value.Format("%i", i + 1); home->SetProperty("LatestMusicVideo." + value + ".Title" , ""); home->SetProperty("LatestMusicVideo." + value + ".Thumb" , ""); home->SetProperty("LatestMusicVideo." + value + ".Year" , ""); home->SetProperty("LatestMusicVideo." + value + ".Plot" , ""); home->SetProperty("LatestMusicVideo." + value + ".RunningTime" , ""); home->SetProperty("LatestMusicVideo." + value + ".Path" , ""); home->SetProperty("LatestMusicVideo." + value + ".Artist" , ""); home->SetProperty("LatestMusicVideo." + value + ".Fanart" , ""); } videodatabase.Close(); return true; }
// \brief With this function you can react on a users click in the list/thumb panel. // It returns true, if the click is handled. // This function calls OnPlayMedia() bool CGUIMediaWindow::OnClick(int iItem) { if ( iItem < 0 || iItem >= (int)m_vecItems->Size() ) return true; CFileItemPtr pItem = m_vecItems->Get(iItem); if (pItem->IsParentFolder()) { GoParentFolder(); return true; } else if (pItem->m_bIsFolder) { if ( pItem->m_bIsShareOrDrive ) { const CStdString& strLockType=m_guiState->GetLockType(); ASSERT(g_settings.m_vecProfiles.size() > 0); if (g_settings.m_vecProfiles[0].getLockMode() != LOCK_MODE_EVERYONE) if (!strLockType.IsEmpty() && !g_passwordManager.IsItemUnlocked(pItem.get(), strLockType)) return true; if (!HaveDiscOrConnection(pItem->m_strPath, pItem->m_iDriveType)) return true; } // remove the directory cache if the folder is not normally cached CFileItemList items(pItem->m_strPath); if (!items.AlwaysCache()) items.RemoveDiscCache(); CFileItem directory(*pItem); if (!Update(directory.m_strPath)) ShowShareErrorMessage(&directory); return true; } else if (pItem->IsPlugin() && pItem->GetProperty("isplayable") != "true") { return DIRECTORY::CPluginDirectory::RunScriptWithParams(pItem->m_strPath); } else { m_iSelectedItem = m_viewControl.GetSelectedItem(); if (pItem->m_strPath == "newplaylist://") { m_vecItems->RemoveDiscCache(); m_gWindowManager.ActivateWindow(WINDOW_MUSIC_PLAYLIST_EDITOR,"newplaylist://"); return true; } else if (pItem->m_strPath.Left(19).Equals("newsmartplaylist://")) { m_vecItems->RemoveDiscCache(); if (CGUIDialogSmartPlaylistEditor::NewPlaylist(pItem->m_strPath.Mid(19))) Update(m_vecItems->m_strPath); return true; } if (m_guiState.get() && m_guiState->AutoPlayNextItem() && !g_partyModeManager.IsEnabled() && !pItem->IsPlayList()) { // TODO: music videos! if (pItem->m_strPath == "add" && pItem->GetLabel() == g_localizeStrings.Get(1026) && m_guiState->GetPlaylist() == PLAYLIST_MUSIC) // 'add source button' in empty root { if (CGUIDialogMediaSource::ShowAndAddMediaSource("music")) { Update(""); return true; } return false; } //play and add current directory to temporary playlist int iPlaylist=m_guiState->GetPlaylist(); if (iPlaylist != PLAYLIST_NONE) { g_playlistPlayer.ClearPlaylist(iPlaylist); g_playlistPlayer.Reset(); int songToPlay = 0; CFileItemList queueItems; for ( int i = 0; i < m_vecItems->Size(); i++ ) { CFileItemPtr item = m_vecItems->Get(i); if (item->m_bIsFolder) continue; if (!item->IsPlayList() && !item->IsZIP() && !item->IsRAR()) queueItems.Add(item); if (item == pItem) { // item that was clicked songToPlay = queueItems.Size() - 1; } } g_playlistPlayer.Add(iPlaylist, queueItems); // Save current window and directory to know where the selected item was if (m_guiState.get()) m_guiState->SetPlaylistDirectory(m_vecItems->m_strPath); // figure out where we start playback if (g_playlistPlayer.IsShuffled(iPlaylist)) { int iIndex = g_playlistPlayer.GetPlaylist(iPlaylist).FindOrder(songToPlay); g_playlistPlayer.GetPlaylist(iPlaylist).Swap(0, iIndex); songToPlay = 0; } // play g_playlistPlayer.SetCurrentPlaylist(iPlaylist); g_playlistPlayer.Play(songToPlay); } return true; } else { return OnPlayMedia(iItem); } } return false; }
void CGUIWindowFileManager::OnClick(int iList, int iItem) { if ( iList < 0 || iList >= 2) return ; if ( iItem < 0 || iItem >= m_vecItems[iList]->Size() ) return ; CFileItemPtr pItem = m_vecItems[iList]->Get(iItem); if (pItem->GetPath() == "add" && pItem->GetLabel() == g_localizeStrings.Get(1026)) // 'add source button' in empty root { if (CGUIDialogMediaSource::ShowAndAddMediaSource("files")) { m_rootDir.SetSources(*CMediaSourceSettings::Get().GetSources("files")); Update(0,m_Directory[0]->GetPath()); Update(1,m_Directory[1]->GetPath()); } return; } if (!pItem->m_bIsFolder && pItem->IsFileFolder(EFILEFOLDER_MASK_ALL)) { XFILE::IFileDirectory *pFileDirectory = NULL; pFileDirectory = XFILE::CFileDirectoryFactory::Create(pItem->GetURL(), pItem.get(), ""); if(pFileDirectory) pItem->m_bIsFolder = true; else if(pItem->m_bIsFolder) pItem->m_bIsFolder = false; delete pFileDirectory; } if (pItem->m_bIsFolder) { // save path + drive type because of the possible refresh CStdString strPath = pItem->GetPath(); int iDriveType = pItem->m_iDriveType; if ( pItem->m_bIsShareOrDrive ) { if ( !g_passwordManager.IsItemUnlocked( pItem.get(), "files" ) ) { Refresh(); return ; } if ( !HaveDiscOrConnection( strPath, iDriveType ) ) return ; } if (!Update(iList, strPath)) ShowShareErrorMessage(pItem.get()); } else if (pItem->IsZIP() || pItem->IsCBZ()) // mount zip archive { CURL pathToUrl = URIUtils::CreateArchivePath("zip", pItem->GetURL(), ""); Update(iList, pathToUrl.Get()); } else if (pItem->IsRAR() || pItem->IsCBR()) { CURL pathToUrl = URIUtils::CreateArchivePath("rar", pItem->GetURL(), ""); Update(iList, pathToUrl.Get()); } else { OnStart(pItem.get()); return ; } // UpdateButtons(); }
void CEdenVideoArtUpdater::Process() { // grab all movies... CVideoDatabase db; if (!db.Open()) return; CFileItemList items; CGUIDialogExtendedProgressBar* dialog = (CGUIDialogExtendedProgressBar*)g_windowManager.GetWindow(WINDOW_DIALOG_EXT_PROGRESS); CGUIDialogProgressBarHandle *handle = dialog->GetHandle(g_localizeStrings.Get(314)); handle->SetTitle(g_localizeStrings.Get(12349)); // movies db.GetMoviesByWhere("videodb://movies/titles/", CDatabase::Filter(), items); for (int i = 0; i < items.Size(); i++) { CFileItemPtr item = items[i]; handle->SetProgress(i, items.Size()); handle->SetText(StringUtils::Format(g_localizeStrings.Get(12350).c_str(), item->GetLabel().c_str())); string cachedThumb = GetCachedVideoThumb(*item); string cachedFanart = GetCachedFanart(*item); item->SetPath(item->GetVideoInfoTag()->m_strFileNameAndPath); item->GetVideoInfoTag()->m_fanart.Unpack(); item->GetVideoInfoTag()->m_strPictureURL.Parse(); map<string, string> artwork; if (!db.GetArtForItem(item->GetVideoInfoTag()->m_iDbId, item->GetVideoInfoTag()->m_type, artwork) || (artwork.size() == 1 && artwork.find("thumb") != artwork.end())) { CStdString art = CVideoInfoScanner::GetImage(item.get(), true, item->GetVideoInfoTag()->m_basePath != item->GetPath(), "thumb"); std::string type; if (CacheTexture(art, cachedThumb, item->GetLabel(), type)) artwork.insert(make_pair(type, art)); art = CVideoInfoScanner::GetFanart(item.get(), true); if (CacheTexture(art, cachedFanart, item->GetLabel())) artwork.insert(make_pair("fanart", art)); if (artwork.empty()) artwork.insert(make_pair("thumb", "")); db.SetArtForItem(item->GetVideoInfoTag()->m_iDbId, item->GetVideoInfoTag()->m_type, artwork); } } items.Clear(); // music videos db.GetMusicVideosNav("videodb://musicvideos/titles/", items, false); for (int i = 0; i < items.Size(); i++) { CFileItemPtr item = items[i]; handle->SetProgress(i, items.Size()); handle->SetText(StringUtils::Format(g_localizeStrings.Get(12350).c_str(), item->GetLabel().c_str())); string cachedThumb = GetCachedVideoThumb(*item); string cachedFanart = GetCachedFanart(*item); item->SetPath(item->GetVideoInfoTag()->m_strFileNameAndPath); item->GetVideoInfoTag()->m_fanart.Unpack(); item->GetVideoInfoTag()->m_strPictureURL.Parse(); map<string, string> artwork; if (!db.GetArtForItem(item->GetVideoInfoTag()->m_iDbId, item->GetVideoInfoTag()->m_type, artwork) || (artwork.size() == 1 && artwork.find("thumb") != artwork.end())) { CStdString art = CVideoInfoScanner::GetImage(item.get(), true, item->GetVideoInfoTag()->m_basePath != item->GetPath(), "thumb"); std::string type; if (CacheTexture(art, cachedThumb, item->GetLabel(), type)) artwork.insert(make_pair(type, art)); art = CVideoInfoScanner::GetFanart(item.get(), true); if (CacheTexture(art, cachedFanart, item->GetLabel())) artwork.insert(make_pair("fanart", art)); if (artwork.empty()) artwork.insert(make_pair("thumb", "")); db.SetArtForItem(item->GetVideoInfoTag()->m_iDbId, item->GetVideoInfoTag()->m_type, artwork); } } items.Clear(); // tvshows // count the number of episodes db.GetTvShowsNav("videodb://tvshows/titles/", items); for (int i = 0; i < items.Size(); i++) { CFileItemPtr item = items[i]; handle->SetText(StringUtils::Format(g_localizeStrings.Get(12350).c_str(), item->GetLabel().c_str())); string cachedThumb = GetCachedVideoThumb(*item); string cachedFanart = GetCachedFanart(*item); item->SetPath(item->GetVideoInfoTag()->m_strPath); item->GetVideoInfoTag()->m_fanart.Unpack(); item->GetVideoInfoTag()->m_strPictureURL.Parse(); map<string, string> artwork; if (!db.GetArtForItem(item->GetVideoInfoTag()->m_iDbId, item->GetVideoInfoTag()->m_type, artwork) || (artwork.size() == 1 && artwork.find("thumb") != artwork.end())) { CStdString art = CVideoInfoScanner::GetImage(item.get(), true, false, "thumb"); std::string type; if (CacheTexture(art, cachedThumb, item->GetLabel(), type)) artwork.insert(make_pair(type, art)); art = CVideoInfoScanner::GetFanart(item.get(), true); if (CacheTexture(art, cachedFanart, item->GetLabel())) artwork.insert(make_pair("fanart", art)); if (artwork.empty()) artwork.insert(make_pair("thumb", "")); db.SetArtForItem(item->GetVideoInfoTag()->m_iDbId, item->GetVideoInfoTag()->m_type, artwork); } // now season art... map<int, map<string, string> > seasons; vector<string> artTypes; artTypes.push_back("thumb"); CVideoInfoScanner::GetSeasonThumbs(*item->GetVideoInfoTag(), seasons, artTypes, true); for (map<int, map<string, string> >::const_iterator j = seasons.begin(); j != seasons.end(); ++j) { if (j->second.empty()) continue; int idSeason = db.AddSeason(item->GetVideoInfoTag()->m_iDbId, j->first); map<string, string> seasonArt; if (idSeason > -1 && !db.GetArtForItem(idSeason, MediaTypeSeason, seasonArt)) { std::string cachedSeason = GetCachedSeasonThumb(j->first, item->GetVideoInfoTag()->m_strPath); std::string type; std::string originalUrl = j->second.begin()->second; if (CacheTexture(originalUrl, cachedSeason, "", type)) db.SetArtForItem(idSeason, MediaTypeSeason, type, originalUrl); } } // now episodes... CFileItemList items2; db.GetEpisodesByWhere("videodb://tvshows/titles/-1/-1/", db.PrepareSQL("episode_view.idShow=%d", item->GetVideoInfoTag()->m_iDbId), items2); for (int j = 0; j < items2.Size(); j++) { handle->SetProgress(j, items2.Size()); CFileItemPtr episode = items2[j]; string cachedThumb = GetCachedEpisodeThumb(*episode); if (!CFile::Exists(cachedThumb)) cachedThumb = GetCachedVideoThumb(*episode); episode->SetPath(episode->GetVideoInfoTag()->m_strFileNameAndPath); episode->GetVideoInfoTag()->m_strPictureURL.Parse(); map<string, string> artwork; if (!db.GetArtForItem(episode->GetVideoInfoTag()->m_iDbId, episode->GetVideoInfoTag()->m_type, artwork) || (artwork.size() == 1 && artwork.find("thumb") != artwork.end())) { CStdString art = CVideoInfoScanner::GetImage(episode.get(), true, episode->GetVideoInfoTag()->m_basePath != episode->GetPath(), "thumb"); if (CacheTexture(art, cachedThumb, episode->GetLabel())) artwork.insert(make_pair("thumb", art)); else artwork.insert(make_pair("thumb", "")); db.SetArtForItem(episode->GetVideoInfoTag()->m_iDbId, episode->GetVideoInfoTag()->m_type, artwork); } } } items.Clear(); // now sets db.GetSetsNav("videodb://movies/sets/", items, VIDEODB_CONTENT_MOVIES); for (int i = 0; i < items.Size(); i++) { CFileItemPtr item = items[i]; handle->SetProgress(i, items.Size()); handle->SetText(StringUtils::Format(g_localizeStrings.Get(12350).c_str(), item->GetLabel().c_str())); map<string, string> artwork; if (!db.GetArtForItem(item->GetVideoInfoTag()->m_iDbId, item->GetVideoInfoTag()->m_type, artwork)) { // grab the first movie from this set CFileItemList items2; db.GetMoviesNav("videodb://movies/titles/", items2, -1, -1, -1, -1, -1, -1, item->GetVideoInfoTag()->m_iDbId); if (items2.Size() > 1) { if (db.GetArtForItem(items2[0]->GetVideoInfoTag()->m_iDbId, items2[0]->GetVideoInfoTag()->m_type, artwork)) db.SetArtForItem(item->GetVideoInfoTag()->m_iDbId, item->GetVideoInfoTag()->m_type, artwork); } } } items.Clear(); // now actors if (CSettings::Get().GetBool("videolibrary.actorthumbs")) { db.GetActorsNav("videodb://movies/titles/", items, VIDEODB_CONTENT_MOVIES); db.GetActorsNav("videodb://tvshows/titles/", items, VIDEODB_CONTENT_TVSHOWS); db.GetActorsNav("videodb://tvshows/titles/", items, VIDEODB_CONTENT_EPISODES); db.GetActorsNav("videodb://musicvideos/titles/", items, VIDEODB_CONTENT_MUSICVIDEOS); for (int i = 0; i < items.Size(); i++) { CFileItemPtr item = items[i]; handle->SetProgress(i, items.Size()); handle->SetText(StringUtils::Format(g_localizeStrings.Get(12350).c_str(), item->GetLabel().c_str())); map<string, string> artwork; if (!db.GetArtForItem(item->GetVideoInfoTag()->m_iDbId, item->GetVideoInfoTag()->m_type, artwork)) { item->GetVideoInfoTag()->m_strPictureURL.Parse(); string cachedThumb = GetCachedActorThumb(*item); string art = CScraperUrl::GetThumbURL(item->GetVideoInfoTag()->m_strPictureURL.GetFirstThumb()); if (CacheTexture(art, cachedThumb, item->GetLabel())) artwork.insert(make_pair("thumb", art)); else artwork.insert(make_pair("thumb", "")); db.SetArtForItem(item->GetVideoInfoTag()->m_iDbId, item->GetVideoInfoTag()->m_type, artwork); } } } handle->MarkFinished(); ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::VideoLibrary, "xbmc", "OnScanFinished"); items.Clear(); }
bool CFileOperationJob::DoProcess(FileAction action, CFileItemList & items, const CStdString& strDestFile, FileOperationList &fileOperations, double &totalTime) { for (int iItem = 0; iItem < items.Size(); ++iItem) { CFileItemPtr pItem = items[iItem]; if (pItem->IsSelected()) { CStdString strNoSlash = pItem->GetPath(); URIUtils::RemoveSlashAtEnd(strNoSlash); CStdString strFileName = URIUtils::GetFileName(strNoSlash); // URL Decode for cases where source uses URL encoding and target does not if ( URIUtils::ProtocolHasEncodedFilename(CURL(pItem->GetPath()).GetProtocol() ) && !URIUtils::ProtocolHasEncodedFilename(CURL(strDestFile).GetProtocol() ) ) CURL::Decode(strFileName); // special case for upnp if (URIUtils::IsUPnP(items.GetPath()) || URIUtils::IsUPnP(pItem->GetPath())) { // get filename from label instead of path strFileName = pItem->GetLabel(); if(!pItem->m_bIsFolder && URIUtils::GetExtension(strFileName).length() == 0) { // FIXME: for now we only work well if the url has the extension // we should map the content type to the extension otherwise strFileName += URIUtils::GetExtension(pItem->GetPath()); } strFileName = CUtil::MakeLegalFileName(strFileName); } CStdString strnewDestFile; if(!strDestFile.IsEmpty()) // only do this if we have a destination { if (URIUtils::HasSlashAtEnd(pItem->GetPath())) URIUtils::AddFileToFolder(strDestFile, strFileName, strnewDestFile); else strnewDestFile = strDestFile; } if (pItem->m_bIsFolder) { // in ActionReplace mode all subdirectories will be removed by the below // DoProcessFolder(ActionDelete) call as well, so ActionCopy is enough when // processing those FileAction subdirAction = (action == ActionReplace) ? ActionCopy : action; // create folder on dest. drive if (action != ActionDelete && action != ActionDeleteFolder) DoProcessFile(ActionCreateFolder, strnewDestFile, "", fileOperations, totalTime); if (action == ActionReplace && CDirectory::Exists(strnewDestFile)) DoProcessFolder(ActionDelete, strnewDestFile, "", fileOperations, totalTime); if (!DoProcessFolder(subdirAction, pItem->GetPath(), strnewDestFile, fileOperations, totalTime)) return false; if (action == ActionDelete || action == ActionDeleteFolder) DoProcessFile(ActionDeleteFolder, pItem->GetPath(), "", fileOperations, totalTime); } else DoProcessFile(action, pItem->GetPath(), strnewDestFile, fileOperations, totalTime); } } return true; }
bool CGUIWindowMusicNav::OnContextButton(int itemNumber, CONTEXT_BUTTON button) { CFileItemPtr item; if (itemNumber >= 0 && itemNumber < m_vecItems->Size()) item = m_vecItems->Get(itemNumber); switch (button) { case CONTEXT_BUTTON_INFO: { if (!item->IsVideoDb()) return CGUIWindowMusicBase::OnContextButton(itemNumber,button); // music videos - artists if (StringUtils::StartsWithNoCase(item->GetPath(), "videodb://musicvideos/artists/")) { long idArtist = m_musicdatabase.GetArtistByName(item->GetLabel()); if (idArtist == -1) return false; std::string path = StringUtils::Format("musicdb://artists/%ld/", idArtist); CArtist artist; m_musicdatabase.GetArtist(idArtist, artist, false); *item = CFileItem(artist); item->SetPath(path); CGUIWindowMusicBase::OnContextButton(itemNumber,button); Refresh(); m_viewControl.SetSelectedItem(itemNumber); return true; } // music videos - albums if (StringUtils::StartsWithNoCase(item->GetPath(), "videodb://musicvideos/albums/")) { long idAlbum = m_musicdatabase.GetAlbumByName(item->GetLabel()); if (idAlbum == -1) return false; std::string path = StringUtils::Format("musicdb://albums/%ld/", idAlbum); CAlbum album; m_musicdatabase.GetAlbum(idAlbum, album, false); *item = CFileItem(path,album); item->SetPath(path); CGUIWindowMusicBase::OnContextButton(itemNumber,button); Refresh(); m_viewControl.SetSelectedItem(itemNumber); return true; } if (item->HasVideoInfoTag() && !item->GetVideoInfoTag()->m_strTitle.empty()) { CGUIDialogVideoInfo::ShowFor(*item); Refresh(); } return true; } case CONTEXT_BUTTON_INFO_ALL: OnItemInfoAll(m_vecItems->GetPath()); return true; case CONTEXT_BUTTON_SET_DEFAULT: CServiceBroker::GetSettings()->SetString(CSettings::SETTING_MYMUSIC_DEFAULTLIBVIEW, GetQuickpathName(item->GetPath())); CServiceBroker::GetSettings()->Save(); return true; case CONTEXT_BUTTON_CLEAR_DEFAULT: CServiceBroker::GetSettings()->SetString(CSettings::SETTING_MYMUSIC_DEFAULTLIBVIEW, ""); CServiceBroker::GetSettings()->Save(); return true; case CONTEXT_BUTTON_GO_TO_ARTIST: { std::string strPath; CVideoDatabase database; database.Open(); strPath = StringUtils::Format("videodb://musicvideos/artists/%i/", database.GetMatchingMusicVideo(item->GetMusicInfoTag()->GetArtistString())); CServiceBroker::GetGUI()->GetWindowManager().ActivateWindow(WINDOW_VIDEO_NAV,strPath); return true; } case CONTEXT_BUTTON_PLAY_OTHER: { CVideoDatabase database; database.Open(); CVideoInfoTag details; database.GetMusicVideoInfo("", details, database.GetMatchingMusicVideo(item->GetMusicInfoTag()->GetArtistString(), item->GetMusicInfoTag()->GetAlbum(), item->GetMusicInfoTag()->GetTitle())); CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_PLAY, 0, 0, static_cast<void*>(new CFileItem(details))); return true; } case CONTEXT_BUTTON_RENAME: if (!item->IsVideoDb() && !item->IsReadOnly()) OnRenameItem(itemNumber); CGUIDialogVideoInfo::UpdateVideoItemTitle(item); CUtil::DeleteVideoDatabaseDirectoryCache(); Refresh(); return true; case CONTEXT_BUTTON_DELETE: if (item->IsPlayList() || item->IsSmartPlayList()) { item->m_bIsFolder = false; CGUIComponent *gui = CServiceBroker::GetGUI(); if (gui && gui->ConfirmDelete(item->GetPath())) CFileUtils::DeleteItem(item); } else if (!item->IsVideoDb()) OnDeleteItem(itemNumber); else { CGUIDialogVideoInfo::DeleteVideoItemFromDatabase(item); CUtil::DeleteVideoDatabaseDirectoryCache(); } Refresh(); return true; case CONTEXT_BUTTON_SET_CONTENT: return ManageInfoProvider(item); default: break; } return CGUIWindowMusicBase::OnContextButton(itemNumber, button); }
void CGUIWindowVideoNav::OnDeleteItem(CFileItemPtr pItem) { if (m_vecItems->IsParentFolder()) return; if (m_vecItems->m_strPath.Equals("special://videoplaylists/")) { if (!pItem->m_strPath.Equals("newsmartplaylist://video")) CGUIWindowVideoBase::OnDeleteItem(pItem); } else if (pItem->m_strPath.Left(14).Equals("videodb://1/7/") && pItem->m_strPath.size() > 14 && pItem->m_bIsFolder) { CGUIDialogYesNo* pDialog = (CGUIDialogYesNo*)g_windowManager.GetWindow(WINDOW_DIALOG_YES_NO); pDialog->SetLine(0, g_localizeStrings.Get(432)); CStdString strLabel; strLabel.Format(g_localizeStrings.Get(433),pItem->GetLabel()); pDialog->SetLine(1, strLabel); pDialog->SetLine(2, "");; pDialog->DoModal(); if (pDialog->IsConfirmed()) { CFileItemList items; CDirectory::GetDirectory(pItem->m_strPath,items,"",false,false,DIR_CACHE_ONCE,true,true); for (int i=0;i<items.Size();++i) OnDeleteItem(items[i]); CVideoDatabaseDirectory dir; CQueryParams params; dir.GetQueryParams(pItem->m_strPath,params); m_database.DeleteSet(params.GetSetId()); } } else { if (!DeleteItem(pItem.get())) return; CStdString strDeletePath; if (pItem->m_bIsFolder) strDeletePath=pItem->GetVideoInfoTag()->m_strPath; else strDeletePath=pItem->GetVideoInfoTag()->m_strFileNameAndPath; if (CUtil::GetFileName(strDeletePath).Equals("VIDEO_TS.IFO")) { CUtil::GetDirectory(strDeletePath.Mid(0),strDeletePath); if (strDeletePath.Right(9).Equals("VIDEO_TS/")) { CUtil::RemoveSlashAtEnd(strDeletePath); CUtil::GetDirectory(strDeletePath.Mid(0),strDeletePath); } } if (CUtil::HasSlashAtEnd(strDeletePath)) pItem->m_bIsFolder=true; if (g_guiSettings.GetBool("filelists.allowfiledeletion") && CUtil::SupportsFileOperations(strDeletePath)) { pItem->m_strPath = strDeletePath; CGUIWindowVideoBase::OnDeleteItem(pItem); } } CUtil::DeleteVideoDatabaseDirectoryCache(); DisplayEmptyDatabaseMessage(!m_database.HasContent()); }
bool CGUIWindowMusicNav::OnContextButton(int itemNumber, CONTEXT_BUTTON button) { CFileItemPtr item; if (itemNumber >= 0 && itemNumber < m_vecItems->Size()) item = m_vecItems->Get(itemNumber); switch (button) { case CONTEXT_BUTTON_INFO: { if (!item->IsVideoDb()) return CGUIWindowMusicBase::OnContextButton(itemNumber,button); // music videos - artists if (StringUtils::StartsWithNoCase(item->GetPath(), "videodb://musicvideos/artists/")) { long idArtist = m_musicdatabase.GetArtistByName(item->GetLabel()); if (idArtist == -1) return false; std::string path = StringUtils::Format("musicdb://artists/%ld/", idArtist); CArtist artist; m_musicdatabase.GetArtist(idArtist, artist, false); *item = CFileItem(artist); item->SetPath(path); CGUIWindowMusicBase::OnContextButton(itemNumber,button); Refresh(); m_viewControl.SetSelectedItem(itemNumber); return true; } // music videos - albums if (StringUtils::StartsWithNoCase(item->GetPath(), "videodb://musicvideos/albums/")) { long idAlbum = m_musicdatabase.GetAlbumByName(item->GetLabel()); if (idAlbum == -1) return false; std::string path = StringUtils::Format("musicdb://albums/%ld/", idAlbum); CAlbum album; m_musicdatabase.GetAlbum(idAlbum, album, false); *item = CFileItem(path,album); item->SetPath(path); CGUIWindowMusicBase::OnContextButton(itemNumber,button); Refresh(); m_viewControl.SetSelectedItem(itemNumber); return true; } if (item->HasVideoInfoTag() && !item->GetVideoInfoTag()->m_strTitle.empty()) { CGUIDialogVideoInfo::ShowFor(*item); Refresh(); } return true; } case CONTEXT_BUTTON_INFO_ALL: OnItemInfoAll(itemNumber); return true; case CONTEXT_BUTTON_SET_DEFAULT: CSettings::GetInstance().SetString(CSettings::SETTING_MYMUSIC_DEFAULTLIBVIEW, GetQuickpathName(item->GetPath())); CSettings::GetInstance().Save(); return true; case CONTEXT_BUTTON_CLEAR_DEFAULT: CSettings::GetInstance().SetString(CSettings::SETTING_MYMUSIC_DEFAULTLIBVIEW, ""); CSettings::GetInstance().Save(); return true; case CONTEXT_BUTTON_GO_TO_ARTIST: { std::string strPath; CVideoDatabase database; database.Open(); strPath = StringUtils::Format("videodb://musicvideos/artists/%i/", database.GetMatchingMusicVideo(item->GetMusicInfoTag()->GetArtistString())); g_windowManager.ActivateWindow(WINDOW_VIDEO_NAV,strPath); return true; } case CONTEXT_BUTTON_PLAY_OTHER: { CVideoDatabase database; database.Open(); CVideoInfoTag details; database.GetMusicVideoInfo("", details, database.GetMatchingMusicVideo(item->GetMusicInfoTag()->GetArtistString(), item->GetMusicInfoTag()->GetAlbum(), item->GetMusicInfoTag()->GetTitle())); CApplicationMessenger::GetInstance().PostMsg(TMSG_MEDIA_PLAY, 0, 0, static_cast<void*>(new CFileItem(details))); return true; } case CONTEXT_BUTTON_RENAME: if (!item->IsVideoDb() && !item->IsReadOnly()) OnRenameItem(itemNumber); CGUIDialogVideoInfo::UpdateVideoItemTitle(item); CUtil::DeleteVideoDatabaseDirectoryCache(); Refresh(); return true; case CONTEXT_BUTTON_DELETE: if (item->IsPlayList() || item->IsSmartPlayList()) { item->m_bIsFolder = false; CFileUtils::DeleteItem(item); } else if (!item->IsVideoDb()) OnDeleteItem(itemNumber); else { CGUIDialogVideoInfo::DeleteVideoItemFromDatabase(item); CUtil::DeleteVideoDatabaseDirectoryCache(); } Refresh(); return true; case CONTEXT_BUTTON_SET_CONTENT: { ADDON::ScraperPtr scraper; std::string path(item->GetPath()); CQueryParams params; CDirectoryNode::GetDatabaseInfo(item->GetPath(), params); CONTENT_TYPE content = CONTENT_ALBUMS; if (params.GetAlbumId() != -1) path = StringUtils::Format("musicdb://albums/%li/",params.GetAlbumId()); else if (params.GetArtistId() != -1) { path = StringUtils::Format("musicdb://artists/%li/",params.GetArtistId()); content = CONTENT_ARTISTS; } if (m_vecItems->IsPath("musicdb://genres/") || item->IsPath("musicdb://artists/")) { content = CONTENT_ARTISTS; } if (!m_musicdatabase.GetScraperForPath(path, scraper, ADDON::ScraperTypeFromContent(content))) { ADDON::AddonPtr defaultScraper; if (ADDON::CAddonMgr::GetInstance().GetDefault(ADDON::ScraperTypeFromContent(content), defaultScraper)) { scraper = std::dynamic_pointer_cast<ADDON::CScraper>(defaultScraper); } } if (CGUIDialogContentSettings::Show(scraper, content)) { m_musicdatabase.SetScraperForPath(path,scraper); if (CGUIDialogYesNo::ShowAndGetInput(CVariant{20442}, CVariant{20443})) { OnItemInfoAll(itemNumber,true,true); } } return true; } default: break; } return CGUIWindowMusicBase::OnContextButton(itemNumber, button); }
bool CPlexDirectory::GetDirectory(const CStdString& strPath, CFileItemList &items) { CStdString strRoot = strPath; if (CUtil::HasSlashAtEnd(strRoot) && strRoot != "plex://") strRoot.Delete(strRoot.size() - 1); strRoot.Replace(" ", "%20"); // Start the download thread running. printf("PlexDirectory::GetDirectory(%s)\n", strRoot.c_str()); m_url = strRoot; CThread::Create(false, 0); // Now display progress, look for cancel. CGUIDialogProgress* dlgProgress = 0; int time = GetTickCount(); while (m_downloadEvent.WaitMSec(100) == false) { // If enough time has passed, display the dialog. if (GetTickCount() - time > 1000 && m_allowPrompting == true) { dlgProgress = (CGUIDialogProgress*)m_gWindowManager.GetWindow(WINDOW_DIALOG_PROGRESS); if (dlgProgress) { dlgProgress->ShowProgressBar(false); dlgProgress->SetHeading(40203); dlgProgress->SetLine(0, 40204); dlgProgress->SetLine(1, ""); dlgProgress->SetLine(2, ""); dlgProgress->StartModal(); } } if (dlgProgress) { dlgProgress->Progress(); if (dlgProgress->IsCanceled()) { items.m_wasListingCancelled = true; m_http.Cancel(); StopThread(); } } } if (dlgProgress) dlgProgress->Close(); // Wait for the thread to exit. WaitForThreadExit(INFINITE); // See if we suceeded. if (m_bSuccess == false) return false; // See if we're supposed to parse the results or not. if (m_bParseResults == false) return true; // Parse returned xml. TiXmlDocument doc; doc.Parse(m_data.c_str()); TiXmlElement* root = doc.RootElement(); if (root == 0) { CLog::Log(LOGERROR, "%s - Unable to parse XML\n%s", __FUNCTION__, m_data.c_str()); return false; } // Get the fanart. const char* fanart = root->Attribute("art"); string strFanart; if (fanart && strlen(fanart) > 0) strFanart = ProcessUrl(strPath, fanart, false); // Walk the parsed tree. string strFileLabel = "%N - %T"; string strDirLabel = "%B"; string strSecondDirLabel = "%Y"; Parse(m_url, root, items, strFileLabel, strDirLabel, strSecondDirLabel); // Set the window titles const char* title1 = root->Attribute("title1"); const char* title2 = root->Attribute("title2"); if (title1 && strlen(title1) > 0) items.SetFirstTitle(title1); if (title2 && strlen(title2) > 0) items.SetSecondTitle(title2); // Set fanart on items if they don't have their own. for (int i=0; i<items.Size(); i++) { CFileItemPtr pItem = items[i]; if (strFanart.size() > 0 && pItem->GetQuickFanart().size() == 0) pItem->SetQuickFanart(strFanart); // Make sure sort label is lower case. string sortLabel = pItem->GetLabel(); boost::to_lower(sortLabel); pItem->SetSortLabel(sortLabel); } // Set fanart on directory. if (strFanart.size() > 0) items.SetQuickFanart(strFanart); // Set the view mode. const char* viewmode = root->Attribute("viewmode"); if (viewmode && strlen(viewmode) > 0) { CGUIViewState* viewState = CGUIViewState::GetViewState(0, items); viewState->SaveViewAsControl(atoi(viewmode)); } // Override labels. const char* fileLabel = root->Attribute("filelabel"); if (fileLabel && strlen(fileLabel) > 0) strFileLabel = fileLabel; const char* dirLabel = root->Attribute("dirlabel"); if (dirLabel && strlen(dirLabel) > 0) strDirLabel = dirLabel; // Add the sort method. items.AddSortMethod(SORT_METHOD_NONE, 552, LABEL_MASKS(strFileLabel, "%D", strDirLabel, strSecondDirLabel)); // Set the content label. const char* content = root->Attribute("content"); if (content && strlen(content) > 0) { items.SetContent(content); } // Check for dialog message attributes CStdString strMessage = ""; const char* header = root->Attribute("header"); if (header && strlen(header) > 0) { const char* message = root->Attribute("message"); if (message && strlen(message) > 0) strMessage = message; items.m_displayMessage = true; items.m_displayMessageTitle = header; items.m_displayMessageContents = root->Attribute("message"); // Don't cache these. m_dirCacheType = DIR_CACHE_NEVER; } // See if this directory replaces the parent. const char* replace = root->Attribute("replaceParent"); if (replace && strcmp(replace, "1") == 0) items.SetReplaceListing(true); // See if we're saving this into the history or not. const char* noHistory = root->Attribute("noHistory"); if (noHistory && strcmp(noHistory, "1") == 0) items.SetSaveInHistory(false); // See if we're not supposed to cache this directory. const char* noCache = root->Attribute("nocache"); if (noCache && strcmp(noCache, "1") == 0) m_dirCacheType = DIR_CACHE_NEVER; return true; }
bool CGUIWindowMusicNav::OnContextButton(int itemNumber, CONTEXT_BUTTON button) { CFileItemPtr item; if (itemNumber >= 0 && itemNumber < m_vecItems->Size()) item = m_vecItems->Get(itemNumber); switch (button) { case CONTEXT_BUTTON_INFO: { if (!item->IsVideoDb()) return CGUIWindowMusicBase::OnContextButton(itemNumber,button); // music videos - artists if (StringUtils::StartsWithNoCase(item->GetPath(), "videodb://musicvideos/artists/")) { long idArtist = m_musicdatabase.GetArtistByName(item->GetLabel()); if (idArtist == -1) return false; CStdString path = StringUtils::Format("musicdb://artists/%ld/", idArtist); CArtist artist; m_musicdatabase.GetArtistInfo(idArtist,artist,false); *item = CFileItem(artist); item->SetPath(path); CGUIWindowMusicBase::OnContextButton(itemNumber,button); Refresh(); m_viewControl.SetSelectedItem(itemNumber); return true; } // music videos - albums if (StringUtils::StartsWithNoCase(item->GetPath(), "videodb://musicvideos/albums/")) { long idAlbum = m_musicdatabase.GetAlbumByName(item->GetLabel()); if (idAlbum == -1) return false; CStdString path = StringUtils::Format("musicdb://albums/%ld/", idAlbum); CAlbum album; m_musicdatabase.GetAlbumInfo(idAlbum,album,NULL); *item = CFileItem(path,album); item->SetPath(path); CGUIWindowMusicBase::OnContextButton(itemNumber,button); Refresh(); m_viewControl.SetSelectedItem(itemNumber); return true; } if (item->HasVideoInfoTag() && !item->GetVideoInfoTag()->m_strTitle.empty()) { CGUIWindowVideoNav* pWindow = (CGUIWindowVideoNav*)g_windowManager.GetWindow(WINDOW_VIDEO_NAV); if (pWindow) { ADDON::ScraperPtr info; pWindow->OnInfo(item.get(),info); Refresh(); } } return true; } case CONTEXT_BUTTON_INFO_ALL: OnInfoAll(itemNumber); return true; case CONTEXT_BUTTON_SET_DEFAULT: CSettings::Get().SetString("mymusic.defaultlibview", GetQuickpathName(item->GetPath())); CSettings::Get().Save(); return true; case CONTEXT_BUTTON_CLEAR_DEFAULT: CSettings::Get().SetString("mymusic.defaultlibview", ""); CSettings::Get().Save(); return true; case CONTEXT_BUTTON_GO_TO_ARTIST: { CStdString strPath; CVideoDatabase database; database.Open(); strPath = StringUtils::Format("videodb://musicvideos/artists/%ld/", database.GetMatchingMusicVideo(StringUtils::Join(item->GetMusicInfoTag()->GetArtist(), g_advancedSettings.m_musicItemSeparator))); g_windowManager.ActivateWindow(WINDOW_VIDEO_NAV,strPath); return true; } case CONTEXT_BUTTON_PLAY_OTHER: { CVideoDatabase database; database.Open(); CVideoInfoTag details; database.GetMusicVideoInfo("",details,database.GetMatchingMusicVideo(StringUtils::Join(item->GetMusicInfoTag()->GetArtist(), g_advancedSettings.m_musicItemSeparator),item->GetMusicInfoTag()->GetAlbum(),item->GetMusicInfoTag()->GetTitle())); CApplicationMessenger::Get().PlayFile(CFileItem(details)); return true; } case CONTEXT_BUTTON_MARK_WATCHED: CGUIDialogVideoInfo::MarkWatched(item, true); CUtil::DeleteVideoDatabaseDirectoryCache(); Refresh(); return true; case CONTEXT_BUTTON_MARK_UNWATCHED: CGUIDialogVideoInfo::MarkWatched(item, false); CUtil::DeleteVideoDatabaseDirectoryCache(); Refresh(); return true; case CONTEXT_BUTTON_RENAME: CGUIDialogVideoInfo::UpdateVideoItemTitle(item); CUtil::DeleteVideoDatabaseDirectoryCache(); Refresh(); return true; case CONTEXT_BUTTON_DELETE: if (item->IsPlayList() || item->IsSmartPlayList()) { item->m_bIsFolder = false; CFileUtils::DeleteItem(item); } else { CGUIDialogVideoInfo::DeleteVideoItemFromDatabase(item); CUtil::DeleteVideoDatabaseDirectoryCache(); } Refresh(); return true; case CONTEXT_BUTTON_SET_CONTENT: { ADDON::ScraperPtr scraper; CStdString path(item->GetPath()); CQueryParams params; CDirectoryNode::GetDatabaseInfo(item->GetPath(), params); CONTENT_TYPE content = CONTENT_ALBUMS; if (params.GetAlbumId() != -1) path = StringUtils::Format("musicdb://albums/%i/",params.GetAlbumId()); else if (params.GetArtistId() != -1) { path = StringUtils::Format("musicdb://artists/%i/",params.GetArtistId()); content = CONTENT_ARTISTS; } if (m_vecItems->GetPath().Equals("musicdb://genres/") || item->GetPath().Equals("musicdb://artists/")) { content = CONTENT_ARTISTS; } if (!m_musicdatabase.GetScraperForPath(path, scraper, ADDON::ScraperTypeFromContent(content))) { ADDON::AddonPtr defaultScraper; if (ADDON::CAddonMgr::Get().GetDefault(ADDON::ScraperTypeFromContent(content), defaultScraper)) { scraper = boost::dynamic_pointer_cast<ADDON::CScraper>(defaultScraper->Clone()); } } if (CGUIDialogContentSettings::Show(scraper, content)) { m_musicdatabase.SetScraperForPath(path,scraper); if (CGUIDialogYesNo::ShowAndGetInput(20442,20443,20444,20022)) { OnInfoAll(itemNumber,true,true); } } return true; } default: break; } return CGUIWindowMusicBase::OnContextButton(itemNumber, button); }
void CGUIDialogSubtitles::OnDownloadComplete(const CFileItemList *items, const std::string &language) { if (items->IsEmpty()) { CFileItemPtr service = GetService(); if (service) CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Error, service->GetLabel(), g_localizeStrings.Get(24113)); UpdateStatus(SEARCH_COMPLETE); return; } CStdString strFileName; CStdString strDestPath; #if 0 // TODO: Code to download all subtitles for all stack items in one run if (g_application.CurrentFileItem().IsStack()) { for (int i = 0; i < items->Size(); i++) { // check for all stack items and match to given subs, item [0] == CD1, item [1] == CD2 // CLog::Log(LOGDEBUG, "Stack Subs [%s} Found", vecItems[i]->GetLabel().c_str()); } } #endif // Get (unstacked) path const CStdString &strCurrentFile = g_application.CurrentUnstackedItem().GetPath(); if (StringUtils::StartsWith(strCurrentFile, "http://")) { strFileName = "TemporarySubs"; strDestPath = "special://temp/"; } else { strFileName = URIUtils::GetFileName(strCurrentFile); if (CSettings::Get().GetBool("subtitles.savetomoviefolder")) { strDestPath = URIUtils::GetDirectory(strCurrentFile); if (!CUtil::SupportsWriteFileOperations(strDestPath)) strDestPath.clear(); } if (strDestPath.empty()) { if (CSpecialProtocol::TranslatePath("special://subtitles").empty()) strDestPath = "special://temp"; else strDestPath = "special://subtitles"; } } // Extract the language and appropriate extension CStdString strSubLang; g_LangCodeExpander.ConvertToTwoCharCode(strSubLang, language); CStdString strUrl = items->Get(0)->GetPath(); CStdString strSubExt = URIUtils::GetExtension(strUrl); // construct subtitle path URIUtils::RemoveExtension(strFileName); CStdString strSubName = StringUtils::Format("%s.%s%s", strFileName.c_str(), strSubLang.c_str(), strSubExt.c_str()); CStdString strSubPath = URIUtils::AddFileToFolder(strDestPath, strSubName); // and copy the file across CFile::Cache(strUrl, strSubPath); // for ".sub" subtitles we check if ".idx" counterpart exists and copy that as well if (strSubExt.Equals(".sub")) { strUrl = URIUtils::ReplaceExtension(strUrl, ".idx"); if(CFile::Exists(strUrl)) { CStdString strSubNameIdx = StringUtils::Format("%s.%s.idx", strFileName.c_str(), strSubLang.c_str()); strSubPath = URIUtils::AddFileToFolder(strDestPath, strSubNameIdx); CFile::Cache(strUrl, strSubPath); } } SetSubtitles(strSubPath); // Close the window Close(); }
void CAnnouncementManager::Announce(AnnouncementFlag flag, const char *sender, const char *message, CFileItemPtr item, CVariant &data) { if (!item.get()) { Announce(flag, sender, message, data); return; } // Extract db id of item CVariant object = data.isNull() || data.isObject() ? data : CVariant::VariantTypeObject; CStdString type; int id = 0; if(item->HasPVRChannelInfoTag()) { const PVR::CPVRChannel *channel = item->GetPVRChannelInfoTag(); id = channel->ChannelID(); type = "channel"; object["item"]["title"] = channel->ChannelName(); object["item"]["channeltype"] = channel->IsRadio() ? "radio" : "tv"; if (data.isMember("player") && data["player"].isMember("playerid")) object["player"]["playerid"] = channel->IsRadio() ? PLAYLIST_MUSIC : PLAYLIST_VIDEO; } else if (item->HasVideoInfoTag()) { id = item->GetVideoInfoTag()->m_iDbId; // TODO: Can be removed once this is properly handled when starting playback of a file if (id <= 0 && !item->GetPath().empty() && (!item->HasProperty(LOOKUP_PROPERTY) || item->GetProperty(LOOKUP_PROPERTY).asBoolean())) { CVideoDatabase videodatabase; if (videodatabase.Open()) { if (videodatabase.LoadVideoInfo(item->GetPath(), *item->GetVideoInfoTag())) id = item->GetVideoInfoTag()->m_iDbId; videodatabase.Close(); } } if (!item->GetVideoInfoTag()->m_type.empty()) type = item->GetVideoInfoTag()->m_type; else CVideoDatabase::VideoContentTypeToString((VIDEODB_CONTENT_TYPE)item->GetVideoContentType(), type); if (id <= 0) { // TODO: Can be removed once this is properly handled when starting playback of a file item->SetProperty(LOOKUP_PROPERTY, false); object["item"]["title"] = item->GetVideoInfoTag()->m_strTitle; switch (item->GetVideoContentType()) { case VIDEODB_CONTENT_MOVIES: if (item->GetVideoInfoTag()->m_iYear > 0) object["item"]["year"] = item->GetVideoInfoTag()->m_iYear; break; case VIDEODB_CONTENT_EPISODES: if (item->GetVideoInfoTag()->m_iEpisode >= 0) object["item"]["episode"] = item->GetVideoInfoTag()->m_iEpisode; if (item->GetVideoInfoTag()->m_iSeason >= 0) object["item"]["season"] = item->GetVideoInfoTag()->m_iSeason; if (!item->GetVideoInfoTag()->m_strShowTitle.empty()) object["item"]["showtitle"] = item->GetVideoInfoTag()->m_strShowTitle; break; case VIDEODB_CONTENT_MUSICVIDEOS: if (!item->GetVideoInfoTag()->m_strAlbum.empty()) object["item"]["album"] = item->GetVideoInfoTag()->m_strAlbum; if (!item->GetVideoInfoTag()->m_artist.empty()) object["item"]["artist"] = StringUtils::Join(item->GetVideoInfoTag()->m_artist, " / "); break; } } } else if (item->HasMusicInfoTag()) { id = item->GetMusicInfoTag()->GetDatabaseId(); type = "song"; // TODO: Can be removed once this is properly handled when starting playback of a file if (id <= 0 && !item->GetPath().empty() && (!item->HasProperty(LOOKUP_PROPERTY) || item->GetProperty(LOOKUP_PROPERTY).asBoolean())) { CMusicDatabase musicdatabase; if (musicdatabase.Open()) { CSong song; if (musicdatabase.GetSongByFileName(item->GetPath(), song, item->m_lStartOffset)) { item->GetMusicInfoTag()->SetSong(song); id = item->GetMusicInfoTag()->GetDatabaseId(); } musicdatabase.Close(); } } if (id <= 0) { // TODO: Can be removed once this is properly handled when starting playback of a file item->SetProperty(LOOKUP_PROPERTY, false); CStdString title = item->GetMusicInfoTag()->GetTitle(); if (title.IsEmpty()) title = item->GetLabel(); object["item"]["title"] = title; if (item->GetMusicInfoTag()->GetTrackNumber() > 0) object["item"]["track"] = item->GetMusicInfoTag()->GetTrackNumber(); if (!item->GetMusicInfoTag()->GetAlbum().empty()) object["item"]["album"] = item->GetMusicInfoTag()->GetAlbum(); if (!item->GetMusicInfoTag()->GetArtist().empty()) object["item"]["artist"] = item->GetMusicInfoTag()->GetArtist(); } } else if (item->HasPictureInfoTag()) { type = "picture"; object["item"]["file"] = item->GetPath(); } else type = "unknown"; object["item"]["type"] = type; if (id > 0) object["item"]["id"] = id; Announce(flag, sender, message, object); }
void CFileItemHandler::HandleFileItem(const char *ID, bool allowFile, const char *resultname, CFileItemPtr item, const CVariant ¶meterObject, const CVariant &validFields, CVariant &result, bool append /* = true */) { CVariant object; bool hasFileField = false; bool hasThumbnailField = false; if (item.get()) { for (unsigned int i = 0; i < validFields.size(); i++) { CStdString field = validFields[i].asString(); if (field == "file") hasFileField = true; if (field == "thumbnail") hasThumbnailField = true; } if (allowFile && hasFileField) { if (item->HasVideoInfoTag() && !item->GetVideoInfoTag()->GetPath().IsEmpty()) object["file"] = item->GetVideoInfoTag()->GetPath().c_str(); if (item->HasMusicInfoTag() && !item->GetMusicInfoTag()->GetURL().IsEmpty()) object["file"] = item->GetMusicInfoTag()->GetURL().c_str(); if (!object.isMember("file")) object["file"] = item->GetPath().c_str(); } if (ID) { if(stricmp(ID, "spotify_albumid") == 0) { CStdString spotify_albumid = item->GetPath(); object[ID] = spotify_albumid.c_str(); } if (item->HasMusicInfoTag() && item->GetMusicInfoTag()->GetDatabaseId() > 0) object[ID] = (int)item->GetMusicInfoTag()->GetDatabaseId(); else if (item->HasVideoInfoTag() && item->GetVideoInfoTag()->m_iDbId > 0) object[ID] = item->GetVideoInfoTag()->m_iDbId; if (stricmp(ID, "id") == 0) { if (item->HasMusicInfoTag()) { if (item->m_bIsFolder && item->IsAlbum()) object["type"] = "album"; else object["type"] = "song"; } else if (item->HasVideoInfoTag()) { switch (item->GetVideoContentType()) { case VIDEODB_CONTENT_EPISODES: object["type"] = "episode"; break; case VIDEODB_CONTENT_MUSICVIDEOS: object["type"] = "musicvideo"; break; case VIDEODB_CONTENT_MOVIES: object["type"] = "movie"; break; case VIDEODB_CONTENT_TVSHOWS: object["type"] = "tvshow"; break; default: break; } } else if (item->HasPictureInfoTag()) object["type"] = "picture"; if (!object.isMember("type")) object["type"] = "unknown"; } } if (hasThumbnailField) { if (item->HasThumbnail()) object["thumbnail"] = item->GetThumbnailImage().c_str(); else if (item->HasVideoInfoTag()) { CStdString strPath, strFileName; URIUtils::Split(item->GetCachedVideoThumb(), strPath, strFileName); CStdString cachedThumb = strPath + "auto-" + strFileName; if (CFile::Exists(cachedThumb)) object["thumbnail"] = cachedThumb; } else if (item->HasPictureInfoTag()) { CStdString thumb = CTextureCache::Get().CheckAndCacheImage(CTextureCache::GetWrappedThumbURL(item->GetPath())); if (!thumb.empty()) object["thumbnail"] = thumb; } if (!object.isMember("thumbnail")) object["thumbnail"] = ""; } if (item->HasVideoInfoTag()) FillDetails(item->GetVideoInfoTag(), item, validFields, object); if (item->HasMusicInfoTag()) FillDetails(item->GetMusicInfoTag(), item, validFields, object); if (item->HasPictureInfoTag()) FillDetails(item->GetPictureInfoTag(), item, validFields, object); object["label"] = item->GetLabel().c_str(); } else object = CVariant(CVariant::VariantTypeNull); if (resultname) { if (append) result[resultname].append(object); else result[resultname] = object; } }
void CGUIWindowFileManager::OnClick(int iList, int iItem) { /* 歌方: 1、 卦指: 1、 傍苧: 1、 */ if ( iList < 0 || iList > 2) return ; if ( iItem < 0 || iItem >= m_vecItems[iList]->Size() ) return ; CFileItemPtr pItem = m_vecItems[iList]->Get(iItem); if (pItem->GetPath() == "add" && pItem->GetLabel() == g_localizeStrings.Get(1026)) // 'add source button' in empty root { if (CGUIDialogMediaSource::ShowAndAddMediaSource("files")) { m_rootDir.SetSources(g_settings.m_fileSources); Update(0,m_Directory[0]->GetPath()); Update(1,m_Directory[1]->GetPath()); } return; } if (pItem->m_bIsFolder) { // save path + drive type because of the possible refresh CStdString strPath = pItem->GetPath(); int iDriveType = pItem->m_iDriveType; if ( pItem->m_bIsShareOrDrive ) { if ( !g_passwordManager.IsItemUnlocked( pItem.get(), "files" ) ) { Refresh(); return ; } if ( !HaveDiscOrConnection( strPath, iDriveType ) ) return ; } if (!Update(iList, strPath)) ShowShareErrorMessage(pItem.get()); } else if (pItem->IsZIP() || pItem->IsCBZ()) // mount zip archive { CStdString strArcivedPath; URIUtils::CreateArchivePath(strArcivedPath, "zip", pItem->GetPath(), ""); Update(iList, strArcivedPath); } else if (pItem->IsRAR() || pItem->IsCBR()) { CStdString strArcivedPath; URIUtils::CreateArchivePath(strArcivedPath, "rar", pItem->GetPath(), ""); Update(iList, strArcivedPath); } else { OnStart(pItem.get()); return ; } // UpdateButtons(); }
void SSortFileItem::ByLabel(CFileItemPtr &item) { if (!item) return; item->SetSortLabel(item->GetLabel()); }
void CFileItemHandler::HandleFileItem(const char *ID, bool allowFile, const char *resultname, CFileItemPtr item, const CVariant ¶meterObject, const std::set<std::string> &validFields, CVariant &result, bool append /* = true */, CThumbLoader *thumbLoader /* = NULL */) { CVariant object; std::set<std::string> fields(validFields.begin(), validFields.end()); if (item.get()) { std::set<std::string>::const_iterator fileField = fields.find("file"); if (fileField != fields.end()) { if (allowFile) { if (item->HasVideoInfoTag() && !item->GetVideoInfoTag()->GetPath().IsEmpty()) object["file"] = item->GetVideoInfoTag()->GetPath().c_str(); if (item->HasMusicInfoTag() && !item->GetMusicInfoTag()->GetURL().IsEmpty()) object["file"] = item->GetMusicInfoTag()->GetURL().c_str(); if (!object.isMember("file")) object["file"] = item->GetPath().c_str(); } fields.erase(fileField); } if (ID) { if (item->HasPVRChannelInfoTag() && item->GetPVRChannelInfoTag()->ChannelID() > 0) object[ID] = item->GetPVRChannelInfoTag()->ChannelID(); else if (item->HasMusicInfoTag() && item->GetMusicInfoTag()->GetDatabaseId() > 0) object[ID] = (int)item->GetMusicInfoTag()->GetDatabaseId(); else if (item->HasVideoInfoTag() && item->GetVideoInfoTag()->m_iDbId > 0) object[ID] = item->GetVideoInfoTag()->m_iDbId; if (stricmp(ID, "id") == 0) { if (item->HasPVRChannelInfoTag()) object["type"] = "channel"; else if (item->HasMusicInfoTag()) { std::string type = item->GetMusicInfoTag()->GetType(); if (type == "album" || type == "song" || type == "artist") object["type"] = type; else object["type"] = "song"; } else if (item->HasVideoInfoTag() && !item->GetVideoInfoTag()->m_type.empty()) { std::string type = item->GetVideoInfoTag()->m_type; if (type == "movie" || type == "tvshow" || type == "episode" || type == "musicvideo") object["type"] = type; } else if (item->HasPictureInfoTag()) object["type"] = "picture"; if (!object.isMember("type")) object["type"] = "unknown"; if (fields.find("filetype") != fields.end()) { if (item->m_bIsFolder) object["filetype"] = "directory"; else object["filetype"] = "file"; } } } bool deleteThumbloader = false; if (thumbLoader == NULL) { if (item->HasVideoInfoTag()) thumbLoader = new CVideoThumbLoader(); else if (item->HasMusicInfoTag()) thumbLoader = new CMusicThumbLoader(); if (thumbLoader != NULL) { deleteThumbloader = true; thumbLoader->OnLoaderStart(); } } if (item->HasPVRChannelInfoTag()) FillDetails(item->GetPVRChannelInfoTag(), item, fields, object, thumbLoader); if (item->HasVideoInfoTag()) FillDetails(item->GetVideoInfoTag(), item, fields, object, thumbLoader); if (item->HasMusicInfoTag()) FillDetails(item->GetMusicInfoTag(), item, fields, object, thumbLoader); if (item->HasPictureInfoTag()) FillDetails(item->GetPictureInfoTag(), item, fields, object, thumbLoader); FillDetails(item.get(), item, fields, object, thumbLoader); if (deleteThumbloader) delete thumbLoader; object["label"] = item->GetLabel().c_str(); } else object = CVariant(CVariant::VariantTypeNull); if (resultname) { if (append) result[resultname].append(object); else result[resultname] = object; } }
void SSortFileItem::ByLabelNoThe(CFileItemPtr &item) { if (!item) return; item->SetSortLabel(RemoveArticles(item->GetLabel())); }
JSONRPC_STATUS CPlayerOperations::GetItem(const CStdString &method, ITransportLayer *transport, IClient *client, const CVariant ¶meterObject, CVariant &result) { PlayerType player = GetPlayer(parameterObject["playerid"]); CFileItemPtr fileItem; switch (player) { case Video: case Audio: { fileItem = CFileItemPtr(new CFileItem(g_application.CurrentFileItem())); if (fileItem->GetLabel().empty()) { if (IsPVRChannel()) { CPVRChannelPtr currentChannel; if (g_PVRManager.GetCurrentChannel(currentChannel) && currentChannel.get() != NULL) fileItem = CFileItemPtr(new CFileItem(*currentChannel.get())); } else if (player == Video) { if (!CVideoLibrary::FillFileItem(g_application.CurrentFile(), fileItem, parameterObject)) { const CVideoInfoTag *currentVideoTag = g_infoManager.GetCurrentMovieTag(); if (currentVideoTag != NULL) fileItem = CFileItemPtr(new CFileItem(*currentVideoTag)); fileItem->SetPath(g_application.CurrentFileItem().GetPath()); } } else { if (!CAudioLibrary::FillFileItem(g_application.CurrentFile(), fileItem, parameterObject)) { const MUSIC_INFO::CMusicInfoTag *currentMusicTag = g_infoManager.GetCurrentSongTag(); if (currentMusicTag != NULL) fileItem = CFileItemPtr(new CFileItem(*currentMusicTag)); fileItem->SetPath(g_application.CurrentFileItem().GetPath()); } } } if (IsPVRChannel()) break; if (player == Video) { bool additionalInfo = false; bool streamdetails = false; for (CVariant::const_iterator_array itr = parameterObject["properties"].begin_array(); itr != parameterObject["properties"].end_array(); itr++) { CStdString fieldValue = itr->asString(); if (fieldValue == "cast" || fieldValue == "set" || fieldValue == "setid" || fieldValue == "showlink" || fieldValue == "resume" || (fieldValue == "streamdetails" && !fileItem->GetVideoInfoTag()->m_streamDetails.HasItems())) additionalInfo = true; } CVideoDatabase videodatabase; if ((additionalInfo) && videodatabase.Open()) { if (additionalInfo) { switch (fileItem->GetVideoContentType()) { case VIDEODB_CONTENT_MOVIES: videodatabase.GetMovieInfo("", *(fileItem->GetVideoInfoTag()), fileItem->GetVideoInfoTag()->m_iDbId); break; case VIDEODB_CONTENT_MUSICVIDEOS: videodatabase.GetMusicVideoInfo("", *(fileItem->GetVideoInfoTag()), fileItem->GetVideoInfoTag()->m_iDbId); break; case VIDEODB_CONTENT_EPISODES: videodatabase.GetEpisodeInfo("", *(fileItem->GetVideoInfoTag()), fileItem->GetVideoInfoTag()->m_iDbId); break; case VIDEODB_CONTENT_TVSHOWS: case VIDEODB_CONTENT_MOVIE_SETS: default: break; } } videodatabase.Close(); } } else if (player == Audio) { if (fileItem->IsMusicDb()) { CMusicDatabase musicdb; CFileItemList items; items.Add(fileItem); CAudioLibrary::GetAdditionalSongDetails(parameterObject, items, musicdb); } } break; } case Picture: { CGUIWindowSlideShow *slideshow = (CGUIWindowSlideShow*)g_windowManager.GetWindow(WINDOW_SLIDESHOW); if (!slideshow) return FailedToExecute; CFileItemList slides; slideshow->GetSlideShowContents(slides); fileItem = slides[slideshow->CurrentSlide() - 1]; break; } case None: default: return FailedToExecute; } HandleFileItem("id", !IsPVRChannel(), "item", fileItem, parameterObject, parameterObject["properties"], result, false); return OK; }
void SSortFileItem::ByMPAARating(CFileItemPtr &item) { if (!item) return; item->SetSortLabel(item->GetVideoInfoTag()->m_strMPAARating + " " + item->GetLabel()); }
bool CGUIWindowMusicNav::OnContextButton(int itemNumber, CONTEXT_BUTTON button) { CFileItemPtr item; if (itemNumber >= 0 && itemNumber < m_vecItems->Size()) item = m_vecItems->Get(itemNumber); switch (button) { case CONTEXT_BUTTON_INFO: { if (!item->IsVideoDb()) return CGUIWindowMusicBase::OnContextButton(itemNumber,button); // music videos - artists if (item->GetPath().Left(14).Equals("videodb://3/4/")) { long idArtist = m_musicdatabase.GetArtistByName(item->GetLabel()); if (idArtist == -1) return false; CStdString path; path.Format("musicdb://2/%ld/", idArtist); item->SetPath(path); CGUIWindowMusicBase::OnContextButton(itemNumber,button); Update(m_vecItems->GetPath()); m_viewControl.SetSelectedItem(itemNumber); return true; } // music videos - albums if (item->GetPath().Left(14).Equals("videodb://3/5/")) { long idAlbum = m_musicdatabase.GetAlbumByName(item->GetLabel()); if (idAlbum == -1) return false; CStdString path; path.Format("musicdb://3/%ld/", idAlbum); item->SetPath(path); CGUIWindowMusicBase::OnContextButton(itemNumber,button); Update(m_vecItems->GetPath()); m_viewControl.SetSelectedItem(itemNumber); return true; } if (item->HasVideoInfoTag() && !item->GetVideoInfoTag()->m_strTitle.IsEmpty()) { CGUIWindowVideoNav* pWindow = (CGUIWindowVideoNav*)g_windowManager.GetWindow(WINDOW_VIDEO_NAV); if (pWindow) { ADDON::ScraperPtr info; pWindow->OnInfo(item.get(),info); Update(m_vecItems->GetPath()); } } return true; } case CONTEXT_BUTTON_INFO_ALL: OnInfoAll(itemNumber); return true; case CONTEXT_BUTTON_UPDATE_LIBRARY: { CGUIDialogMusicScan *scanner = (CGUIDialogMusicScan *)g_windowManager.GetWindow(WINDOW_DIALOG_MUSIC_SCAN); if (scanner) scanner->StartScanning(""); return true; } case CONTEXT_BUTTON_SET_DEFAULT: g_settings.m_defaultMusicLibSource = GetQuickpathName(item->GetPath()); g_settings.Save(); return true; case CONTEXT_BUTTON_CLEAR_DEFAULT: g_settings.m_defaultMusicLibSource.Empty(); g_settings.Save(); return true; case CONTEXT_BUTTON_GO_TO_ARTIST: { CStdString strPath; CVideoDatabase database; database.Open(); strPath.Format("videodb://3/4/%ld/",database.GetMatchingMusicVideo(item->GetMusicInfoTag()->GetArtist())); g_windowManager.ActivateWindow(WINDOW_VIDEO_NAV,strPath); return true; } case CONTEXT_BUTTON_PLAY_OTHER: { CVideoDatabase database; database.Open(); CVideoInfoTag details; database.GetMusicVideoInfo("",details,database.GetMatchingMusicVideo(item->GetMusicInfoTag()->GetArtist(),item->GetMusicInfoTag()->GetAlbum(),item->GetMusicInfoTag()->GetTitle())); g_application.getApplicationMessenger().PlayFile(CFileItem(details)); return true; } case CONTEXT_BUTTON_MARK_WATCHED: CGUIWindowVideoBase::MarkWatched(item,true); CUtil::DeleteVideoDatabaseDirectoryCache(); Update(m_vecItems->GetPath()); return true; case CONTEXT_BUTTON_MARK_UNWATCHED: CGUIWindowVideoBase::MarkWatched(item,false); CUtil::DeleteVideoDatabaseDirectoryCache(); Update(m_vecItems->GetPath()); return true; case CONTEXT_BUTTON_RENAME: CGUIWindowVideoBase::UpdateVideoTitle(item.get()); CUtil::DeleteVideoDatabaseDirectoryCache(); Update(m_vecItems->GetPath()); return true; case CONTEXT_BUTTON_DELETE: if (item->IsPlayList() || item->IsSmartPlayList()) { item->m_bIsFolder = false; CFileUtils::DeleteItem(item); } else { CGUIWindowVideoNav::DeleteItem(item.get()); CUtil::DeleteVideoDatabaseDirectoryCache(); } Update(m_vecItems->GetPath()); return true; case CONTEXT_BUTTON_SET_CONTENT: { bool bScan=false; ADDON::ScraperPtr scraper; CStdString path(item->GetPath()); CQueryParams params; CDirectoryNode::GetDatabaseInfo(item->GetPath(), params); CONTENT_TYPE content = CONTENT_ALBUMS; if (params.GetAlbumId() != -1) path.Format("musicdb://3/%i/",params.GetAlbumId()); else if (params.GetArtistId() != -1) { path.Format("musicdb://2/%i/",params.GetArtistId()); content = CONTENT_ARTISTS; } if (m_vecItems->GetPath().Equals("musicdb://1/") || item->GetPath().Equals("musicdb://2/")) { content = CONTENT_ARTISTS; } if (!m_musicdatabase.GetScraperForPath(path, scraper, ADDON::ScraperTypeFromContent(content))) { ADDON::AddonPtr defaultScraper; if (ADDON::CAddonMgr::Get().GetDefault(ADDON::ScraperTypeFromContent(content), defaultScraper)) { scraper = boost::dynamic_pointer_cast<ADDON::CScraper>(defaultScraper->Clone(defaultScraper)); } } if (CGUIDialogContentSettings::Show(scraper, bScan, content)) { m_musicdatabase.SetScraperForPath(path,scraper); if (bScan) OnInfoAll(itemNumber,true); } return true; } default: break; } return CGUIWindowMusicBase::OnContextButton(itemNumber, button); }
bool CRecentlyAddedJob::UpdateVideo() { CGUIWindow* home = g_windowManager.GetWindow(WINDOW_HOME); if ( home == NULL ) return false; CLog::Log(LOGDEBUG, "CRecentlyAddedJob::UpdateVideos() - Running RecentlyAdded home screen update"); int i = 0; CFileItemList items; CVideoDatabase videodatabase; videodatabase.Open(); if (videodatabase.GetRecentlyAddedMoviesNav("videodb://1/", items, NUM_ITEMS)) { for (; i < items.Size(); ++i) { CFileItemPtr item = items.Get(i); CStdString value; CStdString strRating; value.Format("%i", i + 1); strRating.Format("%.1f", item->GetVideoInfoTag()->m_fRating); home->SetProperty("LatestMovie." + value + ".Title" , item->GetLabel()); home->SetProperty("LatestMovie." + value + ".Rating" , strRating); home->SetProperty("LatestMovie." + value + ".Year" , item->GetVideoInfoTag()->m_iYear); home->SetProperty("LatestMovie." + value + ".Plot" , item->GetVideoInfoTag()->m_strPlot); home->SetProperty("LatestMovie." + value + ".RunningTime" , item->GetVideoInfoTag()->m_strRuntime); home->SetProperty("LatestMovie." + value + ".Path" , item->GetVideoInfoTag()->m_strFileNameAndPath); home->SetProperty("LatestMovie." + value + ".Trailer" , item->GetVideoInfoTag()->m_strTrailer); if (!item->HasThumbnail()) m_thumbLoader.LoadItem(item.get()); home->SetProperty("LatestMovie." + value + ".Thumb" , item->GetThumbnailImage()); home->SetProperty("LatestMovie." + value + ".Fanart" , item->GetCachedFanart()); } } for (; i < NUM_ITEMS; ++i) { CStdString value; value.Format("%i", i + 1); home->SetProperty("LatestMovie." + value + ".Title" , ""); home->SetProperty("LatestMovie." + value + ".Thumb" , ""); home->SetProperty("LatestMovie." + value + ".Rating" , ""); home->SetProperty("LatestMovie." + value + ".Year" , ""); home->SetProperty("LatestMovie." + value + ".Plot" , ""); home->SetProperty("LatestMovie." + value + ".RunningTime" , ""); home->SetProperty("LatestMovie." + value + ".Path" , ""); home->SetProperty("LatestMovie." + value + ".Trailer" , ""); home->SetProperty("LatestMovie." + value + ".Fanart" , ""); } i = 0; CFileItemList TVShowItems; if (videodatabase.GetRecentlyAddedEpisodesNav("videodb://1/", TVShowItems, NUM_ITEMS)) { for (; i < TVShowItems.Size(); ++i) { CFileItemPtr item = TVShowItems.Get(i); int EpisodeSeason = item->GetVideoInfoTag()->m_iSeason; int EpisodeNumber = item->GetVideoInfoTag()->m_iEpisode; CStdString EpisodeNo; CStdString value; CStdString strRating; CStdString strSeason; EpisodeNo.Format("s%02de%02d", EpisodeSeason, EpisodeNumber); value.Format("%i", i + 1); strRating.Format("%.1f", item->GetVideoInfoTag()->m_fRating); if (EpisodeSeason == 0) strSeason = g_localizeStrings.Get(20381); else strSeason.Format(g_localizeStrings.Get(20358), EpisodeSeason); CFileItem season(strSeason); season.GetVideoInfoTag()->m_strPath = item->GetVideoInfoTag()->m_strShowPath; CFileItem show(item->GetVideoInfoTag()->m_strShowPath, true); home->SetProperty("LatestEpisode." + value + ".ShowTitle" , item->GetVideoInfoTag()->m_strShowTitle); home->SetProperty("LatestEpisode." + value + ".EpisodeTitle" , item->GetVideoInfoTag()->m_strTitle); home->SetProperty("LatestEpisode." + value + ".Rating" , strRating); home->SetProperty("LatestEpisode." + value + ".Plot" , item->GetVideoInfoTag()->m_strPlot); home->SetProperty("LatestEpisode." + value + ".EpisodeNo" , EpisodeNo); home->SetProperty("LatestEpisode." + value + ".EpisodeSeason" , EpisodeSeason); home->SetProperty("LatestEpisode." + value + ".EpisodeNumber" , EpisodeNumber); home->SetProperty("LatestEpisode." + value + ".Path" , item->GetVideoInfoTag()->m_strFileNameAndPath); if (!item->HasThumbnail()) m_thumbLoader.LoadItem(item.get()); home->SetProperty("LatestEpisode." + value + ".Thumb" , item->GetThumbnailImage()); home->SetProperty("LatestEpisode." + value + ".ShowThumb" , show.GetCachedVideoThumb()); home->SetProperty("LatestEpisode." + value + ".SeasonThumb" , season.GetCachedSeasonThumb()); home->SetProperty("LatestEpisode." + value + ".Fanart" , item->GetCachedFanart()); } } for (; i < NUM_ITEMS; ++i) { CStdString value; value.Format("%i", i + 1); home->SetProperty("LatestEpisode." + value + ".ShowTitle" , ""); home->SetProperty("LatestEpisode." + value + ".EpisodeTitle" , ""); home->SetProperty("LatestEpisode." + value + ".Rating" , ""); home->SetProperty("LatestEpisode." + value + ".Plot" , ""); home->SetProperty("LatestEpisode." + value + ".EpisodeNo" , ""); home->SetProperty("LatestEpisode." + value + ".EpisodeSeason" , ""); home->SetProperty("LatestEpisode." + value + ".EpisodeNumber" , ""); home->SetProperty("LatestEpisode." + value + ".Path" , ""); home->SetProperty("LatestEpisode." + value + ".Thumb" , ""); home->SetProperty("LatestEpisode." + value + ".ShowThumb" , ""); home->SetProperty("LatestEpisode." + value + ".SeasonThumb" , ""); home->SetProperty("LatestEpisode." + value + ".Fanart" , ""); } i = 0; CFileItemList MusicVideoItems; if (videodatabase.GetRecentlyAddedMusicVideosNav("videodb://1/", MusicVideoItems, NUM_ITEMS)) { for (; i < MusicVideoItems.Size(); ++i) { CFileItemPtr item = MusicVideoItems.Get(i); CStdString value; value.Format("%i", i + 1); home->SetProperty("LatestMusicVideo." + value + ".Title" , item->GetLabel()); home->SetProperty("LatestMusicVideo." + value + ".Year" , item->GetVideoInfoTag()->m_iYear); home->SetProperty("LatestMusicVideo." + value + ".Plot" , item->GetVideoInfoTag()->m_strPlot); home->SetProperty("LatestMusicVideo." + value + ".RunningTime" , item->GetVideoInfoTag()->m_strRuntime); home->SetProperty("LatestMusicVideo." + value + ".Path" , item->GetVideoInfoTag()->m_strFileNameAndPath); home->SetProperty("LatestMusicVideo." + value + ".Artist" , item->GetVideoInfoTag()->m_strArtist); if (!item->HasThumbnail()) m_thumbLoader.LoadItem(item.get()); home->SetProperty("LatestMusicVideo." + value + ".Thumb" , item->GetThumbnailImage()); home->SetProperty("LatestMusicVideo." + value + ".Fanart" , item->GetCachedFanart()); } } for (; i < NUM_ITEMS; ++i) { CStdString value; value.Format("%i", i + 1); home->SetProperty("LatestMusicVideo." + value + ".Title" , ""); home->SetProperty("LatestMusicVideo." + value + ".Thumb" , ""); home->SetProperty("LatestMusicVideo." + value + ".Year" , ""); home->SetProperty("LatestMusicVideo." + value + ".Plot" , ""); home->SetProperty("LatestMusicVideo." + value + ".RunningTime" , ""); home->SetProperty("LatestMusicVideo." + value + ".Path" , ""); home->SetProperty("LatestMusicVideo." + value + ".Artist" , ""); home->SetProperty("LatestMusicVideo." + value + ".Fanart" , ""); } videodatabase.Close(); return true; }
void CGUIDialogSubtitles::OnDownloadComplete(const CFileItemList *items, const std::string &language) { if (items->IsEmpty()) { CFileItemPtr service = GetService(); if (service) CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Error, service->GetLabel(), g_localizeStrings.Get(24113)); UpdateStatus(SEARCH_COMPLETE); return; } SUBTITLE_STORAGEMODE storageMode = (SUBTITLE_STORAGEMODE) CSettings::GetInstance().GetInt(CSettings::SETTING_SUBTITLES_STORAGEMODE); // Get (unstacked) path std::string strCurrentFile = g_application.CurrentUnstackedItem().GetPath(); std::string strDownloadPath = "special://temp"; std::string strDestPath; std::vector<std::string> vecFiles; std::string strCurrentFilePath; if (StringUtils::StartsWith(strCurrentFilePath, "http://")) { strCurrentFile = "TempSubtitle"; vecFiles.push_back(strCurrentFile); } else { std::string subPath = CSpecialProtocol::TranslatePath("special://subtitles"); if (!subPath.empty()) strDownloadPath = subPath; /** Get item's folder for sub storage, special case for RAR/ZIP items * @todo We need some way to avoid special casing this all over the place * for rar/zip (perhaps modify GetDirectory?) */ if (URIUtils::IsInRAR(strCurrentFile) || URIUtils::IsInZIP(strCurrentFile)) strCurrentFilePath = URIUtils::GetDirectory(CURL(strCurrentFile).GetHostName()); else strCurrentFilePath = URIUtils::GetDirectory(strCurrentFile); // Handle stacks if (g_application.CurrentFileItem().IsStack() && items->Size() > 1) { CStackDirectory::GetPaths(g_application.CurrentFileItem().GetPath(), vecFiles); // Make sure (stack) size is the same as the size of the items handed to us, else fallback to single item if (items->Size() != (int) vecFiles.size()) { vecFiles.clear(); vecFiles.push_back(strCurrentFile); } } else { vecFiles.push_back(strCurrentFile); } if (storageMode == SUBTITLE_STORAGEMODE_MOVIEPATH && CUtil::SupportsWriteFileOperations(strCurrentFilePath)) { strDestPath = strCurrentFilePath; } } // Use fallback? if (strDestPath.empty()) strDestPath = strDownloadPath; // Extract the language and appropriate extension std::string strSubLang; g_LangCodeExpander.ConvertToISO6391(language, strSubLang); // Iterate over all items to transfer for (unsigned int i = 0; i < vecFiles.size() && i < (unsigned int) items->Size(); i++) { std::string strUrl = items->Get(i)->GetPath(); std::string strFileName = URIUtils::GetFileName(vecFiles[i]); URIUtils::RemoveExtension(strFileName); // construct subtitle path std::string strSubExt = URIUtils::GetExtension(strUrl); std::string strSubName = StringUtils::Format("%s.%s%s", strFileName.c_str(), strSubLang.c_str(), strSubExt.c_str()); // Handle URL encoding: std::string strDownloadFile = URIUtils::ChangeBasePath(strCurrentFilePath, strSubName, strDownloadPath); std::string strDestFile = strDownloadFile; if (!CFile::Copy(strUrl, strDownloadFile)) { CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Error, strSubName, g_localizeStrings.Get(24113)); CLog::Log(LOGERROR, "%s - Saving of subtitle %s to %s failed", __FUNCTION__, strUrl.c_str(), strDownloadFile.c_str()); } else { if (strDestPath != strDownloadPath) { // Handle URL encoding: std::string strTryDestFile = URIUtils::ChangeBasePath(strCurrentFilePath, strSubName, strDestPath); /* Copy the file from temp to our final destination, if that fails fallback to download path * (ie. special://subtitles or use special://temp). Note that after the first item strDownloadPath equals strDestpath * so that all remaining items (including the .idx below) are copied directly to their final destination and thus all * items end up in the same folder */ CLog::Log(LOGDEBUG, "%s - Saving subtitle %s to %s", __FUNCTION__, strDownloadFile.c_str(), strTryDestFile.c_str()); if (CFile::Copy(strDownloadFile, strTryDestFile)) { CFile::Delete(strDownloadFile); strDestFile = strTryDestFile; strDownloadPath = strDestPath; // Update download path so all the other items get directly downloaded to our final destination } else { CLog::Log(LOGWARNING, "%s - Saving of subtitle %s to %s failed. Falling back to %s", __FUNCTION__, strDownloadFile.c_str(), strTryDestFile.c_str(), strDownloadPath.c_str()); strDestPath = strDownloadPath; // Copy failed, use fallback for the rest of the items } } else { CLog::Log(LOGDEBUG, "%s - Saved subtitle %s to %s", __FUNCTION__, strUrl.c_str(), strDownloadFile.c_str()); } // for ".sub" subtitles we check if ".idx" counterpart exists and copy that as well if (StringUtils::EqualsNoCase(strSubExt, ".sub")) { strUrl = URIUtils::ReplaceExtension(strUrl, ".idx"); if(CFile::Exists(strUrl)) { std::string strSubNameIdx = StringUtils::Format("%s.%s.idx", strFileName.c_str(), strSubLang.c_str()); // Handle URL encoding: strDestFile = URIUtils::ChangeBasePath(strCurrentFilePath, strSubNameIdx, strDestPath); CFile::Copy(strUrl, strDestFile); } } // Set sub for currently playing (stack) item if (vecFiles[i] == strCurrentFile) SetSubtitles(strDestFile); } } // Close the window Close(); }
void CGUIDialogPluginSettings::CreateControls() { CGUISpinControlEx *pOriginalSpin = (CGUISpinControlEx*)GetControl(CONTROL_DEFAULT_SPIN); CGUIRadioButtonControl *pOriginalRadioButton = (CGUIRadioButtonControl *)GetControl(CONTROL_DEFAULT_RADIOBUTTON); CGUIButtonControl *pOriginalButton = (CGUIButtonControl *)GetControl(CONTROL_DEFAULT_BUTTON); CGUIImage *pOriginalImage = (CGUIImage *)GetControl(CONTROL_DEFAULT_SEPARATOR); CGUILabelControl *pOriginalLabel = (CGUILabelControl *)GetControl(CONTROL_DEFAULT_LABEL_SEPARATOR); if (!pOriginalSpin || !pOriginalRadioButton || !pOriginalButton || !pOriginalImage) return; pOriginalSpin->SetVisible(false); pOriginalRadioButton->SetVisible(false); pOriginalButton->SetVisible(false); pOriginalImage->SetVisible(false); if (pOriginalLabel) pOriginalLabel->SetVisible(false); // clear the category group CGUIControlGroupList *group = (CGUIControlGroupList *)GetControl(CONTROL_AREA); if (!group) return; // set our dialog heading SET_CONTROL_LABEL(CONTROL_HEADING_LABEL, m_strHeading); // Create our base path, used for type "fileenum" settings CStdString basepath = "Q:\\plugins\\"; CUtil::AddFileToFolder(basepath, m_url.GetHostName(), basepath); CUtil::AddFileToFolder(basepath, m_url.GetFileName(), basepath); CGUIControl* pControl = NULL; int controlId = CONTROL_START_CONTROL; TiXmlElement *setting = m_settings.GetPluginRoot()->FirstChildElement("setting"); while (setting) { const char *type = setting->Attribute("type"); const char *option = setting->Attribute("option"); const char *id = setting->Attribute("id"); CStdString values; if (setting->Attribute("values")) values = setting->Attribute("values"); CStdString lvalues; if (setting->Attribute("lvalues")) lvalues = setting->Attribute("lvalues"); CStdString entries; if (setting->Attribute("entries")) entries = setting->Attribute("entries"); CStdString label; if (setting->Attribute("label") && atoi(setting->Attribute("label")) > 0) label.Format("$LOCALIZE[%s]", setting->Attribute("label")); else label = setting->Attribute("label"); if (type) { if (strcmpi(type, "text") == 0 || strcmpi(type, "ipaddress") == 0 || strcmpi(type, "integer") == 0 || strcmpi(type, "video") == 0 || strcmpi(type, "music") == 0 || strcmpi(type, "pictures") == 0 || strcmpi(type, "folder") == 0 || strcmpi(type, "programs") == 0 || strcmpi(type, "files") == 0 || strcmpi(type, "action") == 0) { pControl = new CGUIButtonControl(*pOriginalButton); if (!pControl) return; ((CGUIButtonControl *)pControl)->SettingsCategorySetTextAlign(XBFONT_CENTER_Y); ((CGUIButtonControl *)pControl)->SetLabel(label); if (id) ((CGUIButtonControl *)pControl)->SetLabel2(m_settings.Get(id)); if (option && strcmpi(option, "hidden") == 0) ((CGUIButtonControl *)pControl)->SetHidden(true); } else if (strcmpi(type, "bool") == 0) { pControl = new CGUIRadioButtonControl(*pOriginalRadioButton); if (!pControl) return; ((CGUIRadioButtonControl *)pControl)->SetLabel(label); ((CGUIRadioButtonControl *)pControl)->SetSelected(m_settings.Get(id) == "true"); } else if (strcmpi(type, "enum") == 0 || strcmpi(type, "labelenum") == 0) { vector<CStdString> valuesVec; vector<CStdString> entryVec; pControl = new CGUISpinControlEx(*pOriginalSpin); if (!pControl) return; ((CGUISpinControlEx *)pControl)->SetText(label); if (!lvalues.IsEmpty()) CUtil::Tokenize(lvalues, valuesVec, "|"); else CUtil::Tokenize(values, valuesVec, "|"); if (!entries.IsEmpty()) CUtil::Tokenize(entries, entryVec, "|"); for (unsigned int i = 0; i < valuesVec.size(); i++) { int iAdd = i; if (entryVec.size() > i) iAdd = atoi(entryVec[i]); if (!lvalues.IsEmpty()) { CStdString replace = g_localizeStringsTemp.Get(atoi(valuesVec[i])); if (replace.IsEmpty()) replace = g_localizeStrings.Get(atoi(valuesVec[i])); ((CGUISpinControlEx *)pControl)->AddLabel(replace, iAdd); } else ((CGUISpinControlEx *)pControl)->AddLabel(valuesVec[i], iAdd); } if (strcmpi(type, "labelenum") == 0) { // need to run through all our settings and find the one that matches ((CGUISpinControlEx*) pControl)->SetValueFromLabel(m_settings.Get(id)); } else ((CGUISpinControlEx*) pControl)->SetValue(atoi(m_settings.Get(id))); } else if (strcmpi(type, "fileenum") == 0) { pControl = new CGUISpinControlEx(*pOriginalSpin); if (!pControl) return; ((CGUISpinControlEx *)pControl)->SetText(label); //find Folders... CFileItemList items; CStdString enumpath; CUtil::AddFileToFolder(basepath, values, enumpath); CStdString mask; if (setting->Attribute("mask")) mask = setting->Attribute("mask"); if (!mask.IsEmpty()) CDirectory::GetDirectory(enumpath, items, mask); else CDirectory::GetDirectory(enumpath, items); int iItem = 0; for (int i = 0; i < items.Size(); ++i) { CFileItemPtr pItem = items[i]; if ((mask.Equals("/") && pItem->m_bIsFolder) || !pItem->m_bIsFolder) { ((CGUISpinControlEx *)pControl)->AddLabel(pItem->GetLabel(), iItem); if (pItem->GetLabel().Equals(m_settings.Get(id))) ((CGUISpinControlEx *)pControl)->SetValue(iItem); iItem++; } } } else if (strcmpi(type, "lsep") == 0 && pOriginalLabel) { pControl = new CGUILabelControl(*pOriginalLabel); if (pControl) ((CGUILabelControl *)pControl)->SetLabel(label); } else if ((strcmpi(type, "sep") == 0 || strcmpi(type, "lsep") == 0) && pOriginalImage) pControl = new CGUIImage(*pOriginalImage); } if (pControl) { pControl->SetWidth(group->GetWidth()); pControl->SetVisible(true); pControl->SetID(controlId); pControl->AllocResources(); group->AddControl(pControl); pControl = NULL; } setting = setting->NextSiblingElement("setting"); controlId++; } EnableControls(); }