本文整理汇总了C++中CFileItemPtr类的典型用法代码示例。如果您正苦于以下问题:C++ CFileItemPtr类的具体用法?C++ CFileItemPtr怎么用?C++ CFileItemPtr使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了CFileItemPtr类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: item
void CGUIWindowMusicBase::PlayItem(int iItem)
{
// restrictions should be placed in the appropiate window code
// only call the base code if the item passes since this clears
// the current playlist
const CFileItemPtr pItem = m_vecItems->Get(iItem);
#ifdef HAS_DVD_DRIVE
if (pItem->IsDVD())
{
MEDIA_DETECT::CAutorun::PlayDiscAskResume(pItem->GetPath());
return;
}
#endif
// if its a folder, build a playlist
if ((pItem->m_bIsFolder && !pItem->IsPlugin()) || (g_windowManager.GetActiveWindow() == WINDOW_MUSIC_NAV && pItem->IsPlayList()))
{
// make a copy so that we can alter the queue state
CFileItemPtr item(new CFileItem(*m_vecItems->Get(iItem)));
// Allow queuing of unqueueable items
// when we try to queue them directly
if (!item->CanQueue())
item->SetCanQueue(true);
// skip ".."
if (item->IsParentFolder())
return;
CFileItemList queuedItems;
AddItemToPlayList(item, queuedItems);
if (g_partyModeManager.IsEnabled())
{
g_partyModeManager.AddUserSongs(queuedItems, true);
return;
}
/*
std::string strPlayListDirectory = m_vecItems->GetPath();
URIUtils::RemoveSlashAtEnd(strPlayListDirectory);
*/
g_playlistPlayer.ClearPlaylist(PLAYLIST_MUSIC);
g_playlistPlayer.Reset();
g_playlistPlayer.Add(PLAYLIST_MUSIC, queuedItems);
g_playlistPlayer.SetCurrentPlaylist(PLAYLIST_MUSIC);
// play!
g_playlistPlayer.Play();
}
else if (pItem->IsPlayList())
{
// load the playlist the old way
LoadPlayList(pItem->GetPath());
}
else
{
// just a single item, play it
//! @todo Add music-specific code for single playback of an item here (See OnClick in MediaWindow, and OnPlayMedia below)
OnClick(iItem);
}
}
示例2: TrimSlashes
void CPVRRecordings::GetSubDirectories(const CStdString &strBase, CFileItemList *results, bool bAutoSkip /* = true */)
{
CStdString strUseBase = TrimSlashes(strBase);
std::set<CStdString> unwatchedFolders;
for (unsigned int iRecordingPtr = 0; iRecordingPtr < m_recordings.size(); iRecordingPtr++)
{
CPVRRecording *current = m_recordings.at(iRecordingPtr);
const CStdString strCurrent = GetDirectoryFromPath(current->m_strDirectory, strUseBase);
if (strCurrent.IsEmpty())
continue;
CStdString strFilePath;
if(strUseBase.empty())
strFilePath.Format("pvr://recordings/%s/", strCurrent.c_str());
else
strFilePath.Format("pvr://recordings/%s/%s/", strUseBase.c_str(), strCurrent.c_str());
if (!results->Contains(strFilePath))
{
current->UpdateMetadata();
CFileItemPtr pFileItem;
pFileItem.reset(new CFileItem(strCurrent, true));
pFileItem->SetPath(strFilePath);
pFileItem->SetLabel(strCurrent);
pFileItem->SetLabelPreformated(true);
pFileItem->m_dateTime = current->RecordingTimeAsLocalTime();
// Initialize folder overlay from play count (either directly from client or from video database)
if (current->m_playCount > 0)
pFileItem->SetOverlayImage(CGUIListItem::ICON_OVERLAY_WATCHED, false);
else
unwatchedFolders.insert(strFilePath);
results->Add(pFileItem);
}
else
{
CFileItemPtr pFileItem;
pFileItem=results->Get(strFilePath);
if (pFileItem->m_dateTime<current->RecordingTimeAsLocalTime())
pFileItem->m_dateTime = current->RecordingTimeAsLocalTime();
// Unset folder overlay if recording is unwatched
if (unwatchedFolders.find(strFilePath) == unwatchedFolders.end())
{
if (current->m_playCount == 0)
{
pFileItem->SetOverlayImage(CGUIListItem::ICON_OVERLAY_UNWATCHED, false);
unwatchedFolders.insert(strFilePath);
}
}
}
}
int subDirectories = results->Size();
CFileItemList files;
GetContents(strBase, &files);
if (bAutoSkip && results->Size() == 1 && files.Size() == 0)
{
CStdString strGetPath;
strGetPath.Format("%s/%s/", strUseBase.c_str(), results->Get(0)->GetLabel());
results->Clear();
CLog::Log(LOGDEBUG, "CPVRRecordings - %s - '%s' only has 1 subdirectory, selecting that directory ('%s')",
__FUNCTION__, strUseBase.c_str(), strGetPath.c_str());
GetSubDirectories(strGetPath, results, true);
return;
}
results->Append(files);
// Add 'All Recordings' item (if we have at least one subdirectory in the list)
if (subDirectories > 0)
{
CStdString strLabel(g_localizeStrings.Get(19270)); // "* All recordings"
CFileItemPtr pItem(new CFileItem(strLabel));
CStdString strAllPath;
if(strUseBase.empty())
strAllPath = "pvr://recordings";
else
strAllPath.Format("pvr://recordings/%s", strUseBase.c_str());
pItem->SetPath(AddAllRecordingsPathExtension(strAllPath));
pItem->SetSpecialSort(SortSpecialOnTop);
pItem->SetLabelPreformated(true);
pItem->m_bIsFolder = true;
pItem->m_bIsShareOrDrive = false;
for(int i=0; i<results->Size(); ++i)
{
if(pItem->m_dateTime < results->Get(i)->m_dateTime)
pItem->m_dateTime = results->Get(i)->m_dateTime;
}
results->AddFront(pItem, 0);
}
}
示例3: CFileItemPtr
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())
{
CMediaSource *share = CGUIDialogContextMenu::GetShare("programs", item.get());
if (CGUIDialogContextMenu::OnContextButton("programs", share, button))
{
Update("");
return true;
}
}
switch (button)
{
case CONTEXT_BUTTON_RENAME:
{
CStdString strDescription;
CShortcut cut;
if (item->IsShortCut())
{
cut.Create(item->m_strPath);
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->m_strPath);
}
else
{
// SetXBEDescription will truncate to 40 characters.
//CUtil::SetXBEDescription(item->m_strPath,strDescription);
//m_database.SetDescription(item->m_strPath,strDescription);
}
Update(m_vecItems->m_strPath);
}
return true;
}
case CONTEXT_BUTTON_SETTINGS:
m_gWindowManager.ActivateWindow(WINDOW_SETTINGS_MYPROGRAMS);
return true;
case CONTEXT_BUTTON_GOTO_ROOT:
Update("");
return true;
case CONTEXT_BUTTON_LAUNCH:
OnClick(itemNumber);
return true;
default:
break;
}
return CGUIMediaWindow::OnContextButton(itemNumber, button);
}
示例4: switch
bool CGUIDialogFileBrowser::OnMessage(CGUIMessage& message)
{
switch ( message.GetMessage() )
{
case GUI_MSG_WINDOW_DEINIT:
{
if (m_thumbLoader.IsLoading())
m_thumbLoader.StopThread();
CGUIDialog::OnMessage(message);
ClearFileItems();
m_addNetworkShareEnabled = false;
return true;
}
break;
case GUI_MSG_WINDOW_INIT:
{
m_bConfirmed = false;
m_bFlip = false;
bool bIsDir = false;
// this code allows two different selection modes for directories
// end the path with a slash to start inside the directory
if (URIUtils::HasSlashAtEnd(m_selectedPath))
{
bIsDir = true;
bool bFool;
int iSource = CUtil::GetMatchingSource(m_selectedPath,m_shares,bFool);
bFool = true;
if (iSource > -1 && iSource < (int)m_shares.size())
{
if (URIUtils::PathEquals(m_shares[iSource].strPath, m_selectedPath))
bFool = false;
}
if (bFool && !CDirectory::Exists(m_selectedPath))
m_selectedPath.clear();
}
else
{
if (!CFile::Exists(m_selectedPath) && !CDirectory::Exists(m_selectedPath))
m_selectedPath.clear();
}
// find the parent folder if we are a file browser (don't do this for folders)
m_Directory->SetPath(m_selectedPath);
if (!m_browsingForFolders && !bIsDir)
m_Directory->SetPath(URIUtils::GetParentPath(m_selectedPath));
Update(m_Directory->GetPath());
m_viewControl.SetSelectedItem(m_selectedPath);
return CGUIDialog::OnMessage(message);
}
break;
case GUI_MSG_CLICKED:
{
if (m_viewControl.HasControl(message.GetSenderId())) // list control
{
int iItem = m_viewControl.GetSelectedItem();
int iAction = message.GetParam1();
if (iItem < 0) break;
if (iAction == ACTION_SELECT_ITEM || iAction == ACTION_MOUSE_LEFT_CLICK)
{
OnClick(iItem);
return true;
}
else if (iAction == ACTION_HIGHLIGHT_ITEM && m_multipleSelection)
{
CFileItemPtr pItem = (*m_vecItems)[iItem];
if (!pItem->m_bIsShareOrDrive && !pItem->m_bIsFolder)
{
pItem->Select(!pItem->IsSelected());
CGUIMessage msg(GUI_MSG_ITEM_SELECT, GetID(), message.GetSenderId(), iItem + 1);
OnMessage(msg);
}
}
}
else if (message.GetSenderId() == CONTROL_OK)
{
if (m_browsingForFolders == 2)
{
int iItem = m_viewControl.GetSelectedItem();
std::string strPath;
if (iItem == 0)
strPath = m_selectedPath;
else
strPath = (*m_vecItems)[iItem]->GetPath();
std::string strTest = URIUtils::AddFileToFolder(strPath, "1");
CFile file;
if (file.OpenForWrite(strTest,true))
{
file.Close();
CFile::Delete(strTest);
m_bConfirmed = true;
Close();
}
else
CGUIDialogOK::ShowAndGetInput(CVariant{257}, CVariant{20072});
}
//.........这里部分代码省略.........
示例5: SetSources
bool CGUIDialogFileBrowser::OnPopupMenu(int iItem)
{
CContextButtons choices;
choices.Add(1, m_addSourceType.empty() ? 20133 : 21364);
choices.Add(2, m_addSourceType.empty() ? 20134 : 21365);
int btnid = CGUIDialogContextMenu::ShowAndGetChoice(choices);
if (btnid == 1)
{
if (m_addNetworkShareEnabled)
{
std::string strOldPath=m_selectedPath,newPath=m_selectedPath;
VECSOURCES shares=m_shares;
if (CGUIDialogNetworkSetup::ShowAndGetNetworkAddress(newPath))
{
g_mediaManager.SetLocationPath(strOldPath,newPath);
for (unsigned int i=0;i<shares.size();++i)
{
if (URIUtils::CompareWithoutSlashAtEnd(shares[i].strPath, strOldPath))//getPath().Equals(strOldPath))
{
shares[i].strName = newPath;
shares[i].strPath = newPath;//setPath(newPath);
URIUtils::RemoveSlashAtEnd(shares[i].strName);
break;
}
}
// re-open our dialog
SetSources(shares);
m_rootDir.SetMask("/");
m_browsingForFolders = 1;
m_addNetworkShareEnabled = true;
m_selectedPath = newPath;
DoModal();
}
}
else
{
CFileItemPtr item = m_vecItems->Get(iItem);
OnEditMediaSource(item.get());
}
}
if (btnid == 2)
{
if (m_addNetworkShareEnabled)
{
g_mediaManager.RemoveLocation(m_selectedPath);
for (unsigned int i=0;i<m_shares.size();++i)
{
if (URIUtils::CompareWithoutSlashAtEnd(m_shares[i].strPath, m_selectedPath) && !m_shares[i].m_ignore) // getPath().Equals(m_selectedPath))
{
m_shares.erase(m_shares.begin()+i);
break;
}
}
m_rootDir.SetSources(m_shares);
m_rootDir.SetMask("/");
m_browsingForFolders = 1;
m_addNetworkShareEnabled = true;
m_selectedPath = "";
Update(m_Directory->GetPath());
}
else
{
CMediaSourceSettings::Get().DeleteSource(m_addSourceType,(*m_vecItems)[iItem]->GetLabel(),(*m_vecItems)[iItem]->GetPath());
SetSources(*CMediaSourceSettings::Get().GetSources(m_addSourceType));
Update("");
}
}
return true;
}
示例6: item
/// \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->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;
if (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())
{
unique_ptr<CPlayList> pPlayList (CPlayListFactory::Create(*pItem));
if (pPlayList.get())
{
// load it
if (!pPlayList->Load(pItem->GetPath()))
{
CGUIDialogOK::ShowAndGetInput(CVariant{6}, CVariant{477});
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->IsNFO() && (pItem->IsAudio() || pItem->IsVideo()))
{
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);
}
}
}
}
示例7: LoadItemLookup
bool CMusicInfoLoader::LoadItemLookup(CFileItem* pItem)
{
if (m_pProgressCallback && !pItem->m_bIsFolder)
m_pProgressCallback->SetProgressAdvance();
if (pItem->m_bIsFolder || pItem->IsPlayList() || pItem->IsNFO() || pItem->IsInternetStream())
return false;
if (!pItem->HasMusicInfoTag() || !pItem->GetMusicInfoTag()->Loaded())
{
// first check the cached item
CFileItemPtr mapItem = (*m_mapFileItems)[pItem->GetPath()];
if (mapItem && mapItem->m_dateTime==pItem->m_dateTime && mapItem->HasMusicInfoTag() && mapItem->GetMusicInfoTag()->Loaded())
{ // Query map if we previously cached the file on HD
*pItem->GetMusicInfoTag() = *mapItem->GetMusicInfoTag();
if (mapItem->HasArt("thumb"))
pItem->SetArt("thumb", mapItem->GetArt("thumb"));
}
else
{
std::string strPath = URIUtils::GetDirectory(pItem->GetPath());
URIUtils::AddSlashAtEnd(strPath);
if (strPath!=m_strPrevPath)
{
// The item is from another directory as the last one,
// query the database for the new directory...
m_musicDatabase.GetSongsByPath(strPath, m_songsMap);
m_databaseHits++;
}
MAPSONGS::iterator it = m_songsMap.find(pItem->GetPath());
if (it != m_songsMap.end())
{ // Have we loaded this item from database before
pItem->GetMusicInfoTag()->SetSong(it->second);
pItem->GetMusicInfoTag()->SetCueSheet(m_musicDatabase.LoadCuesheet(it->second.strFileName));
if (!it->second.strThumb.empty())
pItem->SetArt("thumb", it->second.strThumb);
}
else if (pItem->IsMusicDb())
{ // a music db item that doesn't have tag loaded - grab details from the database
XFILE::MUSICDATABASEDIRECTORY::CQueryParams param;
XFILE::MUSICDATABASEDIRECTORY::CDirectoryNode::GetDatabaseInfo(pItem->GetPath(),param);
CSong song;
if (m_musicDatabase.GetSong(param.GetSongId(), song))
{
pItem->GetMusicInfoTag()->SetSong(song);
if (!song.strThumb.empty())
pItem->SetArt("thumb", song.strThumb);
}
}
else if (CSettings::GetInstance().GetBool(CSettings::SETTING_MUSICFILES_USETAGS) || pItem->IsCDDA())
{ // Nothing found, load tag from file,
// always try to load cddb info
// get correct tag parser
unique_ptr<IMusicInfoTagLoader> pLoader (CMusicInfoTagLoaderFactory::CreateLoader(*pItem));
if (NULL != pLoader.get())
// get tag
pLoader->Load(pItem->GetPath(), *pItem->GetMusicInfoTag());
m_tagReads++;
}
m_strPrevPath = strPath;
}
}
return true;
}
示例8: GetField
bool CFileItemHandler::GetField(const std::string &field, const CVariant &info, const CFileItemPtr &item, CVariant &result, bool &fetchedArt, CThumbLoader *thumbLoader /* = NULL */)
{
if (result.isMember(field) && !result[field].empty())
return true;
// overwrite serialized values
if (item)
{
if (field == "mimetype" && item->GetMimeType().empty())
{
item->FillInMimeType(false);
result[field] = item->GetMimeType();
return true;
}
}
// check for serialized values
if (info.isMember(field) && !info[field].isNull())
{
result[field] = info[field];
return true;
}
// check if the field requires special handling
if (item)
{
if (item->IsAlbum())
{
if (field == "albumlabel")
{
result[field] = item->GetProperty("album_label");
return true;
}
if (item->HasProperty("album_" + field + "_array"))
{
result[field] = item->GetProperty("album_" + field + "_array");
return true;
}
if (item->HasProperty("album_" + field))
{
result[field] = item->GetProperty("album_" + field);
return true;
}
}
if (item->HasProperty("artist_" + field + "_array"))
{
result[field] = item->GetProperty("artist_" + field + "_array");
return true;
}
if (item->HasProperty("artist_" + field))
{
result[field] = item->GetProperty("artist_" + field);
return true;
}
if (field == "art")
{
if (thumbLoader != NULL && item->GetArt().size() <= 0 && !fetchedArt &&
((item->HasVideoInfoTag() && item->GetVideoInfoTag()->m_iDbId > -1) || (item->HasMusicInfoTag() && item->GetMusicInfoTag()->GetDatabaseId() > -1)))
{
thumbLoader->FillLibraryArt(*item);
fetchedArt = true;
}
CGUIListItem::ArtMap artMap = item->GetArt();
CVariant artObj(CVariant::VariantTypeObject);
for (CGUIListItem::ArtMap::const_iterator artIt = artMap.begin(); artIt != artMap.end(); ++artIt)
{
if (!artIt->second.empty())
artObj[artIt->first] = CTextureUtils::GetWrappedImageURL(artIt->second);
}
result["art"] = artObj;
return true;
}
if (field == "thumbnail")
{
if (thumbLoader != NULL && !item->HasArt("thumb") && !fetchedArt &&
((item->HasVideoInfoTag() && item->GetVideoInfoTag()->m_iDbId > -1) || (item->HasMusicInfoTag() && item->GetMusicInfoTag()->GetDatabaseId() > -1)))
{
thumbLoader->FillLibraryArt(*item);
fetchedArt = true;
}
else if (item->HasPictureInfoTag() && !item->HasArt("thumb"))
item->SetArt("thumb", CTextureUtils::GetWrappedThumbURL(item->GetPath()));
if (item->HasArt("thumb"))
result["thumbnail"] = CTextureUtils::GetWrappedImageURL(item->GetArt("thumb"));
else
result["thumbnail"] = "";
return true;
}
if (field == "fanart")
{
if (thumbLoader != NULL && !item->HasArt("fanart") && !fetchedArt &&
((item->HasVideoInfoTag() && item->GetVideoInfoTag()->m_iDbId > -1) || (item->HasMusicInfoTag() && item->GetMusicInfoTag()->GetDatabaseId() > -1)))
//.........这里部分代码省略.........
示例9: pItem
bool GroupUtils::Group(GroupBy groupBy, const std::string &baseDir, const CFileItemList &items, CFileItemList &groupedItems, GroupAttribute groupAttributes /* = GroupAttributeNone */)
{
if (items.Size() <= 0 || groupBy == GroupByNone)
return false;
SetMap setMap;
for (int index = 0; index < items.Size(); index++)
{
bool add = true;
const CFileItemPtr item = items.Get(index);
// group by sets
if ((groupBy & GroupBySet) &&
item->HasVideoInfoTag() && item->GetVideoInfoTag()->m_iSetId > 0)
{
add = false;
setMap[item->GetVideoInfoTag()->m_iSetId].insert(item);
}
if (add)
groupedItems.Add(item);
}
if ((groupBy & GroupBySet) && setMap.size() > 0)
{
CVideoDbUrl itemsUrl;
if (!itemsUrl.FromString(baseDir))
return false;
for (SetMap::const_iterator set = setMap.begin(); set != setMap.end(); set++)
{
// only one item in the set, so just re-add it
if (set->second.size() == 1 && (groupAttributes & GroupAttributeIgnoreSingleItems))
{
groupedItems.Add(*set->second.begin());
continue;
}
CFileItemPtr pItem(new CFileItem((*set->second.begin())->GetVideoInfoTag()->m_strSet));
pItem->GetVideoInfoTag()->m_iDbId = set->first;
pItem->GetVideoInfoTag()->m_type = "set";
std::string basePath = StringUtils::Format("videodb://1/7/%ld/", set->first);
CVideoDbUrl videoUrl;
if (!videoUrl.FromString(basePath))
pItem->SetPath(basePath);
else
{
videoUrl.AddOptions(itemsUrl.GetOptionsString());
pItem->SetPath(videoUrl.ToString());
}
pItem->m_bIsFolder = true;
CVideoInfoTag* setInfo = pItem->GetVideoInfoTag();
setInfo->m_strPath = pItem->GetPath();
setInfo->m_strTitle = pItem->GetLabel();
int ratings = 0;
int iWatched = 0; // have all the movies been played at least once?
std::set<CStdString> pathSet;
for (std::set<CFileItemPtr>::const_iterator movie = set->second.begin(); movie != set->second.end(); movie++)
{
CVideoInfoTag* movieInfo = (*movie)->GetVideoInfoTag();
// handle rating
if (movieInfo->m_fRating > 0.0f)
{
ratings++;
setInfo->m_fRating += movieInfo->m_fRating;
}
// handle year
if (movieInfo->m_iYear > setInfo->m_iYear)
setInfo->m_iYear = movieInfo->m_iYear;
// handle lastplayed
if (movieInfo->m_lastPlayed.IsValid() && movieInfo->m_lastPlayed > setInfo->m_lastPlayed)
setInfo->m_lastPlayed = movieInfo->m_lastPlayed;
// handle dateadded
if (movieInfo->m_dateAdded.IsValid() && movieInfo->m_dateAdded > setInfo->m_dateAdded)
setInfo->m_dateAdded = movieInfo->m_dateAdded;
// handle playcount/watched
setInfo->m_playCount += movieInfo->m_playCount;
if (movieInfo->m_playCount > 0)
iWatched++;
//accumulate the path for a multipath construction
CFileItem video(movieInfo->m_basePath, false);
if (video.IsVideo())
pathSet.insert(URIUtils::GetParentPath(movieInfo->m_basePath));
else
pathSet.insert(movieInfo->m_basePath);
}
setInfo->m_basePath = XFILE::CMultiPathDirectory::ConstructMultiPath(pathSet);
if (ratings > 1)
pItem->GetVideoInfoTag()->m_fRating /= ratings;
setInfo->m_playCount = iWatched >= (int)set->second.size() ? (setInfo->m_playCount / set->second.size()) : 0;
//.........这里部分代码省略.........
示例10: bPlaying
/**
* This method tries to determine what type of disc is located in the given drive and starts to play the content appropriately.
*/
bool CAutorun::RunDisc(IDirectory* pDir, const std::string& strDrive, int& nAddedToPlaylist, bool bRoot, bool bypassSettings /* = false */, bool startFromBeginning /* = false */)
{
bool bPlaying(false);
CFileItemList vecItems;
const CURL pathToUrl(strDrive);
if ( !pDir->GetDirectory( pathToUrl, vecItems ) )
{
return false;
}
// Sorting necessary for easier HDDVD handling
vecItems.Sort(SortByLabel, SortOrderAscending);
bool bAllowVideo = true;
// bool bAllowPictures = true;
bool bAllowMusic = true;
if (!g_passwordManager.IsMasterLockUnlocked(false))
{
bAllowVideo = !CProfilesManager::Get().GetCurrentProfile().videoLocked();
// bAllowPictures = !CProfilesManager::Get().GetCurrentProfile().picturesLocked();
bAllowMusic = !CProfilesManager::Get().GetCurrentProfile().musicLocked();
}
// is this a root folder we have to check the content to determine a disc type
if( bRoot )
{
std::string hddvdname = "";
CFileItemPtr phddvdItem;
// check root folders next, for normal structured dvd's
for (int i = 0; i < vecItems.Size(); i++)
{
CFileItemPtr pItem = vecItems[i];
// is the current item a (non system) folder?
if (pItem->m_bIsFolder && pItem->GetPath() != "." && pItem->GetPath() != "..")
{
std::string name = pItem->GetPath();
URIUtils::RemoveSlashAtEnd(name);
name = URIUtils::GetFileName(name);
// Check if the current foldername indicates a DVD structure (name is "VIDEO_TS")
if (StringUtils::EqualsNoCase(name, "VIDEO_TS") && bAllowVideo
&& (bypassSettings || CSettings::Get().GetBool("dvds.autorun")))
{
std::string path = URIUtils::AddFileToFolder(pItem->GetPath(), "VIDEO_TS.IFO");
if(!CFile::Exists(path))
path = URIUtils::AddFileToFolder(pItem->GetPath(), "video_ts.ifo");
CFileItemPtr item(new CFileItem(path, false));
item->SetLabel(g_mediaManager.GetDiskLabel(strDrive));
item->GetVideoInfoTag()->m_strFileNameAndPath = g_mediaManager.GetDiskUniqueId(strDrive);
if (!startFromBeginning && !item->GetVideoInfoTag()->m_strFileNameAndPath.empty())
item->m_lStartOffset = STARTOFFSET_RESUME;
g_playlistPlayer.ClearPlaylist(PLAYLIST_VIDEO);
g_playlistPlayer.SetShuffle (PLAYLIST_VIDEO, false);
g_playlistPlayer.Add(PLAYLIST_VIDEO, item);
g_playlistPlayer.SetCurrentPlaylist(PLAYLIST_VIDEO);
g_playlistPlayer.Play(0);
return true;
}
// Check if the current foldername indicates a Blu-Ray structure (default is "BDMV").
// A BR should also include an "AACS" folder for encryption, Sony-BRs can also include update folders for PS3 (PS3_UPDATE / PS3_VPRM).
// ToDo: for the time beeing, the DVD autorun settings are used to determine if the BR should be started automatically.
if (StringUtils::EqualsNoCase(name, "BDMV") && bAllowVideo
&& (bypassSettings || CSettings::Get().GetBool("dvds.autorun")))
{
CFileItemPtr item(new CFileItem(URIUtils::AddFileToFolder(pItem->GetPath(), "index.bdmv"), false));
item->SetLabel(g_mediaManager.GetDiskLabel(strDrive));
item->GetVideoInfoTag()->m_strFileNameAndPath = g_mediaManager.GetDiskUniqueId(strDrive);
if (!startFromBeginning && !item->GetVideoInfoTag()->m_strFileNameAndPath.empty())
item->m_lStartOffset = STARTOFFSET_RESUME;
g_playlistPlayer.ClearPlaylist(PLAYLIST_VIDEO);
g_playlistPlayer.SetShuffle (PLAYLIST_VIDEO, false);
if (!CGUIWindowVideoBase::ShowPlaySelection(item))
return false;
g_playlistPlayer.Add(PLAYLIST_VIDEO, item);
g_playlistPlayer.SetCurrentPlaylist(PLAYLIST_VIDEO);
g_playlistPlayer.Play(0);
return true;
}
// Check if the current foldername indicates a HD DVD structure (default is "HVDVD_TS").
// Most HD DVD will also include an "ADV_OBJ" folder for advanced content. This folder should be handled first.
// ToDo: for the time beeing, the DVD autorun settings are used to determine if the HD DVD should be started automatically.
CFileItemList items, sitems;
// Advanced Content HD DVD (most discs?)
if (StringUtils::EqualsNoCase(name, "ADV_OBJ"))
{
CLog::Log(LOGINFO,"HD DVD: Checking for playlist.");
// find playlist file
//.........这里部分代码省略.........
示例11: HandleFileItem
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().empty())
object["file"] = item->GetVideoInfoTag()->GetPath().c_str();
if (item->HasMusicInfoTag() && !item->GetMusicInfoTag()->GetURL().empty())
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->HasEPGInfoTag() && item->GetEPGInfoTag()->UniqueBroadcastID() > 0)
object[ID] = item->GetEPGInfoTag()->UniqueBroadcastID();
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->HasEPGInfoTag())
FillDetails(item->GetEPGInfoTag(), 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();
//.........这里部分代码省略.........
示例12: lock
// NB: The rar manager expects paths in rars to be terminated with a "\".
bool CRarManager::GetFilesInRar(CFileItemList& vecpItems, const std::string& strRarPath,
bool bMask, const std::string& strPathInRar)
{
#ifdef HAS_FILESYSTEM_RAR
CSingleLock lock(m_CritSection);
ArchiveList_struct* pFileList = NULL;
map<std::string,pair<ArchiveList_struct*,vector<CFileInfo> > >::iterator it = m_ExFiles.find(strRarPath);
if (it == m_ExFiles.end())
{
if( urarlib_list((char*) strRarPath.c_str(), &pFileList, NULL) )
m_ExFiles.insert(make_pair(strRarPath,make_pair(pFileList,vector<CFileInfo>())));
else
{
if( pFileList ) urarlib_freelist(pFileList);
return false;
}
}
else
pFileList = it->second.first;
CFileItemPtr pFileItem;
vector<std::string> vec;
set<std::string> dirSet;
StringUtils::Tokenize(strPathInRar,vec,"/");
unsigned int iDepth = vec.size();
ArchiveList_struct* pIterator;
std::string strCompare = strPathInRar;
if (!URIUtils::HasSlashAtEnd(strCompare) && !strCompare.empty())
strCompare += '/';
for( pIterator = pFileList; pIterator ; pIterator ? pIterator = pIterator->next : NULL)
{
std::string strName;
/* convert to utf8 */
if( pIterator->item.NameW && wcslen(pIterator->item.NameW) > 0)
g_charsetConverter.wToUTF8(pIterator->item.NameW, strName);
else
g_charsetConverter.unknownToUTF8(pIterator->item.Name, strName);
/* replace back slashes into forward slashes */
/* this could get us into troubles, file could two different files, one with / and one with \ */
StringUtils::Replace(strName, '\\', '/');
if (bMask)
{
if (!strstr(strName.c_str(),strCompare.c_str()))
continue;
vec.clear();
StringUtils::Tokenize(strName,vec,"/");
if (vec.size() < iDepth)
continue;
}
unsigned int iMask = (pIterator->item.HostOS==3 ? 0x0040000:16); // win32 or unix attribs?
if (((pIterator->item.FileAttr & iMask) == iMask) || (vec.size() > iDepth+1 && bMask)) // we have a directory
{
if (!bMask) continue;
if (vec.size() == iDepth)
continue; // remove root of listing
if (dirSet.find(vec[iDepth]) == dirSet.end())
{
dirSet.insert(vec[iDepth]);
pFileItem.reset(new CFileItem(vec[iDepth]));
pFileItem->SetPath(vec[iDepth] + '/');
pFileItem->m_bIsFolder = true;
pFileItem->m_idepth = pIterator->item.Method;
pFileItem->m_iDriveType = pIterator->item.HostOS;
//pFileItem->m_lEndOffset = long(pIterator->item.iOffset);
}
}
else
{
if (vec.size() == iDepth+1 || !bMask)
{
if (vec.size() == 0)
pFileItem.reset(new CFileItem(strName));
else
pFileItem.reset(new CFileItem(vec[iDepth]));
pFileItem->SetPath(strName.c_str()+strPathInRar.size());
pFileItem->m_dwSize = pIterator->item.UnpSize;
pFileItem->m_idepth = pIterator->item.Method;
pFileItem->m_iDriveType = pIterator->item.HostOS;
//pFileItem->m_lEndOffset = long(pIterator->item.iOffset);
}
}
if (pFileItem)
vecpItems.Add(pFileItem);
pFileItem.reset();
}
return vecpItems.Size() > 0;
#else
return false;
#endif
}
示例13: pNode
// Add an "* All ..." folder to the CFileItemList
// depending on the child node
void CDirectoryNode::AddQueuingFolder(CFileItemList& items) const
{
CFileItemPtr pItem;
// always hide "all" items
if (g_advancedSettings.m_bVideoLibraryHideAllItems)
return;
// no need for "all" item when only one item
if (items.GetObjectCount() <= 1)
return;
// hack - as the season node might return episodes
auto_ptr<CDirectoryNode> pNode(ParseURL(items.GetPath()));
switch (pNode->GetChildType())
{
case NODE_TYPE_SEASONS:
{
CStdString strLabel = g_localizeStrings.Get(20366);
pItem.reset(new CFileItem(strLabel)); // "All Seasons"
pItem->SetPath(BuildPath() + "-1/");
// set the number of watched and unwatched items accordingly
int watched = 0;
int unwatched = 0;
for (int i = 0; i < items.Size(); i++)
{
CFileItemPtr item = items[i];
watched += (int)item->GetProperty("watchedepisodes").asInteger();
unwatched += (int)item->GetProperty("unwatchedepisodes").asInteger();
}
pItem->SetProperty("totalepisodes", watched + unwatched);
pItem->SetProperty("numepisodes", watched + unwatched); // will be changed later to reflect watchmode setting
pItem->SetProperty("watchedepisodes", watched);
pItem->SetProperty("unwatchedepisodes", unwatched);
if (items.Size() && items[0]->GetVideoInfoTag())
{
*pItem->GetVideoInfoTag() = *items[0]->GetVideoInfoTag();
pItem->GetVideoInfoTag()->m_iSeason = -1;
}
pItem->GetVideoInfoTag()->m_strTitle = strLabel;
pItem->GetVideoInfoTag()->m_iEpisode = watched + unwatched;
pItem->GetVideoInfoTag()->m_playCount = (unwatched == 0) ? 1 : 0;
CVideoDatabase db;
if (db.Open())
{
pItem->GetVideoInfoTag()->m_iDbId = db.GetSeasonId(pItem->GetVideoInfoTag()->m_iIdShow, -1);
db.Close();
}
pItem->GetVideoInfoTag()->m_type = "season";
}
break;
default:
break;
}
if (pItem)
{
pItem->m_bIsFolder = true;
pItem->SetSpecialSort(g_advancedSettings.m_bVideoLibraryAllItemsOnBottom ? SortSpecialOnBottom : SortSpecialOnTop);
pItem->SetCanQueue(false);
items.Add(pItem);
}
}
示例14: GetPlaylist
bool CPlayListPlayer::Play(int iSong, bool bAutoPlay /* = false */, bool bPlayPrevious /* = false */)
{
if (m_iCurrentPlayList == PLAYLIST_NONE)
return false;
CPlayList& playlist = GetPlaylist(m_iCurrentPlayList);
if (playlist.size() <= 0)
return false;
if (iSong < 0)
iSong = 0;
if (iSong >= playlist.size())
iSong = playlist.size() - 1;
// check if the item itself is a playlist, and can be expanded
// only allow a few levels, this could end up in a loop
// if they refer to each other in a loop
for(int i=0;i<5;i++)
{
if(!playlist.Expand(iSong))
break;
}
m_iCurrentSong = iSong;
CFileItemPtr item = playlist[m_iCurrentSong];
playlist.SetPlayed(true);
m_bPlaybackStarted = false;
unsigned int playAttempt = XbmcThreads::SystemClockMillis();
if (!g_application.PlayFile(*item, bAutoPlay))
{
CLog::Log(LOGERROR,"Playlist Player: skipping unplayable item: %i, path [%s]", m_iCurrentSong, item->GetPath().c_str());
playlist.SetUnPlayable(m_iCurrentSong);
// abort on 100 failed CONSECTUTIVE songs
if (!m_iFailedSongs)
m_failedSongsStart = playAttempt;
m_iFailedSongs++;
if ((m_iFailedSongs >= g_advancedSettings.m_playlistRetries && g_advancedSettings.m_playlistRetries >= 0)
|| ((XbmcThreads::SystemClockMillis() - m_failedSongsStart >= (unsigned int)g_advancedSettings.m_playlistTimeout * 1000) && g_advancedSettings.m_playlistTimeout))
{
CLog::Log(LOGDEBUG,"Playlist Player: one or more items failed to play... aborting playback");
// open error dialog
CGUIDialogOK::ShowAndGetInput(16026, 16027, 16029, 0);
CGUIMessage msg(GUI_MSG_PLAYLISTPLAYER_STOPPED, 0, 0, m_iCurrentPlayList, m_iCurrentSong);
g_windowManager.SendThreadMessage(msg);
Reset();
GetPlaylist(m_iCurrentPlayList).Clear();
m_iCurrentPlayList = PLAYLIST_NONE;
m_iFailedSongs = 0;
m_failedSongsStart = 0;
return false;
}
// how many playable items are in the playlist?
if (playlist.GetPlayable() > 0)
{
return bPlayPrevious ? PlayPrevious() : PlayNext();
}
// none? then abort playback
else
{
CLog::Log(LOGDEBUG,"Playlist Player: no more playable items... aborting playback");
CGUIMessage msg(GUI_MSG_PLAYLISTPLAYER_STOPPED, 0, 0, m_iCurrentPlayList, m_iCurrentSong);
g_windowManager.SendThreadMessage(msg);
Reset();
m_iCurrentPlayList = PLAYLIST_NONE;
return false;
}
}
// TODO - move the above failure logic and the below success logic
// to callbacks instead so we don't rely on the return value
// of PlayFile()
// consecutive error counter so reset if the current item is playing
m_iFailedSongs = 0;
m_failedSongsStart = 0;
m_bPlaybackStarted = true;
m_bPlayedFirstFile = true;
return true;
}
示例15: if
//.........这里部分代码省略.........
if (m_type.Equals("movies"))
basePath += "6/";
else if (m_type.Equals("musicvideos") || m_type.Equals("mixed"))
basePath += "7/";
else
basePath += "5/";
videodatabase.GetStudiosNav(basePath, items, type);
iLabel = 572;
}
else if (m_rule.m_field == FieldWriter)
{
videodatabase.GetWritersNav(basePath, items, type);
iLabel = 20417;
}
else if (m_rule.m_field == FieldTvShowTitle)
{
videodatabase.GetTvShowsNav("videodb://2/2/",items);
iLabel = 20343;
}
else if (m_rule.m_field == FieldPlaylist)
{
// use filebrowser to grab another smart playlist
// Note: This can cause infinite loops (playlist that refers to the same playlist) but I don't
// think there's any decent way to deal with this, as the infinite loop may be an arbitrary
// number of playlists deep, eg playlist1 -> playlist2 -> playlist3 ... -> playlistn -> playlist1
CStdString path = "special://videoplaylists/";
if (m_type.Equals("songs") || m_type.Equals("albums"))
path = "special://musicplaylists/";
XFILE::CDirectory::GetDirectory(path, items, ".xsp", XFILE::DIR_FLAG_NO_FILE_DIRS);
for (int i = 0; i < items.Size(); i++)
{
CFileItemPtr item = items[i];
CSmartPlaylist playlist;
if (playlist.OpenAndReadName(item->GetPath()))
item->SetLabel(playlist.GetName());
}
iLabel = 559;
}
else if (m_rule.m_field == FieldPath)
{
VECSOURCES sources;
if (m_type == "songs" || m_type == "mixed")
sources = *g_settings.GetSourcesFromType("music");
if (m_type != "songs")
{
VECSOURCES sources2 = *g_settings.GetSourcesFromType("video");
sources.insert(sources.end(),sources2.begin(),sources2.end());
}
g_mediaManager.GetLocalDrives(sources);
CStdString path = m_rule.GetLocalizedParameter(m_type);
CGUIDialogFileBrowser::ShowAndGetDirectory(sources, g_localizeStrings.Get(657), path, false);
if (m_rule.m_parameter.size() > 0)
m_rule.m_parameter.clear();
if (!path.empty())
m_rule.m_parameter.push_back(path);
UpdateButtons();
return;
}
else if (m_rule.m_field == FieldSet)
{
videodatabase.GetSetsNav("videodb://1/7/", items, VIDEODB_CONTENT_MOVIES);
iLabel = 20434;