Go to the documentation of this file.
7 #include <QScopedPointer>
170 return sort(&lhs, &rhs);
175 return sort(lhs, rhs);
189 static bool sort(
const QString &lhs,
const QString &rhs)
198 int slashLoc = path.lastIndexOf(
'/', -2) + 1;
199 if (path.endsWith(
"/"))
200 ret = path.mid(slashLoc, path.length() - slashLoc - 1);
202 ret = path.mid(slashLoc);
213 QString host = metadata->
GetHost();
218 if (metadata->
GetFilename().startsWith(hint->getFQPath() +
"/"))
222 metadata->
GetFilename().mid(hint->getFQPath().length());
226 if (insert_chunk.startsWith(
dir->getFQPath() +
"/"))
228 insert_chunk = metadata->
GetFilename().mid(
dir->getFQPath().length());
231 #if QT_VERSION < QT_VERSION_CHECK(5,14,0)
232 QStringList path = insert_chunk.split(
"/", QString::SkipEmptyParts);
234 QStringList path = insert_chunk.split(
"/", Qt::SkipEmptyParts);
245 for (
const auto & part : qAsConst(path))
260 return smn->getData();
277 const QString& name, QString fqPath,
bool add_up_dirs,
278 QString host =
"", QString
prefix =
"")
284 sub_node->
SetText(name,
"title");
307 metadata->
toMap(textMap);
314 sub_node->
SetImage(
"buttonimage", imageMap[
"smartimage"]);
321 where_to_add->
SetImage(
"buttonimage", imageMap[
"smartimage"]);
351 bool include_updirs);
353 bool filebrowser,
bool flatlist,
355 bool include_updirs);
358 bool flat_list,
int group_type);
381 return std::count_if(list.cbegin(), list.cend(), filtermatch);
400 ret = mp->DeleteFile();
436 const QString &
prefix)
const;
468 bool filebrowser,
bool flatlist,
473 group_type, parental_level, include_updirs);
478 bool flat_list,
int group_type)
556 if ((*dir)->has_entries())
558 bool incUpDir = include_updirs;
564 dst, (*dir)->getName(),
565 (*dir)->getFQPath(), incUpDir, (*dir)->GetHost(),
566 (*dir)->GetPrefix());
575 if (((*entry)->getData()->GetSeason() > 0) ||
576 ((*entry)->getData()->GetEpisode() > 0))
578 QString seas = QString::number((*entry)->getData()->GetSeason());
579 QString ep = QString::number((*entry)->getData()->GetEpisode());
580 QString
title = (*entry)->getData()->GetTitle();
581 QString subtitle = (*entry)->getData()->GetSubtitle();
586 QString displayTitle = QString(
"%1 %2x%3 - %4")
587 .arg(
title).arg(seas).arg(ep).arg(subtitle);
591 displayTitle = QString(
"%2x%3 - %4")
592 .arg(seas).arg(ep).arg(subtitle);
594 AddFileNode(dst, displayTitle, (*entry)->getData());
596 else if ((*entry)->getData()->GetSubtitle().isEmpty())
599 dst, (*entry)->getData()->GetTitle(), (*entry)->getData());
603 QString TitleSub = QString(
"%1 - %2")
604 .arg((*entry)->getData()->GetTitle())
605 .arg((*entry)->getData()->GetSubtitle());
625 bool filebrowser,
bool flatlist,
int group_type,
628 refreshList(filebrowser, parental_level, flatlist, group_type);
655 QVariant data = node->
GetData();
672 bool flat_list,
int group_type)
687 LOG(VB_GENERAL, LOG_DEBUG,
"Using Folder mode");
691 LOG(VB_GENERAL, LOG_DEBUG,
"Using Genre mode");
695 LOG(VB_GENERAL, LOG_DEBUG,
"Using Category mode");
699 LOG(VB_GENERAL, LOG_DEBUG,
"Using Year mode");
703 LOG(VB_GENERAL, LOG_DEBUG,
"Using Director mode");
707 LOG(VB_GENERAL, LOG_DEBUG,
"Using Studio mode");
711 LOG(VB_GENERAL, LOG_DEBUG,
"Using Cast Mode");
715 LOG(VB_GENERAL, LOG_DEBUG,
"Using User Rating Mode");
719 LOG(VB_GENERAL, LOG_DEBUG,
"Using Insert Date Mode");
723 LOG(VB_GENERAL, LOG_DEBUG,
"Using TV/Movie Mode");
793 std::back_insert_iterator<metadata_view_list> mli(mlist);
798 std::sort(mlist.begin(), mlist.end(), mps);
800 using group_to_node_map = std::map<QString, meta_dir_node *>;
801 group_to_node_map gtnm;
808 for (
auto *data : mlist)
812 std::vector<QString> groups;
813 auto take_second = [](
const auto& item){
return item.second; };
819 const std::vector<std::pair <int, QString> >&
genres =
823 std::back_inserter(groups), take_second);
828 groups.push_back(data->GetCategory());
833 groups.push_back(QString::number(data->GetYear()));
838 groups.push_back(data->GetDirector());
843 groups.push_back(data->GetStudio());
848 const std::vector<std::pair<int, QString> >& cast = data->GetCast();
850 std::transform(cast.cbegin(), cast.cend(),
851 std::back_inserter(groups), take_second);
856 int i = data->GetUserRating();
857 groups.push_back(QString::number(i));
862 QDate date = data->GetInsertdate();
865 groups.push_back(
tmp);
870 LOG(VB_GENERAL, LOG_ERR,
"Invalid type of grouping");
879 if (group_node ==
nullptr)
882 group_node = sdn2.
get();
883 gtnm[
"Unknown"] = group_node;
889 for (
const auto& item : groups)
893 if (group_node ==
nullptr)
896 group_node = sdn2.
get();
897 gtnm[item] = group_node;
914 std::back_insert_iterator<metadata_view_list> mli(mlist);
919 sort(mlist.begin(), mlist.end(), mps);
929 for (
auto &
p : mlist)
933 if ((
p->GetSeason() > 0) || (
p->GetEpisode() > 0))
939 QObject::tr(
"Season %1").
arg(
p->GetSeason()));
958 std::back_insert_iterator<metadata_view_list> mli(mlist);
965 std::sort(mlist.begin(), mlist.end(), mps);
968 using prefix_to_node_map = std::map<QString, meta_dir_node *>;
969 prefix_to_node_map ptnm;
976 QString test_prefix(dirs[0]);
979 if (dirs.size() == 1)
982 video_root->
setPath(test_prefix);
984 ptnm.insert(prefix_to_node_map::value_type(test_prefix, video_root));
987 for (
auto & mv : mlist)
999 using node_to_path_list = std::vector<std::pair<QString, QString> >;
1001 node_to_path_list node_paths;
1004 if (dirs.size() > 1)
1006 auto new_pl = [](
const auto&
dir)
1008 std::transform(dirs.cbegin(), dirs.cend(), std::back_inserter(node_paths), new_pl);
1012 node_paths.push_back(
1013 node_to_path_list::value_type(QObject::tr(
"videos"), dirs[0]));
1020 for (
auto & path : node_paths)
1023 root->setPathRoot();
1041 for (
auto & list : ml)
1042 list->FillDataFromFilename(mdlm);
1068 if (node ==
nullptr)
1098 std::back_insert_iterator<VideoListImp::metadata_view_list> bip(flat);
1143 using free_list = std::list<simple_ref_ptr<DirectoryHandler> >;
1148 free_list &dh_free_list,
bool infer_title) :
1155 const QString &fq_dir_name)
override
1167 const QString &fq_file_name,
1168 const QString &extension)
1170 handleFile(file_name, fq_file_name, extension,
"");
1174 const QString &fq_file_name,
1175 const QString &extension,
1176 const QString &host)
override
1180 const QString& file_string(fq_file_name);
1184 QFileInfo qfi(file_string);
1185 QString
title = qfi.completeBaseName();
1189 if (!tmptitle.isEmpty())
1192 myData->SetTitle(
title);
1195 myData->SetHost(host);
const VideoFilterSettings & getCurrentVideoFilter() const
QString toString(const QDateTime &raw_dt, uint format)
Returns formatted string representing the time.
call_tree_flat(VideoListImp::metadata_view_list &list)
unsigned int getFilterChangedState()
const VideoMetadata * GetMetadata(void) const
void SetData(QVariant data)
void getExtensionIgnoreList(ext_ignore_list &ext_ignore) const
QString GetText(const QString &name="") const
std::list< simple_ref_ptr< DirectoryHandler > > free_list
void SetTextFromMap(const InfoMap &infoMap, const QString &state="")
void GetInitialMetadata(VideoMetadataListManager::metadata_list *list, meta_dir_node *node)
meta_dir_node m_metadataTree
void handleFile(const QString &file_name, const QString &fq_file_name, const QString &extension, const QString &host) override
void refreshList(bool filebrowser, const ParentalLevel &parental_level, bool flat_list, int group_type)
void operator()(smart_dir_node &sdn)
uint visibleChildCount() const
int TryFilter(const VideoFilterSettings &filter) const
arg(title).arg(filename).arg(doDelete))
QVariant GetData(void) const
void fillMetadata(metadata_list_type whence)
VideoMetadata * GetMetadata(void)
void SetImageFromMap(const InfoMap &infoMap)
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
QString GetPath(void) const
void DisplayStateFromMap(const InfoMap &infoMap)
VideoListImp::metadata_view_list & m_list
MythGenericTree * buildVideoList(bool filebrowser, bool flatlist, int group_type, const ParentalLevel &parental_level, bool include_updirs)
QScopedPointer< MythGenericTree > m_videoTreeRoot
QHash< QString, QString > InfoMap
MythGenericTree * addNode(const QString &a_string, int an_int=0, bool selectable_flag=false, bool visible=true)
QString GetPrefix(void) const
void handleFile(const QString &file_name, const QString &fq_file_name, const QString &extension)
bool Delete(int video_id)
meta_dir_node m_metadataViewTree
QStringList GetVideoDirs()
VideoMetadata * GetMetadata()
std::vector< std::pair< QString, bool > > ext_ignore_list
VideoMetadataListManager::metadata_list metadata_list
TreeNodeDataPrivate(QString path, QString host, QString prefix)
class VideoListImp * m_imp
void SetImage(const QString &filename, const QString &name="")
static void copy_entries(meta_dir_node &dst, meta_dir_node &src, const VideoFilterSettings &filter)
static void copy_filtered_tree(meta_dir_node &dst, meta_dir_node &src, const VideoFilterSettings &filter)
const VideoFilterSettings & getCurrentVideoFilter() const
unsigned int getFilterChangedState(void)
unsigned int count(void) const
void sort_view_data(bool flat_list)
int naturalCompare(const QString &_a, const QString &_b, Qt::CaseSensitivity caseSensitivity)
static MythGenericTree * AddDirNode(MythGenericTree *where_to_add, const QString &name, QString fqPath, bool add_up_dirs, QString host="", QString prefix="")
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
void setParentalLevel(ParentalLevel::Level parental_level)
void setCurrentVideoFilter(const VideoFilterSettings &filter)
TreeNodeData & operator=(const TreeNodeData &rhs)
bool refreshNode(MythGenericTree *node)
static meta_dir_node * AddMetadataToDir(VideoMetadata *metadata, meta_dir_node *dir, meta_dir_node *hint=nullptr)
void refreshList(bool filebrowser, const ParentalLevel &parental_level, bool flat_list, int group_type)
@ kSimplify
Do Today/Yesterday/Tomorrow transform.
bool GetBoolSetting(const QString &key, bool defaultval=false)
static FileAssociations & getFileAssociation()
VideoFilterSettings m_videoFilter
void buildFileList(smart_dir_node &directory, metadata_list &metalist, const QString &prefix) const
static QString path_to_node_name(const QString &path)
class TreeNodeDataPrivate * m_d
bool Delete(unsigned int video_id, VideoList &)
bool ScanVideoDirectory(const QString &start_path, DirectoryHandler *handler, const FileAssociations::ext_ignore_list &ext_disposition, bool list_unknown_extensions)
MythGenericTree * getParent(void) const
smart_dir_node m_directory
unsigned int count() const
metadata_view_list m_metadataViewFlat
static UPNPScanner * Instance(UPNPSubscription *sub=nullptr)
metadata_list_type m_metadataListType
MythGenericTree * buildVideoList(bool filebrowser, bool flatlist, int group_type, const ParentalLevel &parental_level, bool include_updirs)
void tree_view_to_flat(meta_dir_node &tree, VideoListImp::metadata_view_list &flat)
unsigned int getChangedState()
VideoMetadata * m_metadata
void DisplayState(const QString &state, const QString &name="")
VideoMetadataListManager::metadata_list & m_metalist
int TryFilter(const VideoFilterSettings &filter) const
static int AddFileNode(MythGenericTree *where_to_add, const QString &name, VideoMetadata *metadata)
std::vector< VideoMetadata * > metadata_view_list
@ kDateFull
Default local time.
bool refreshNode(MythGenericTree *node)
void buildGroupList(metadata_list_type whence)
void SetText(const QString &text, const QString &name="", const QString &state="")
MythGenericTree * GetTreeRoot()
VideoMetadataListManager m_metadata
dirhandler(smart_dir_node &directory, const QString &prefix, VideoMetadataListManager::metadata_list &metalist, free_list &dh_free_list, bool infer_title)
void setCurrentVideoFilter(const VideoFilterSettings &filter)
bool matches_filter(const VideoMetadata &mdata) const
MythGenericTree * GetTreeRoot(void)
void build_generic_tree(MythGenericTree *dst, meta_dir_node *src, bool include_updirs)
bool meta_less_than(const VideoMetadata &lhs, const VideoMetadata &rhs) const
Compares two VideoMetadata instances.
void update_meta_view(bool flat_list)
const VideoMetadataListManager & getListCache() const
TreeNodeDataPrivate(VideoMetadata *metadata)
QString GetHost(void) const
const VideoMetadataListManager & getListCache(void) const
DirectoryHandler * newDir(const QString &dir_name, const QString &fq_dir_name) override
QString GetPrefix() const