int CMusicInfoScanner::CountFiles(const CFileItemList &items, bool recursive) { int count = 0; for (int i=0; i<items.Size(); ++i) { const CFileItemPtr pItem=items[i]; if (recursive && pItem->m_bIsFolder) count+=CountFilesRecursively(pItem->GetPath()); else if (pItem->IsAudio() && !pItem->IsPlayList() && !pItem->IsNFO()) count++; } return count; }
void CMusicInfoLoader::OnLoaderFinish() { // cleanup last loaded songs from database m_songsMap.Clear(); // cleanup cache loaded from HD m_mapFileItems->Clear(); if (!m_bStop) { // check for art VECSONGS songs; songs.reserve(m_pVecItems->Size()); for (int i = 0; i < m_pVecItems->Size(); ++i) { CFileItemPtr pItem = m_pVecItems->Get(i); if (pItem->m_bIsFolder || pItem->IsPlayList() || pItem->IsNFO() || pItem->IsInternetStream()) continue; if (pItem->HasMusicInfoTag() && pItem->GetMusicInfoTag()->Loaded()) { CSong song(*pItem->GetMusicInfoTag()); song.strThumb = pItem->GetArt("thumb"); song.idSong = i; // for the lookup below songs.push_back(song); } } VECALBUMS albums; CMusicInfoScanner::CategoriseAlbums(songs, albums); CMusicInfoScanner::FindArtForAlbums(albums, m_pVecItems->GetPath()); for (VECALBUMS::iterator i = albums.begin(); i != albums.end(); ++i) { string albumArt = i->art["thumb"]; for (VECSONGS::iterator j = i->songs.begin(); j != i->songs.end(); ++j) { if (!j->strThumb.empty()) m_pVecItems->Get(j->idSong)->SetArt("thumb", j->strThumb); else m_pVecItems->Get(j->idSong)->SetArt("thumb", albumArt); } } } // Save loaded items to HD if (!m_strCacheFileName.IsEmpty()) SaveCache(m_strCacheFileName, *m_pVecItems); else if (!m_bStop && (m_databaseHits > 1 || m_tagReads > 0)) m_pVecItems->Save(); m_musicDatabase.Close(); }
int CMusicInfoScanner::GetPathHash(const CFileItemList &items, CStdString &hash) { // Create a hash based on the filenames, filesize and filedate. Also count the number of files if (0 == items.Size()) return 0; XBMC::XBMC_MD5 md5state; int count = 0; for (int i = 0; i < items.Size(); ++i) { const CFileItemPtr pItem = items[i]; md5state.append(pItem->GetPath()); md5state.append((unsigned char *)&pItem->m_dwSize, sizeof(pItem->m_dwSize)); FILETIME time = pItem->m_dateTime; md5state.append((unsigned char *)&time, sizeof(FILETIME)); if (pItem->IsAudio() && !pItem->IsPlayList() && !pItem->IsNFO()) count++; } md5state.getDigest(hash); return count; }
/// \brief Add unique file and folders and its subfolders to playlist /// \param pItem The file item to add void CGUIWindowMusicBase::AddItemToPlayList(const CFileItemPtr &pItem, CFileItemList &queuedItems) { if (!pItem->CanQueue() || pItem->IsRAR() || pItem->IsZIP() || pItem->IsParentFolder()) // no zip/rar enques thank you! return; // fast lookup is needed here queuedItems.SetFastLookup(true); if (pItem->IsMusicDb() && pItem->m_bIsFolder && !pItem->IsParentFolder()) { // we have a music database folder, just grab the "all" item underneath it CMusicDatabaseDirectory dir; if (!dir.ContainsSongs(pItem->GetPath())) { // grab the ALL item in this category // Genres will still require 2 lookups, and queuing the entire Genre folder // will require 3 lookups (genre, artist, album) CMusicDbUrl musicUrl; musicUrl.FromString(pItem->GetPath()); musicUrl.AppendPath("-1/"); CFileItemPtr item(new CFileItem(musicUrl.ToString(), true)); item->SetCanQueue(true); // workaround for CanQueue() check above AddItemToPlayList(item, queuedItems); return; } } if (pItem->m_bIsFolder || (g_windowManager.GetActiveWindow() == WINDOW_MUSIC_NAV && pItem->IsPlayList())) { // Check if we add a locked share if ( pItem->m_bIsShareOrDrive ) { CFileItem item = *pItem; if ( !g_passwordManager.IsItemUnlocked( &item, "music" ) ) return ; } // recursive CFileItemList items; GetDirectory(pItem->GetPath(), items); //OnRetrieveMusicInfo(items); FormatAndSort(items); for (int i = 0; i < items.Size(); ++i) AddItemToPlayList(items[i], queuedItems); } else { if (pItem->IsPlayList()) { auto_ptr<CPlayList> pPlayList (CPlayListFactory::Create(*pItem)); if (pPlayList.get()) { // load it if (!pPlayList->Load(pItem->GetPath())) { CGUIDialogOK::ShowAndGetInput(6, 0, 477, 0); return; //hmmm unable to load playlist? } CPlayList playlist = *pPlayList; for (int i = 0; i < (int)playlist.size(); ++i) { AddItemToPlayList(playlist[i], queuedItems); } return; } } else if(pItem->IsInternetStream()) { // just queue the internet stream, it will be expanded on play queuedItems.Add(pItem); } else if (pItem->IsPlugin() && pItem->GetProperty("isplayable") == "true") { // python files can be played queuedItems.Add(pItem); } else if (!pItem->IsNFO() && pItem->IsAudio()) { CFileItemPtr itemCheck = queuedItems.Get(pItem->GetPath()); if (!itemCheck || itemCheck->m_lStartOffset != pItem->m_lStartOffset) { // add item CFileItemPtr item(new CFileItem(*pItem)); m_musicdatabase.SetPropertiesForFileItem(*item); queuedItems.Add(item); } } } }
void CGUIWindowVideoFiles::OnInfo(CFileItem* pItem, const SScraperInfo& info) { if ( !pItem ) return ; bool bFolder(false); if (info.strContent.Equals("tvshows")) { CGUIWindowVideoBase::OnInfo(pItem,info); return; } CStdString strFolder = ""; CStdString strFile = pItem->m_strPath; if (pItem->m_bIsFolder && pItem->IsParentFolder()) return ; if (pItem->m_bIsShareOrDrive) // oh no u don't return ; if (pItem->m_bIsFolder) { // IMDB is done on a folder // stack and then find first file in folder bFolder = true; CFileItemList vecitems; GetStackedDirectory(pItem->m_strPath, vecitems); bool bFoundFile(false); for (int i = 0; i < (int)vecitems.Size(); ++i) { CFileItemPtr item = vecitems[i]; if (!item->m_bIsFolder) { if (item->IsVideo() && !item->IsNFO() && !item->IsPlayList() && item->m_strPath.Find("-trailer.") == -1) { bFoundFile = true; strFile = item->m_strPath; break; } } else { // check for a dvdfolder if (item->GetLabel().CompareNoCase("VIDEO_TS") == 0) { // found a dvd folder - grab the main .ifo file CUtil::AddFileToFolder(item->m_strPath, "VIDEO_TS.IFO", strFile); if (CFile::Exists(strFile)) { bFoundFile = true; break; } } // check for a "CD1" folder if (item->GetLabel().CompareNoCase("CD1") == 0) { CFileItemList items; GetStackedDirectory(item->m_strPath, items); for (int i = 0; i < items.Size(); i++) { CFileItemPtr item = items[i]; if (!item->m_bIsFolder && item->IsVideo() && !item->IsNFO() && !item->IsPlayList()) { bFoundFile = true; strFile = item->m_strPath; break; } } if (bFoundFile) break; } } } if (!bFoundFile) { // no video file in this folder? if (info.strContent.Equals("movies")) CGUIDialogOK::ShowAndGetInput(13346,20349,20022,20022); return ; } } // setup our item with the label and thumb information CFileItem item(strFile, false); item.SetLabel(pItem->GetLabel()); // hack since our label sometimes contains extensions if(!pItem->m_bIsFolder && !g_guiSettings.GetBool("filelists.hideextensions") && !pItem->IsLabelPreformated()) { item.RemoveExtension(); } item.SetCachedVideoThumb(); if (!item.HasThumbnail() && pItem->GetProperty("HasAutoThumb") != "1") // inherit from the original item if it exists item.SetThumbnailImage(pItem->GetThumbnailImage()); if (!info.strContent.Equals("plugin")) AddFileToDatabase(&item); else { if (pItem->HasVideoInfoTag()) *item.GetVideoInfoTag() = *pItem->GetVideoInfoTag(); } // we need to also request any thumbs also be applied to the folder item if (pItem->m_bIsFolder) item.SetProperty("set_folder_thumb", pItem->m_strPath); if (ShowIMDB(&item,info) && !info.strContent.Equals("plugin")) Update(m_vecItems->m_strPath); }