MythTV  master
videolist.cpp
Go to the documentation of this file.
1 // C++
2 #include <algorithm>
3 #include <iterator>
4 #include <map>
5 #include <utility>
6 
7 // Qt
8 #include <QFileInfo>
9 #include <QList>
10 #include <QScopedPointer>
11 
12 // MythTV
13 #include "libmyth/mythcontext.h"
14 #include "libmythbase/mythdate.h"
15 #include "libmythbase/stringutil.h"
23 
24 // MythFrontend
25 #include "upnpscanner.h"
26 #include "videodlg.h"
27 #include "videofilter.h"
28 #include "videolist.h"
29 
30 // Sorting or not sorting the metadata list doesn't seem to have any
31 // effect. The metadataViewFlat and metadataViewTree that are
32 // constructed from this list get sorted, and those are what is used
33 // to build the UI screens.
34 #undef SORT_METADATA_LIST
35 
37 {
38  public:
39  explicit TreeNodeDataPrivate(VideoMetadata *metadata) :
40  m_metadata(metadata)
41  {
42  if (m_metadata)
44  else
45  m_host = "";
46  }
47 
48  TreeNodeDataPrivate(QString path, QString host, QString prefix) :
49  m_host(std::move(host)), m_path(std::move(path)), m_prefix(std::move(prefix))
50  {
51  }
52 
54  {
55  return m_metadata;
56  }
57 
58  const VideoMetadata *GetMetadata(void) const
59  {
60  return m_metadata;
61  }
62 
63  QString GetPath(void) const
64  {
65  return m_path;
66  }
67 
68  QString GetHost(void) const
69  {
70  return m_host;
71  }
72 
73  QString GetPrefix(void) const
74  {
75  return m_prefix;
76  }
77 
78  private:
80  QString m_host;
81  QString m_path;
82  QString m_prefix;
83 };
84 
86 {
87  m_d = new TreeNodeDataPrivate(metadata);
88 }
89 
90 TreeNodeData::TreeNodeData(QString path, QString host, QString prefix)
91 {
92  m_d = new TreeNodeDataPrivate(std::move(path), std::move(host), std::move(prefix));
93 }
94 
96 {
97  *this = other;
98 }
99 
101 {
102  if (this != &rhs)
103  {
104  delete m_d;
105  m_d = new TreeNodeDataPrivate(*rhs.m_d);
106  }
107 
108  return *this;
109 }
110 
112 {
113  delete m_d;
114 }
115 
117 {
118  if (m_d)
119  return m_d->GetMetadata();
120 
121  return nullptr;
122 }
123 
124 const VideoMetadata *TreeNodeData::GetMetadata(void) const
125 {
126  if (m_d)
127  return m_d->GetMetadata();
128 
129  return nullptr;
130 }
131 
132 QString TreeNodeData::GetPath(void) const
133 {
134  if (m_d)
135  return m_d->GetPath();
136  return {};
137 }
138 
139 QString TreeNodeData::GetHost(void) const
140 {
141  if (m_d)
142  return m_d->GetHost();
143  return {};
144 }
145 
146 QString TreeNodeData::GetPrefix(void) const
147 {
148  if (m_d)
149  return m_d->GetPrefix();
150  return {};
151 }
152 
155 {
156  explicit metadata_sort(const VideoFilterSettings &vfs) : m_vfs(vfs) {}
157 
158  bool operator()(const VideoMetadata *lhs, const VideoMetadata *rhs)
159  {
160  return m_vfs.meta_less_than(*lhs, *rhs);
161  }
162 
163  bool operator()(const smart_meta_node &lhs, const smart_meta_node &rhs)
164  {
165  return m_vfs.meta_less_than(*(lhs->getData()), *(rhs->getData()));
166  }
167 
168  private:
170 };
171 
173 {
174  explicit metadata_path_sort(void) = default;
175 
176  bool operator()(const VideoMetadata &lhs, const VideoMetadata &rhs)
177  {
178  return sort(&lhs, &rhs);
179  }
180 
181  bool operator()(const VideoMetadata *lhs, const VideoMetadata *rhs)
182  {
183  return sort(lhs, rhs);
184  }
185 
186  bool operator()(const smart_dir_node &lhs, const smart_dir_node &rhs)
187  {
188  return sort(lhs->getSortPath(), rhs->getSortPath());
189  }
190 
191  private:
192  static bool sort(const VideoMetadata *lhs, const VideoMetadata *rhs)
193  {
194  return sort(lhs->GetSortFilename(), rhs->GetSortFilename());
195  }
196 
197  static bool sort(const QString &lhs, const QString &rhs)
198  {
199  return StringUtil::naturalSortCompare(lhs, rhs);
200  }
201 };
202 
203 static QString path_to_node_name(const QString &path)
204 {
205  QString ret;
206  int slashLoc = path.lastIndexOf('/', -2) + 1;
207  if (path.endsWith("/"))
208  ret = path.mid(slashLoc, path.length() - slashLoc - 1);
209  else
210  ret = path.mid(slashLoc);
211 
212  return ret;
213 }
214 
216  meta_dir_node *dir,
217  meta_dir_node *hint = nullptr)
218 {
219  meta_dir_node *start = dir;
220  QString insert_chunk = metadata->GetFilename();
221  QString host = metadata->GetHost();
222  QString prefix = metadata->GetPrefix();
223 
224  if (hint)
225  {
226  if (metadata->GetFilename().startsWith(hint->getFQPath() + "/"))
227  {
228  start = hint;
229  insert_chunk =
230  metadata->GetFilename().mid(hint->getFQPath().length());
231  }
232  }
233 
234  if (insert_chunk.startsWith(dir->getFQPath() + "/"))
235  {
236  insert_chunk = metadata->GetFilename().mid(dir->getFQPath().length());
237  }
238 
239  QStringList path = insert_chunk.split("/", Qt::SkipEmptyParts);
240  if (path.size() > 1)
241  {
242  path.pop_back();
243  }
244  else
245  {
246  path.clear();
247  }
248 
249  for (const auto & part : std::as_const(path))
250  {
251  smart_dir_node sdn = start->addSubDir(part, "" , host, prefix);
252  start = sdn.get();
253  }
254 
255  start->addEntry(smart_meta_node(new meta_data_node(metadata)));
256 
257  return start;
258 }
259 
261 {
263  {
264  return smn->getData();
265  }
266 
268  {
269  return &data;
270  }
271 
274  {
275  return data.get();
276  }
277 };
278 
280  MythGenericTree *where_to_add,
281  const QString& name, QString fqPath, bool add_up_dirs,
282  QString host = "", QString prefix = "")
283 {
284  // Add the subdir node...
285  MythGenericTree *sub_node =
286  where_to_add->addNode(name, kSubFolder, false);
287  sub_node->SetData(QVariant::fromValue(TreeNodeData(std::move(fqPath), std::move(host), std::move(prefix))));
288  sub_node->SetText(name, "title");
289  sub_node->DisplayState("subfolder", "nodetype");
290 
291  // ...and the updir node.
292  if (add_up_dirs)
293  {
294  MythGenericTree *up_node =
295  sub_node->addNode(where_to_add->GetText(), kUpFolder,
296  true, false);
297  up_node->DisplayState("subfolder", "nodetype");
298  }
299 
300  return sub_node;
301 }
302 
303 int AddFileNode(MythGenericTree *where_to_add, const QString& name,
304  VideoMetadata *metadata)
305 {
306  MythGenericTree *sub_node = where_to_add->addNode(name, 0, true);
307  sub_node->SetData(QVariant::fromValue(TreeNodeData(metadata)));
308  sub_node->SetTextCb( &VideoMetadata::MetadataGetTextCb, metadata);
309  sub_node->SetImageCb(&VideoMetadata::MetadataGetImageCb, metadata);
310  sub_node->SetStateCb(&VideoMetadata::MetadataGetStateCb, metadata);
311 
312  // Assign images to parent node if this is the first child
313  if (where_to_add->visibleChildCount() == 1 &&
314  where_to_add->getInt() == kSubFolder)
315  {
316  InfoMap imageMap;
317  metadata->GetImageMap(imageMap);
318  where_to_add->SetImageFromMap(imageMap);
319  where_to_add->SetImage("buttonimage", imageMap["smartimage"]);
320  }
321 
322  return 1;
323 }
324 
326 {
327  public:
328  using metadata_view_list = std::vector<VideoMetadata *>;
329 
330  private:
339 
340  public:
341  VideoListImp();
342 
344  bool include_updirs);
346  bool filebrowser, bool flatlist,
347  int group_type, const ParentalLevel &parental_level,
348  bool include_updirs);
349 
350  void refreshList(bool filebrowser, const ParentalLevel &parental_level,
351  bool flat_list, int group_type);
352  bool refreshNode(MythGenericTree *node);
353 
354  unsigned int count(void) const
355  {
356  return m_metadataViewFlat.size();
357  }
358 
360  {
361  return m_videoFilter;
362  }
363 
365  {
366  m_videoFilter = filter;
367  }
368 
369  int TryFilter(const VideoFilterSettings &filter) const
370  {
371  auto list = m_metadata.getList();
372  auto filtermatch =
373  [filter](const auto & md){ return filter.matches_filter(*md); };
374  return std::count_if(list.cbegin(), list.cend(), filtermatch);
375  }
376 
378  {
379  return m_metadata;
380  }
381 
382  unsigned int getFilterChangedState(void)
383  {
385  }
386 
387  bool Delete(unsigned int video_id, VideoList &/*dummy*/)
388  {
389  bool ret = false;
390  MetadataPtr mp = m_metadata.byID(video_id);
391  if (mp)
392  {
393  ret = mp->DeleteFile();
394  if (ret)
395  {
396  ret = m_metadata.purgeByID(video_id);
397  // Force refresh
399  }
400  }
401 
402  return ret;
403  }
404 
406  {
407  return m_videoTreeRoot.data();
408  }
409 
411  // Set the type to none to avoid refreshList thinking it doesn't
412  // need to.
414 
415  metadata_list ml;
417  m_metadata.setList(ml);
418  }
419 
420  private:
421  void sort_view_data(bool flat_list);
422  void fillMetadata(metadata_list_type whence);
423 
424  void buildFsysList(void);
425  void buildGroupList(metadata_list_type whence);
426  void buildDbList(void);
427  void buildTVList(void);
428  void buildFileList(smart_dir_node &directory, metadata_list &metalist,
429  const QString &prefix) const;
430 
431  void update_meta_view(bool flat_list);
432 
433  private:
434  bool m_listUnknown {false};
435  bool m_loadMetaData {false};
436 
437  QScopedPointer <MythGenericTree> m_videoTreeRoot;
438 
440  meta_dir_node m_metadataTree; // master list for tree views
441 
444 
446 
448 };
449 
451 {
452  m_imp = new VideoListImp;
453 }
454 
456 {
457  delete m_imp;
458 }
459 
461  bool filebrowser, bool flatlist,
462  int group_type, const ParentalLevel &parental_level,
463  bool include_updirs)
464 {
465  return m_imp->buildVideoList(filebrowser, flatlist,
466  group_type, parental_level, include_updirs);
467 }
468 
469 void VideoList::refreshList(bool filebrowser,
470  const ParentalLevel &parental_level,
471  bool flat_list, int group_type)
472 {
473  m_imp->refreshList(filebrowser, parental_level, flat_list, group_type);
474 }
475 
477 {
478  return m_imp->refreshNode(node);
479 }
480 
481 unsigned int VideoList::count(void) const
482 {
483  return m_imp->count();
484 }
485 
487 {
488  return m_imp->getCurrentVideoFilter();
489 }
490 
492 {
493  m_imp->setCurrentVideoFilter(filter);
494 }
495 
497 {
498  return m_imp->TryFilter(filter);
499 }
500 
502 {
503  return m_imp->getListCache();
504 }
505 
507 {
508  return m_imp->getFilterChangedState();
509 }
510 
511 bool VideoList::Delete(int video_id)
512 {
513  return m_imp->Delete(video_id, *this);
514 }
515 
517 {
518  return m_imp->GetTreeRoot();
519 }
520 
522 {
524 }
525 
527 // VideoListImp
529 VideoListImp::VideoListImp() : m_metadataViewTree("", "top")
530 {
531  m_listUnknown = gCoreContext->GetBoolSetting("VideoListUnknownFileTypes", false);
532 
533  m_loadMetaData = gCoreContext->GetBoolSetting("VideoTreeLoadMetaData", false);
534 }
535 
537  bool include_updirs)
538 {
539  if (src->DataIsValid())
540  {
542  dst->SetData(src->GetData());
543  return;
544  }
545 
546  for (auto dir = src->dirs_begin();
547  dir != src->dirs_end(); ++dir)
548  {
549  if ((*dir)->has_entries())
550  {
551  bool incUpDir = include_updirs;
552  // Only include upnodes when there is a parent to move up to
553  if (!dst->getParent())
554  incUpDir = false;
555 
557  dst, (*dir)->getName(),
558  (*dir)->getFQPath(), incUpDir, (*dir)->GetHost(),
559  (*dir)->GetPrefix());
560 
561  build_generic_tree(t, dir->get(), include_updirs);
562  }
563  }
564 
565  for (auto entry = src->entries_begin();
566  entry != src->entries_end(); ++entry)
567  {
568  if (((*entry)->getData()->GetSeason() > 0) ||
569  ((*entry)->getData()->GetEpisode() > 0))
570  {
571  QString seas = QString::number((*entry)->getData()->GetSeason());
572  QString ep = QString::number((*entry)->getData()->GetEpisode());
573  QString title = (*entry)->getData()->GetTitle();
574  QString subtitle = (*entry)->getData()->GetSubtitle();
575 
576  if (ep.size() < 2)
577  ep.prepend("0");
578 
579  QString displayTitle = QString("%1 %2x%3 - %4")
580  .arg(title, seas, ep, subtitle);
581 
582  if (src->getName() == title)
583  {
584  displayTitle = QString("%2x%3 - %4")
585  .arg(seas, ep, subtitle);
586  }
587  AddFileNode(dst, displayTitle, (*entry)->getData());
588  }
589  else if ((*entry)->getData()->GetSubtitle().isEmpty())
590  {
591  AddFileNode(
592  dst, (*entry)->getData()->GetTitle(), (*entry)->getData());
593  }
594  else
595  {
596  QString TitleSub = QString("%1 - %2")
597  .arg((*entry)->getData()->GetTitle(),
598  (*entry)->getData()->GetSubtitle());
599  AddFileNode(dst, TitleSub, (*entry)->getData());
600  }
601  }
602 }
603 
604 // Build a generic tree containing the video files. You can control the
605 // contents and the shape of the tree in de following ways:
606 // filebrowser:
607 // If true, the actual state of the filesystem is examined. If a video
608 // is already known to the system, this info is retrieved. If not, some
609 // basic info is provided.
610 // If false, only video information already present in the database is
611 // presented.
612 // flatlist:
613 // If true, the tree is reduced to a single level containing all the
614 // videos found.
615 // If false, the hierarchy present on the filesystem or in the database
616 // is preserved. In this mode, both sub-dirs and updirs are present.
618  bool filebrowser, bool flatlist, int group_type,
619  const ParentalLevel &parental_level, bool include_updirs)
620 {
621  refreshList(filebrowser, parental_level, flatlist, group_type);
622 
623  m_videoTreeRoot.reset(new MythGenericTree(QObject::tr("Video Home"),
624  kRootNode, false));
625 
627  include_updirs);
628 
629  if (m_metadataViewFlat.empty())
630  {
631  m_videoTreeRoot.reset(new MythGenericTree(QObject::tr("Video Home"),
632  kRootNode, false));
633  m_videoTreeRoot.data()->addNode(QObject::tr("No files found"),
634  kNoFilesFound, false);
635  }
636 
637  return m_videoTreeRoot.data();
638 }
639 
641 {
642  if (!node)
643  return false;
644 
645  // node->GetData() provides information on how/where to refresh the
646  // data for this node
647 
648  QVariant data = node->GetData();
649  if (!data.isValid())
650  return false;
651 
652  // currently only UPNPScanner can refresh data
653  if (UPNPScanner::Instance() && UPNPScanner::Instance()->GetMetadata(data))
654  {
655  // force a refresh
657  return true;
658  }
659 
660  return false;
661 }
662 
663 void VideoListImp::refreshList(bool filebrowser,
664  const ParentalLevel &parental_level,
665  bool flat_list, int group_type)
666 {
667 
668  m_videoFilter.setParentalLevel(parental_level.GetLevel());
669 
670  if (filebrowser)
671  {
673  }
674  else
675  {
676  switch (group_type)
677  {
680  LOG(VB_GENERAL, LOG_DEBUG, "Using Folder mode");
681  break;
684  LOG(VB_GENERAL, LOG_DEBUG, "Using Genre mode");
685  break;
688  LOG(VB_GENERAL, LOG_DEBUG, "Using Category mode");
689  break;
692  LOG(VB_GENERAL, LOG_DEBUG, "Using Year mode");
693  break;
696  LOG(VB_GENERAL, LOG_DEBUG, "Using Director mode");
697  break;
700  LOG(VB_GENERAL, LOG_DEBUG, "Using Studio mode");
701  break;
704  LOG(VB_GENERAL, LOG_DEBUG, "Using Cast Mode");
705  break;
708  LOG(VB_GENERAL, LOG_DEBUG, "Using User Rating Mode");
709  break;
712  LOG(VB_GENERAL, LOG_DEBUG, "Using Insert Date Mode");
713  break;
716  LOG(VB_GENERAL, LOG_DEBUG, "Using TV/Movie Mode");
717  break;
718  default:
720  break;
721  }
722  }
723  update_meta_view(flat_list);
724 }
725 
726 void VideoListImp::sort_view_data(bool flat_list)
727 {
728  if (flat_list)
729  {
730  sort(m_metadataViewFlat.begin(), m_metadataViewFlat.end(),
732  }
733  else
734  {
737  }
738 }
739 
741 {
742  if (m_metadataListType != whence)
743  {
744  m_metadataListType = whence;
745  // flush existing data
746  metadata_list ml;
747  m_metadata.setList(ml);
749 
750  switch (whence)
751  {
752  case ltFileSystem:
753  buildFsysList();
754  break;
755  case ltDBMetadata:
756  buildDbList();
757  break;
758  case ltTVMetadata:
759  buildTVList();
760  break;
761  case ltDBGenreGroup:
762  case ltDBCategoryGroup:
763  case ltDBYearGroup:
764  case ltDBDirectorGroup:
765  case ltDBStudioGroup:
766  case ltDBCastGroup:
767  case ltDBUserRatingGroup:
768  case ltDBInsertDateGroup:
769  buildGroupList(whence);
770  break;
771  case ltNone:
772  break;
773  }
774  }
775 }
776 
778 {
779  metadata_list ml;
781  m_metadata.setList(ml);
782 
783  metadata_view_list mlist;
784  mlist.reserve(m_metadata.getList().size());
785 
786  std::back_insert_iterator<metadata_view_list> mli(mlist);
787  transform(m_metadata.getList().begin(), m_metadata.getList().end(),
788  mli, to_metadata_ptr());
789 
790 #ifdef SORT_METADATA_LIST
792  std::sort(mlist.begin(), mlist.end(), mps);
793 #endif
794 
795  using group_to_node_map = std::map<QString, meta_dir_node *>;
796  group_to_node_map gtnm;
797 
798  meta_dir_node *video_root = &m_metadataTree;
799 
800  smart_dir_node sdn1 = video_root->addSubDir("All");
801  meta_dir_node* all_group_node = sdn1.get();
802 
803  for (auto *data : mlist)
804  {
805  all_group_node->addEntry(smart_meta_node(new meta_data_node(data)));
806 
807  std::vector<QString> groups;
808  auto take_second = [](const auto& item){ return item.second; };
809 
810  switch (whence)
811  {
812  case ltDBGenreGroup:
813  {
814  const std::vector<std::pair <int, QString> >& genres =
815  data->GetGenres();
816 
817  std::transform(genres.cbegin(), genres.cend(),
818  std::back_inserter(groups), take_second);
819  break;
820  }
821  case ltDBCategoryGroup:
822  {
823  groups.push_back(data->GetCategory());
824  break;
825  }
826  case ltDBYearGroup:
827  {
828  groups.push_back(QString::number(data->GetYear()));
829  break;
830  }
831  case ltDBDirectorGroup:
832  {
833  groups.push_back(data->GetDirector());
834  break;
835  }
836  case ltDBStudioGroup:
837  {
838  groups.push_back(data->GetStudio());
839  break;
840  }
841  case ltDBCastGroup:
842  {
843  const std::vector<std::pair<int, QString> >& cast = data->GetCast();
844 
845  std::transform(cast.cbegin(), cast.cend(),
846  std::back_inserter(groups), take_second);
847  break;
848  }
849  case ltDBUserRatingGroup:
850  {
851  int i = data->GetUserRating();
852  groups.push_back(QString::number(i));
853  break;
854  }
855  case ltDBInsertDateGroup:
856  {
857  QDate date = data->GetInsertdate();
858  QString tmp = MythDate::toString(
860  groups.push_back(tmp);
861  break;
862  }
863  default:
864  {
865  LOG(VB_GENERAL, LOG_ERR, "Invalid type of grouping");
866  break;
867  }
868  }
869 
870  if (groups.empty())
871  {
872  meta_dir_node *group_node = gtnm["Unknown"];
873 
874  if (group_node == nullptr)
875  {
876  smart_dir_node sdn2 = video_root->addSubDir("Unknown");
877  group_node = sdn2.get();
878  gtnm["Unknown"] = group_node;
879  }
880 
881  group_node->addEntry(smart_meta_node(new meta_data_node(data)));
882  }
883 
884  for (const auto& item : groups)
885  {
886  meta_dir_node *group_node = gtnm[item];
887 
888  if (group_node == nullptr)
889  {
890  smart_dir_node sdn2 = video_root->addSubDir(item);
891  group_node = sdn2.get();
892  gtnm[item] = group_node;
893  }
894 
895  group_node->addEntry(smart_meta_node(new meta_data_node(data)));
896  }
897  }
898 }
899 
901 {
902  metadata_list ml;
904  m_metadata.setList(ml);
905 
906  metadata_view_list mlist;
907  mlist.reserve(m_metadata.getList().size());
908 
909  std::back_insert_iterator<metadata_view_list> mli(mlist);
910  transform(m_metadata.getList().begin(), m_metadata.getList().end(),
911  mli, to_metadata_ptr());
912 
913 #ifdef SORT_METADATA_LIST
915  sort(mlist.begin(), mlist.end(), mps);
916 #endif
917 
918  meta_dir_node *video_root = &m_metadataTree;
919 
920  smart_dir_node sdn1 = video_root->addSubDir(QObject::tr("Television"));
921  meta_dir_node* television_node = sdn1.get();
922 
923  smart_dir_node vdn = video_root->addSubDir(QObject::tr("Movies"));
924  meta_dir_node* movie_node = vdn.get();
925 
926  for (auto & p : mlist)
927  {
928  VideoMetadata *data = p;
929 
930  if ((p->GetSeason() > 0) || (p->GetEpisode() > 0))
931  {
932  smart_dir_node sdn2 = television_node->addSubDir(p->GetTitle());
933  meta_dir_node* title_node = sdn2.get();
934 
935  smart_dir_node ssdn = title_node->addSubDir(
936  QObject::tr("Season %1").arg(p->GetSeason()));
937  meta_dir_node* season_node = ssdn.get();
938 
939  season_node->addEntry(smart_meta_node(new meta_data_node(data)));
940  }
941  else
942  movie_node->addEntry(smart_meta_node(new meta_data_node(data)));
943  }
944 }
945 
947 {
948  metadata_list ml;
950  m_metadata.setList(ml);
951 
952  metadata_view_list mlist;
953  mlist.reserve(m_metadata.getList().size());
954 
955  std::back_insert_iterator<metadata_view_list> mli(mlist);
956  transform(m_metadata.getList().begin(), m_metadata.getList().end(),
957  mli, to_metadata_ptr());
958 
959 // print_meta_list(mlist);
960 
961 #ifdef SORT_METADATA_LIST
963  std::sort(mlist.begin(), mlist.end(), mps);
964 #endif
965 
966  // TODO: break out the prefix in the DB so this isn't needed
967  using prefix_to_node_map = std::map<QString, meta_dir_node *>;
968  prefix_to_node_map ptnm;
969 
970  QStringList dirs = GetVideoDirs();
971 
972  if (dirs.isEmpty())
973  return;
974 
975  QString test_prefix(dirs[0]);
976 
977  meta_dir_node *video_root = &m_metadataTree;
978  if (dirs.size() == 1)
979  {
980  video_root->setPathRoot();
981  video_root->setPath(test_prefix);
982  video_root->setName("videos");
983  ptnm.insert(prefix_to_node_map::value_type(test_prefix, video_root));
984  }
985 
986  for (auto & mv : mlist)
987  AddMetadataToDir(mv, video_root);
988 
989 // print_dir_tree(m_metadataTree); // AEW DEBUG
990 }
991 
993 {
994  //
995  // Fill metadata from directory structure
996  //
997 
998  using node_to_path_list = std::vector<std::pair<QString, QString> >;
999 
1000  node_to_path_list node_paths;
1001 
1002  QStringList dirs = GetVideoDirs();
1003  if (dirs.size() > 1)
1004  {
1005  auto new_pl = [](const auto& dir)
1006  { return node_to_path_list::value_type(path_to_node_name(dir), dir); };
1007  std::transform(dirs.cbegin(), dirs.cend(), std::back_inserter(node_paths), new_pl);
1008  }
1009  else
1010  {
1011  node_paths.emplace_back(QObject::tr("videos"), dirs[0]);
1012  }
1013 
1014  //
1015  // Add all root-nodes to the tree.
1016  //
1017  metadata_list ml;
1018  for (auto & path : node_paths)
1019  {
1020  smart_dir_node root = m_metadataTree.addSubDir(path.second, path.first);
1021  root->setPathRoot();
1022 
1023  buildFileList(root, ml, path.second);
1024  }
1025 
1026  // retrieve any MediaServer data that may be available
1027  if (UPNPScanner::Instance())
1029 
1030  // See if we can find this filename in DB
1031  if (m_loadMetaData)
1032  {
1033  // Load the DB data so metadata lookups work
1034  // TODO: ugly, pass the list
1036  metadata_list db_metadata;
1038  mdlm.setList(db_metadata);
1039  for (auto & list : ml)
1040  list->FillDataFromFilename(mdlm);
1041  }
1042  m_metadata.setList(ml);
1043 }
1044 
1045 
1047  const VideoFilterSettings &filter)
1048 {
1049  for (auto e = src.entries_begin(); e != src.entries_end(); ++e)
1050  {
1051  if (filter.matches_filter(*((*e)->getData())))
1052  {
1053  dst.addEntry(
1054  smart_meta_node(new meta_data_node((*e)->getData())));
1055  }
1056  }
1057 }
1058 
1060  const VideoFilterSettings &filter)
1061 {
1062  copy_entries(dst, src, filter);
1063  for (auto dir = src.dirs_begin(); dir != src.dirs_end(); ++dir)
1064  {
1065  simple_ref_ptr<meta_dir_node> node = *dir;
1066  if (node == nullptr)
1067  continue;
1068 
1069  smart_dir_node sdn = dst.addSubDir(node->getPath(),
1070  node->getName(),
1071  node->GetHost(),
1072  node->GetPrefix(),
1073  node->GetData());
1074  copy_filtered_tree(*sdn, **dir, filter);
1075  }
1076 }
1077 
1078 void tree_view_to_flat(meta_dir_node &tree,
1081 {
1083 
1085  {
1086  tree_view_to_flat(*(sdn.get()), m_list);
1087  }
1088 
1090 };
1091 
1092 // Fills a flat view with pointers to all entries in a tree.
1095 {
1096  std::back_insert_iterator<VideoListImp::metadata_view_list> bip(flat);
1097  transform(tree.entries_begin(), tree.entries_end(), bip,
1098  to_metadata_ptr());
1099 
1100  for_each(tree.dirs_begin(), tree.dirs_end(), call_tree_flat(flat));
1101 }
1102 
1104 {
1105  m_metadataViewFlat.clear();
1106  m_metadataViewFlat.reserve(m_metadata.getList().size());
1107 
1109 
1110  if (flat_list)
1111  {
1112  for (const auto & md : m_metadata.getList())
1113  {
1114  if (m_videoFilter.matches_filter(*md))
1115  {
1116  m_metadataViewFlat.push_back(md.get());
1117  }
1118  }
1119 
1120  sort_view_data(flat_list);
1121 
1122  for (auto & md : m_metadataViewFlat)
1124  }
1125  else
1126  {
1130  m_videoFilter);
1131 
1132  sort_view_data(flat_list);
1133 
1135  }
1136 }
1137 
1139 {
1140  public:
1141  using free_list = std::list<simple_ref_ptr<DirectoryHandler> >;
1142 
1143  public:
1144  dirhandler(smart_dir_node &directory, const QString &prefix,
1146  free_list &dh_free_list, bool infer_title) :
1147  m_directory(directory), m_prefix(prefix), m_metalist(metalist),
1148  m_dhFreeList(dh_free_list), m_inferTitle(infer_title)
1149  {
1150  }
1151 
1152  DirectoryHandler *newDir(const QString &dir_name,
1153  [[maybe_unused]] const QString &fq_dir_name) override // DirectoryHandler
1154  {
1155  smart_dir_node dir = m_directory->addSubDir(dir_name);
1157  m_dhFreeList,
1158  m_inferTitle);
1159  m_dhFreeList.emplace_back(dh);
1160  return dh;
1161  }
1162 
1163  void handleFile(const QString &file_name,
1164  const QString &fq_file_name,
1165  const QString &extension)
1166  {
1167  handleFile(file_name, fq_file_name, extension, "");
1168  }
1169 
1170  void handleFile([[maybe_unused]] const QString &file_name,
1171  const QString &fq_file_name,
1172  [[maybe_unused]] const QString &extension,
1173  const QString &host) override // DirectoryHandler
1174  {
1175  const QString& file_string(fq_file_name);
1176 
1178  new VideoMetadata(file_string));
1179  QFileInfo qfi(file_string);
1180  QString title = qfi.completeBaseName();
1181  if (m_inferTitle)
1182  {
1183  QString tmptitle(VideoMetadata::FilenameToMeta(file_string, 1));
1184  if (!tmptitle.isEmpty())
1185  title = tmptitle;
1186  }
1187  myData->SetTitle(title);
1188  myData->SetPrefix(m_prefix);
1189 
1190  myData->SetHost(host);
1191  m_metalist.push_back(myData);
1192 
1193  m_directory->addEntry(new meta_data_node(myData.get()));
1194  }
1195 
1196  private:
1198  const QString &m_prefix;
1201  const bool m_inferTitle;
1202 };
1203 
1205  smart_dir_node &directory, metadata_list &metalist, const QString &prefix) const
1206 {
1209 
1211  dirhandler dh(directory, prefix, metalist, fl, false);
1212  (void) ScanVideoDirectory(
1213  directory->getFQPath(), &dh, ext_list, m_listUnknown);
1214 }
VideoMetadata
Definition: videometadata.h:24
meta_dir_node::entries_begin
entry_iterator entries_begin()
Definition: videometadatalistmanager.cpp:417
VideoListImp::getCurrentVideoFilter
const VideoFilterSettings & getCurrentVideoFilter() const
Definition: videolist.cpp:359
MythDate::toString
QString toString(const QDateTime &raw_dt, uint format)
Returns formatted string representing the time.
Definition: mythdate.cpp:84
TreeNodeDataPrivate::m_prefix
QString m_prefix
Definition: videolist.cpp:82
call_tree_flat::call_tree_flat
call_tree_flat(VideoListImp::metadata_view_list &list)
Definition: videolist.cpp:1082
VideoList::getFilterChangedState
unsigned int getFilterChangedState()
Definition: videolist.cpp:506
VideoMetadata::FilenameToMeta
static QString FilenameToMeta(const QString &file_name, int position)
Definition: videometadata.cpp:1137
metadata_path_sort::sort
static bool sort(const VideoMetadata *lhs, const VideoMetadata *rhs)
Definition: videolist.cpp:192
TreeNodeDataPrivate::GetMetadata
const VideoMetadata * GetMetadata(void) const
Definition: videolist.cpp:58
TreeNodeDataPrivate
Definition: videolist.cpp:36
kRootNode
@ kRootNode
Definition: videolist.h:8
metadata_sort::operator()
bool operator()(const VideoMetadata *lhs, const VideoMetadata *rhs)
Definition: videolist.cpp:158
MythGenericTree::SetData
void SetData(QVariant data)
Definition: mythgenerictree.h:97
VideoDialog::BRS_USERRATING
@ BRS_USERRATING
Definition: videodlg.h:42
FileAssociations::getExtensionIgnoreList
void getExtensionIgnoreList(ext_ignore_list &ext_ignore) const
Definition: dbaccess.cpp:810
MythGenericTree::GetText
QString GetText(const QString &name="") const
Definition: mythgenerictree.cpp:556
dirhandler::free_list
std::list< simple_ref_ptr< DirectoryHandler > > free_list
Definition: videolist.cpp:1141
dirscan.h
dirhandler::m_inferTitle
const bool m_inferTitle
Definition: videolist.cpp:1201
StringUtil::naturalSortCompare
bool naturalSortCompare(const QString &a, const QString &b, Qt::CaseSensitivity caseSensitivity=Qt::CaseSensitive)
naturalCompare as a std::sort compatible function (ignoring the third parameter, which is never used)...
Definition: stringutil.h:54
MythGenericTree::setInt
void setInt(int an_int)
Definition: mythgenerictree.h:72
meta_node::setPathRoot
void setPathRoot(bool is_root=true)
Definition: videometadatalistmanager.cpp:226
VideoMetadata::MetadataGetImageCb
static QString MetadataGetImageCb(const QString &name, void *data)
Definition: videometadata.cpp:1516
VideoMetadata::GetHost
const QString & GetHost() const
Definition: videometadata.cpp:1832
meta_dir_node::GetPrefix
const QString & GetPrefix() const
Definition: videometadatalistmanager.cpp:298
TreeNodeData::TreeNodeData
TreeNodeData()=default
VideoMetadataListManager
Definition: videometadatalistmanager.h:10
UPNPScanner::GetInitialMetadata
void GetInitialMetadata(VideoMetadataListManager::metadata_list *list, meta_dir_node *node)
Definition: upnpscanner.cpp:212
VideoListImp::m_metadataTree
meta_dir_node m_metadataTree
Definition: videolist.cpp:440
VideoDialog::BRS_INSERTDATE
@ BRS_INSERTDATE
Definition: videodlg.h:42
meta_dir_node::sort
void sort(DirSort dir_sort, EntrySort entry_sort)
Definition: videometadatalistmanager.h:129
simple_ref_ptr
Definition: quicksp.h:24
metadata_path_sort
Definition: videolist.cpp:172
VideoList::refreshList
void refreshList(bool filebrowser, const ParentalLevel &parental_level, bool flat_list, int group_type)
Definition: videolist.cpp:469
call_tree_flat::operator()
void operator()(smart_dir_node &sdn)
Definition: videolist.cpp:1084
parentalcontrols.h
metadata_sort::operator()
bool operator()(const smart_meta_node &lhs, const smart_meta_node &rhs)
Definition: videolist.cpp:163
MythGenericTree::visibleChildCount
uint visibleChildCount() const
Definition: mythgenerictree.h:101
VideoList::TryFilter
int TryFilter(const VideoFilterSettings &filter) const
Definition: videolist.cpp:496
smart_meta_node
simple_ref_ptr< meta_data_node > smart_meta_node
Definition: videometadatalistmanager.h:78
MythGenericTree::getInt
int getInt() const
Definition: mythgenerictree.h:73
VideoListImp::ltDBDirectorGroup
@ ltDBDirectorGroup
Definition: videolist.cpp:333
VideoListImp::ltDBMetadata
@ ltDBMetadata
Definition: videolist.cpp:331
meta_dir_node::dirs_end
dir_iterator dirs_end()
Definition: videometadatalistmanager.cpp:402
MythGenericTree::SetImageCb
void SetImageCb(mgtCbFn fn, void *data)
Definition: mythgenerictree.cpp:585
MythGenericTree::GetData
QVariant GetData(void) const
Definition: mythgenerictree.h:98
VideoListImp::fillMetadata
void fillMetadata(metadata_list_type whence)
Definition: videolist.cpp:740
TreeNodeDataPrivate::GetMetadata
VideoMetadata * GetMetadata(void)
Definition: videolist.cpp:53
dirhandler::m_prefix
const QString & m_prefix
Definition: videolist.cpp:1198
VideoListImp::ltFileSystem
@ ltFileSystem
Definition: videolist.cpp:331
meta_dir_node
Definition: videometadatalistmanager.h:83
meta_dir_node::setName
void setName(const QString &name)
Definition: videometadatalistmanager.cpp:273
VideoListImp::ltDBUserRatingGroup
@ ltDBUserRatingGroup
Definition: videolist.cpp:335
MythGenericTree::SetImageFromMap
void SetImageFromMap(const InfoMap &infoMap)
Definition: mythgenerictree.cpp:579
MythGenericTree::SetTextCb
void SetTextCb(mgtCbFn fn, void *data)
Definition: mythgenerictree.cpp:550
LOG
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39
TreeNodeDataPrivate::GetPath
QString GetPath(void) const
Definition: videolist.cpp:63
VideoMetadataListManager::getList
const metadata_list & getList() const
Definition: videometadatalistmanager.cpp:168
meta_dir_node::addEntry
void addEntry(const smart_meta_node &entry)
Definition: videometadatalistmanager.cpp:375
VideoMetadataListManager::setList
void setList(metadata_list &list)
Definition: videometadatalistmanager.cpp:162
VideoListImp::VideoListImp
VideoListImp()
Definition: videolist.cpp:529
VideoListImp::ltDBYearGroup
@ ltDBYearGroup
Definition: videolist.cpp:333
call_tree_flat::m_list
VideoListImp::metadata_view_list & m_list
Definition: videolist.cpp:1089
TreeNodeData
Definition: videolist.h:68
meta_dir_node::DataIsValid
bool DataIsValid(void) const
Definition: videometadatalistmanager.cpp:330
meta_dir_node::entries_end
entry_iterator entries_end()
Definition: videometadatalistmanager.cpp:422
to_metadata_ptr
Definition: videolist.cpp:260
metadata_path_sort::operator()
bool operator()(const smart_dir_node &lhs, const smart_dir_node &rhs)
Definition: videolist.cpp:186
VideoDialog::BRS_STUDIO
@ BRS_STUDIO
Definition: videodlg.h:43
MythGenericTree::SetStateCb
void SetStateCb(mgtCbFn fn, void *data)
Definition: mythgenerictree.cpp:616
hardwareprofile.distros.mythtv_data.data_mythtv.prefix
string prefix
Definition: data_mythtv.py:40
VideoList::InvalidateCache
void InvalidateCache()
Definition: videolist.cpp:521
VideoDialog::BRS_CATEGORY
@ BRS_CATEGORY
Definition: videodlg.h:40
VideoListImp::buildTVList
void buildTVList(void)
Definition: videolist.cpp:900
VideoList::buildVideoList
MythGenericTree * buildVideoList(bool filebrowser, bool flatlist, int group_type, const ParentalLevel &parental_level, bool include_updirs)
Definition: videolist.cpp:460
tmp
static guint32 * tmp
Definition: goom_core.cpp:26
dbaccess.h
VideoDialog::BRS_CAST
@ BRS_CAST
Definition: videodlg.h:41
VideoListImp::m_videoTreeRoot
QScopedPointer< MythGenericTree > m_videoTreeRoot
Definition: videolist.cpp:437
InfoMap
QHash< QString, QString > InfoMap
Definition: mythtypes.h:15
MythGenericTree::addNode
MythGenericTree * addNode(const QString &a_string, int an_int=0, bool selectable_flag=false, bool visible=true)
Definition: mythgenerictree.cpp:86
VideoMetadataListManager::loadAllFromDatabase
static void loadAllFromDatabase(metadata_list &items, const QString &sql="", const QString &bindValue="")
Load videometadata database into memory.
Definition: videometadatalistmanager.cpp:128
videofilter.h
TreeNodeDataPrivate::GetPrefix
QString GetPrefix(void) const
Definition: videolist.cpp:73
VideoList::VideoList
VideoList()
Definition: videolist.cpp:450
VideoListImp::metadata_list_type
metadata_list_type
Definition: videolist.cpp:331
dirhandler::handleFile
void handleFile(const QString &file_name, const QString &fq_file_name, const QString &extension)
Definition: videolist.cpp:1163
TreeNodeData::GetPath
QString GetPath() const
Definition: videolist.cpp:132
to_metadata_ptr::operator()
VideoMetadata * operator()(const VideoMetadataListManager::VideoMetadataPtr &data)
Definition: videolist.cpp:272
VideoListImp::m_loadMetaData
bool m_loadMetaData
Definition: videolist.cpp:435
VideoDialog::BRS_TVMOVIE
@ BRS_TVMOVIE
Definition: videodlg.h:43
VideoListImp::buildFsysList
void buildFsysList(void)
Definition: videolist.cpp:992
VideoList::Delete
bool Delete(int video_id)
Definition: videolist.cpp:511
mythdate.h
VideoMetadata::GetFilename
const QString & GetFilename() const
Definition: videometadata.cpp:1812
kSubFolder
@ kSubFolder
Definition: videolist.h:6
meta_dir_node::addSubDir
smart_dir_node addSubDir(const QString &subdir, const QString &name="", const QString &host="", const QString &prefix="", const QVariant &data=QVariant())
Definition: videometadatalistmanager.cpp:335
to_metadata_ptr::operator()
VideoMetadata * operator()(VideoMetadata &data)
Definition: videolist.cpp:267
videolist.h
VideoListImp::m_metadataViewTree
meta_dir_node m_metadataViewTree
Definition: videolist.cpp:443
GetVideoDirs
QStringList GetVideoDirs()
Definition: videoutils.cpp:116
TreeNodeData::GetMetadata
VideoMetadata * GetMetadata()
Definition: videolist.cpp:116
hardwareprofile.config.p
p
Definition: config.py:33
meta_node::getFQPath
const QString & getFQPath()
Definition: videometadatalistmanager.cpp:202
hardwareprofile.i18n.t
t
Definition: i18n.py:36
FileAssociations::ext_ignore_list
std::vector< std::pair< QString, bool > > ext_ignore_list
Definition: dbaccess.h:155
VideoListImp::metadata_list
VideoMetadataListManager::metadata_list metadata_list
Definition: videolist.cpp:337
VideoListImp::ltDBCategoryGroup
@ ltDBCategoryGroup
Definition: videolist.cpp:332
TreeNodeDataPrivate::TreeNodeDataPrivate
TreeNodeDataPrivate(QString path, QString host, QString prefix)
Definition: videolist.cpp:48
VideoList::m_imp
class VideoListImp * m_imp
Definition: videolist.h:61
MythGenericTree::SetImage
void SetImage(const QString &filename, const QString &name="")
Definition: mythgenerictree.cpp:573
metadata_path_sort::operator()
bool operator()(const VideoMetadata *lhs, const VideoMetadata *rhs)
Definition: videolist.cpp:181
AddFileNode
int AddFileNode(MythGenericTree *where_to_add, const QString &name, VideoMetadata *metadata)
Definition: videolist.cpp:303
metadata_sort::metadata_sort
metadata_sort(const VideoFilterSettings &vfs)
Definition: videolist.cpp:156
copy_entries
static void copy_entries(meta_dir_node &dst, meta_dir_node &src, const VideoFilterSettings &filter)
Definition: videolist.cpp:1046
dirhandler::m_dhFreeList
free_list & m_dhFreeList
Definition: videolist.cpp:1200
VideoListImp::m_listUnknown
bool m_listUnknown
Definition: videolist.cpp:434
VideoDialog::BRS_YEAR
@ BRS_YEAR
Definition: videodlg.h:41
stringutil.h
dirhandler::handleFile
void handleFile([[maybe_unused]] const QString &file_name, const QString &fq_file_name, [[maybe_unused]] const QString &extension, const QString &host) override
Definition: videolist.cpp:1170
copy_filtered_tree
static void copy_filtered_tree(meta_dir_node &dst, meta_dir_node &src, const VideoFilterSettings &filter)
Definition: videolist.cpp:1059
VideoList::getCurrentVideoFilter
const VideoFilterSettings & getCurrentVideoFilter() const
Definition: videolist.cpp:486
metadata_sort::m_vfs
const VideoFilterSettings & m_vfs
Definition: videolist.cpp:169
VideoMetadata::GetImageMap
void GetImageMap(InfoMap &imageMap)
Definition: videometadata.cpp:1448
VideoMetadata::GetSortFilename
const QString & GetSortFilename() const
Definition: videometadata.cpp:1817
mythgenerictree.h
VideoListImp::getFilterChangedState
unsigned int getFilterChangedState(void)
Definition: videolist.cpp:382
VideoListImp::count
unsigned int count(void) const
Definition: videolist.cpp:354
VideoDialog::BRS_DIRECTOR
@ BRS_DIRECTOR
Definition: videodlg.h:41
meta_dir_node::setPath
void setPath(const QString &path, const QString &sortPath=nullptr)
Definition: videometadatalistmanager.cpp:313
VideoListImp::sort_view_data
void sort_view_data(bool flat_list)
Definition: videolist.cpp:726
VideoDialog::BRS_FOLDER
@ BRS_FOLDER
Definition: videodlg.h:40
kUpFolder
@ kUpFolder
Definition: videolist.h:7
meta_dir_node::clear
void clear()
Definition: videometadatalistmanager.cpp:381
metadata_path_sort::sort
static bool sort(const QString &lhs, const QString &rhs)
Definition: videolist.cpp:197
AddDirNode
static MythGenericTree * AddDirNode(MythGenericTree *where_to_add, const QString &name, QString fqPath, bool add_up_dirs, QString host="", QString prefix="")
Definition: videolist.cpp:279
gCoreContext
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
Definition: mythcorecontext.cpp:55
VideoMetadata::GetPrefix
const QString & GetPrefix() const
Definition: videometadata.cpp:1532
VideoFilterSettings::setParentalLevel
void setParentalLevel(ParentalLevel::Level parental_level)
Definition: videofilter.h:194
VideoList::setCurrentVideoFilter
void setCurrentVideoFilter(const VideoFilterSettings &filter)
Definition: videolist.cpp:491
VideoList
Definition: videolist.h:23
TreeNodeData::operator=
TreeNodeData & operator=(const TreeNodeData &rhs)
Definition: videolist.cpp:100
VideoListImp::ltDBInsertDateGroup
@ ltDBInsertDateGroup
Definition: videolist.cpp:335
meta_dir_node::GetHost
const QString & GetHost() const
Definition: videometadatalistmanager.cpp:288
VideoListImp::buildDbList
void buildDbList(void)
Definition: videolist.cpp:946
videometadatalistmanager.h
VideoListImp::ltDBStudioGroup
@ ltDBStudioGroup
Definition: videolist.cpp:334
VideoListImp::refreshNode
bool refreshNode(MythGenericTree *node)
Definition: videolist.cpp:640
AddMetadataToDir
static meta_dir_node * AddMetadataToDir(VideoMetadata *metadata, meta_dir_node *dir, meta_dir_node *hint=nullptr)
Definition: videolist.cpp:215
VideoListImp::refreshList
void refreshList(bool filebrowser, const ParentalLevel &parental_level, bool flat_list, int group_type)
Definition: videolist.cpp:663
MythDate::kSimplify
@ kSimplify
Do Today/Yesterday/Tomorrow transform.
Definition: mythdate.h:26
MythCoreContext::GetBoolSetting
bool GetBoolSetting(const QString &key, bool defaultval=false)
Definition: mythcorecontext.cpp:906
FileAssociations::getFileAssociation
static FileAssociations & getFileAssociation()
Definition: dbaccess.cpp:830
VideoFilterSettings
Definition: videofilter.h:73
VideoListImp::m_videoFilter
VideoFilterSettings m_videoFilter
Definition: videolist.cpp:447
VideoMetadataListManager::purgeByID
bool purgeByID(unsigned int db_id)
Definition: videometadatalistmanager.cpp:190
VideoListImp::buildFileList
void buildFileList(smart_dir_node &directory, metadata_list &metalist, const QString &prefix) const
Definition: videolist.cpp:1204
meta_dir_node::getName
const QString & getName() const override
Definition: videometadatalistmanager.cpp:278
path_to_node_name
static QString path_to_node_name(const QString &path)
Definition: videolist.cpp:203
TreeNodeData::m_d
class TreeNodeDataPrivate * m_d
Definition: videolist.h:87
dirhandler::newDir
DirectoryHandler * newDir(const QString &dir_name, [[maybe_unused]] const QString &fq_dir_name) override
Definition: videolist.cpp:1152
VideoListImp::Delete
bool Delete(unsigned int video_id, VideoList &)
Definition: videolist.cpp:387
TreeNodeDataPrivate::m_path
QString m_path
Definition: videolist.cpp:81
meta_data_node
Definition: videometadatalistmanager.h:61
ScanVideoDirectory
bool ScanVideoDirectory(const QString &start_path, DirectoryHandler *handler, const FileAssociations::ext_ignore_list &ext_disposition, bool list_unknown_extensions)
Definition: dirscan.cpp:227
metadata_path_sort::operator()
bool operator()(const VideoMetadata &lhs, const VideoMetadata &rhs)
Definition: videolist.cpp:176
VideoListImp
Definition: videolist.cpp:325
meta_dir_node::dirs_begin
dir_iterator dirs_begin()
Definition: videometadatalistmanager.cpp:397
MythGenericTree::getParent
MythGenericTree * getParent(void) const
Definition: mythgenerictree.cpp:371
ParentalLevel
Definition: parentalcontrols.h:9
VideoDialog::BRS_GENRE
@ BRS_GENRE
Definition: videodlg.h:40
dirhandler::m_directory
smart_dir_node m_directory
Definition: videolist.cpp:1197
VideoList::count
unsigned int count() const
Definition: videolist.cpp:481
VideoListImp::m_metadataViewFlat
metadata_view_list m_metadataViewFlat
Definition: videolist.cpp:442
UPNPScanner::Instance
static UPNPScanner * Instance(UPNPSubscription *sub=nullptr)
Definition: upnpscanner.cpp:161
std
Definition: mythchrono.h:23
VideoListImp::m_metadataListType
metadata_list_type m_metadataListType
Definition: videolist.cpp:445
VideoListImp::buildVideoList
MythGenericTree * buildVideoList(bool filebrowser, bool flatlist, int group_type, const ParentalLevel &parental_level, bool include_updirs)
Definition: videolist.cpp:617
tree_view_to_flat
void tree_view_to_flat(meta_dir_node &tree, VideoListImp::metadata_view_list &flat)
Definition: videolist.cpp:1093
VideoMetadataListManager::VideoMetadataPtr
simple_ref_ptr< VideoMetadata > VideoMetadataPtr
Definition: videometadatalistmanager.h:13
VideoFilterSettings::getChangedState
unsigned int getChangedState()
Definition: videofilter.h:214
VideoListImp::ltNone
@ ltNone
Definition: videolist.cpp:331
TreeNodeDataPrivate::m_metadata
VideoMetadata * m_metadata
Definition: videolist.cpp:79
MythGenericTree
Definition: mythgenerictree.h:27
meta_dir_node::getSortPath
const QString & getSortPath() const
Definition: videometadatalistmanager.cpp:308
MythGenericTree::DisplayState
void DisplayState(const QString &state, const QString &name="")
Definition: mythgenerictree.cpp:622
mythcontext.h
metadata_path_sort::metadata_path_sort
metadata_path_sort(void)=default
VideoList::~VideoList
~VideoList()
Definition: videolist.cpp:455
dirhandler::m_metalist
VideoMetadataListManager::metadata_list & m_metalist
Definition: videolist.cpp:1199
VideoListImp::TryFilter
int TryFilter(const VideoFilterSettings &filter) const
Definition: videolist.cpp:369
meta_dir_node::GetData
const QVariant & GetData() const
Definition: videometadatalistmanager.cpp:325
to_metadata_ptr::operator()
VideoMetadata * operator()(smart_meta_node &smn)
Definition: videolist.cpp:262
VideoListImp::metadata_view_list
std::vector< VideoMetadata * > metadata_view_list
Definition: videolist.cpp:328
call_tree_flat
Definition: videolist.cpp:1080
TreeNodeDataPrivate::m_host
QString m_host
Definition: videolist.cpp:80
MythDate::kDateFull
@ kDateFull
Default local time.
Definition: mythdate.h:19
VideoMetadataListManager::metadata_list
std::list< VideoMetadataPtr > metadata_list
Definition: videometadatalistmanager.h:14
quicksp.h
VideoListImp::ltDBGenreGroup
@ ltDBGenreGroup
Definition: videolist.cpp:332
VideoList::refreshNode
bool refreshNode(MythGenericTree *node)
Definition: videolist.cpp:476
VideoListImp::buildGroupList
void buildGroupList(metadata_list_type whence)
Definition: videolist.cpp:777
MythGenericTree::SetText
void SetText(const QString &text, const QString &name="", const QString &state="")
Definition: mythgenerictree.cpp:518
VideoList::GetTreeRoot
MythGenericTree * GetTreeRoot()
Definition: videolist.cpp:516
VideoListImp::m_metadata
VideoMetadataListManager m_metadata
Definition: videolist.cpp:439
upnpscanner.h
meta_dir_node::getPath
const QString & getPath() const override
Definition: videometadatalistmanager.cpp:303
VideoMetadata::MetadataGetTextCb
static QString MetadataGetTextCb(const QString &name, void *data)
Definition: videometadata.cpp:1502
dirhandler::dirhandler
dirhandler(smart_dir_node &directory, const QString &prefix, VideoMetadataListManager::metadata_list &metalist, free_list &dh_free_list, bool infer_title)
Definition: videolist.cpp:1144
VideoMetadata::MetadataGetStateCb
static QString MetadataGetStateCb(const QString &name, void *data)
Definition: videometadata.cpp:1524
VideoListImp::ltDBCastGroup
@ ltDBCastGroup
Definition: videolist.cpp:334
VideoListImp::setCurrentVideoFilter
void setCurrentVideoFilter(const VideoFilterSettings &filter)
Definition: videolist.cpp:364
DirectoryHandler
Definition: dirscan.h:6
kDynamicSubFolder
@ kDynamicSubFolder
Definition: videolist.h:10
VideoFilterSettings::matches_filter
bool matches_filter(const VideoMetadata &mdata) const
Definition: videofilter.cpp:194
ParentalLevel::GetLevel
Level GetLevel() const
Definition: parentalcontrols.cpp:128
TreeNodeData::GetHost
QString GetHost() const
Definition: videolist.cpp:139
VideoListImp::GetTreeRoot
MythGenericTree * GetTreeRoot(void)
Definition: videolist.cpp:405
VideoListImp::build_generic_tree
void build_generic_tree(MythGenericTree *dst, meta_dir_node *src, bool include_updirs)
Definition: videolist.cpp:536
VideoFilterSettings::meta_less_than
bool meta_less_than(const VideoMetadata &lhs, const VideoMetadata &rhs) const
Compares two VideoMetadata instances.
Definition: videofilter.cpp:314
TreeNodeData::~TreeNodeData
~TreeNodeData()
Definition: videolist.cpp:111
VideoListImp::update_meta_view
void update_meta_view(bool flat_list)
Definition: videolist.cpp:1103
VideoList::getListCache
const VideoMetadataListManager & getListCache() const
Definition: videolist.cpp:501
videoutils.h
kNoFilesFound
@ kNoFilesFound
Definition: videolist.h:9
dirhandler
Definition: videolist.cpp:1138
TreeNodeDataPrivate::TreeNodeDataPrivate
TreeNodeDataPrivate(VideoMetadata *metadata)
Definition: videolist.cpp:39
TreeNodeDataPrivate::GetHost
QString GetHost(void) const
Definition: videolist.cpp:68
VideoListImp::ltTVMetadata
@ ltTVMetadata
Definition: videolist.cpp:336
videodlg.h
metadata_sort
metadata sort function
Definition: videolist.cpp:154
VideoListImp::getListCache
const VideoMetadataListManager & getListCache(void) const
Definition: videolist.cpp:377
VideoListImp::InvalidateCache
void InvalidateCache()
Definition: videolist.cpp:410
simple_ref_ptr::get
T * get() const
Definition: quicksp.h:73
TreeNodeData::GetPrefix
QString GetPrefix() const
Definition: videolist.cpp:146
VideoMetadataListManager::byID
VideoMetadataPtr byID(unsigned int db_id) const
Definition: videometadatalistmanager.cpp:180