/** * \fn UPNPScanner::GetInitialMetadata * Fill the given metadata_list and meta_dir_node with the root media * server metadata (i.e. the MediaServers) and any additional metadata that * that has already been scanned and cached. */ void UPNPScanner::GetInitialMetadata(VideoMetadataListManager::metadata_list* list, meta_dir_node *node) { // nothing to see.. QMap<QString,QString> servers = ServerList(); if (servers.isEmpty()) return; // Add MediaServers LOG(VB_GENERAL, LOG_INFO, QString("Adding MediaServer metadata.")); smart_dir_node mediaservers = node->addSubDir(tr("Media Servers")); mediaservers->setPathRoot(); m_lock.lock(); QMutableHashIterator<QString,MediaServer*> it(m_servers); while (it.hasNext()) { it.next(); if (!it.value()->m_subscribed) continue; QString usn = it.key(); GetServerContent(usn, it.value(), list, mediaservers.get()); } m_lock.unlock(); }
/** * \fn UPNPScanner::GetMetadata * Fill the given metadata_list and meta_dir_node with the metadata * of content retrieved from known media servers. */ void UPNPScanner::GetMetadata(VideoMetadataListManager::metadata_list* list, meta_dir_node *node) { // nothing to see.. QMap<QString,QString> servers = ServerList(); if (servers.isEmpty()) return; // Start scanning if it isn't already running StartFullScan(); // wait for the scanner to complete - with a 30 second timeout LOG(VB_GENERAL, LOG_INFO, LOC + "Waiting for scan to complete."); int count = 0; while (!m_scanComplete && (count++ < 300)) usleep(100000); // some scans may just take too long (PlayOn) if (!m_scanComplete) LOG(VB_GENERAL, LOG_ERR, LOC + "MediaServer scan is incomplete."); else LOG(VB_GENERAL, LOG_INFO, LOC + "MediaServer scanning finished."); smart_dir_node mediaservers = node->addSubDir(tr("Media Servers")); m_lock.lock(); QMutableHashIterator<QString,MediaServer*> it(m_servers); while (it.hasNext()) { it.next(); GetServerContent(it.value(), list, mediaservers.get()); } m_lock.unlock(); }
/** * \fn UPNPScanner::GetServerContent * Recursively search a MediaServerItem for video metadata and add it to * the metadata_list and meta_dir_node. */ void UPNPScanner::GetServerContent(MediaServerItem *content, VideoMetadataListManager::metadata_list* list, meta_dir_node *node) { if (content->m_url.isEmpty()) { smart_dir_node container = node->addSubDir(content->m_name); QMutableMapIterator<QString,MediaServerItem> it(content->m_children); while (it.hasNext()) { it.next(); GetServerContent(&it.value(), list, container.get()); } return; } VideoMetadataListManager::VideoMetadataPtr item(new VideoMetadata(content->m_url)); item->SetTitle(content->m_name); list->push_back(item); node->addEntry(smart_meta_node(new meta_data_node(item.get()))); }
/** * \fn UPNPScanner::GetServerContent * Recursively search a MediaServerItem for video metadata and add it to * the metadata_list and meta_dir_node. */ void UPNPScanner::GetServerContent(QString &usn, MediaServerItem *content, VideoMetadataListManager::metadata_list* list, meta_dir_node *node) { if (!content->m_scanned) { smart_dir_node subnode = node->addSubDir(content->m_name); QStringList data; data << usn; data << content->m_id; subnode->SetData(data); VideoMetadataListManager::VideoMetadataPtr item(new VideoMetadata(QString())); item->SetTitle(QString("Dummy")); list->push_back(item); subnode->addEntry(smart_meta_node(new meta_data_node(item.get()))); return; } node->SetData(QVariant()); if (content->m_url.isEmpty()) { smart_dir_node container = node->addSubDir(content->m_name); QMutableMapIterator<QString,MediaServerItem> it(content->m_children); while (it.hasNext()) { it.next(); GetServerContent(usn, &it.value(), list, container.get()); } return; } VideoMetadataListManager::VideoMetadataPtr item(new VideoMetadata(content->m_url)); item->SetTitle(content->m_name); list->push_back(item); node->addEntry(smart_meta_node(new meta_data_node(item.get()))); }