Go to the documentation of this file.
10 #include <QScopedPointer>
34 #undef SORT_METADATA_LIST
178 return sort(&lhs, &rhs);
183 return sort(lhs, rhs);
197 static bool sort(
const QString &lhs,
const QString &rhs)
206 int slashLoc = path.lastIndexOf(
'/', -2) + 1;
207 if (path.endsWith(
"/"))
208 ret = path.mid(slashLoc, path.length() - slashLoc - 1);
210 ret = path.mid(slashLoc);
221 QString host = metadata->
GetHost();
226 if (metadata->
GetFilename().startsWith(hint->getFQPath() +
"/"))
230 metadata->
GetFilename().mid(hint->getFQPath().length());
234 if (insert_chunk.startsWith(dir->
getFQPath() +
"/"))
239 #if QT_VERSION < QT_VERSION_CHECK(5,14,0)
240 QStringList path = insert_chunk.split(
"/", QString::SkipEmptyParts);
242 QStringList path = insert_chunk.split(
"/", Qt::SkipEmptyParts);
253 for (
const auto & part : qAsConst(path))
268 return smn->getData();
285 const QString& name, QString fqPath,
bool add_up_dirs,
286 QString host =
"", QString
prefix =
"")
292 sub_node->
SetText(name,
"title");
323 where_to_add->
SetImage(
"buttonimage", imageMap[
"smartimage"]);
348 bool include_updirs);
350 bool filebrowser,
bool flatlist,
352 bool include_updirs);
355 bool flat_list,
int group_type);
378 return std::count_if(list.cbegin(), list.cend(), filtermatch);
397 ret = mp->DeleteFile();
433 const QString &
prefix)
const;
465 bool filebrowser,
bool flatlist,
470 group_type, parental_level, include_updirs);
475 bool flat_list,
int group_type)
553 if ((*dir)->has_entries())
555 bool incUpDir = include_updirs;
561 dst, (*dir)->getName(),
562 (*dir)->getFQPath(), incUpDir, (*dir)->GetHost(),
563 (*dir)->GetPrefix());
572 if (((*entry)->getData()->GetSeason() > 0) ||
573 ((*entry)->getData()->GetEpisode() > 0))
575 QString seas = QString::number((*entry)->getData()->GetSeason());
576 QString ep = QString::number((*entry)->getData()->GetEpisode());
577 QString title = (*entry)->getData()->GetTitle();
578 QString subtitle = (*entry)->getData()->GetSubtitle();
583 QString displayTitle = QString(
"%1 %2x%3 - %4")
584 .arg(title, seas, ep, subtitle);
588 displayTitle = QString(
"%2x%3 - %4")
589 .arg(seas, ep, subtitle);
591 AddFileNode(dst, displayTitle, (*entry)->getData());
593 else if ((*entry)->getData()->GetSubtitle().isEmpty())
596 dst, (*entry)->getData()->GetTitle(), (*entry)->getData());
600 QString TitleSub = QString(
"%1 - %2")
601 .arg((*entry)->getData()->GetTitle(),
602 (*entry)->getData()->GetSubtitle());
622 bool filebrowser,
bool flatlist,
int group_type,
625 refreshList(filebrowser, parental_level, flatlist, group_type);
652 QVariant data = node->
GetData();
669 bool flat_list,
int group_type)
684 LOG(VB_GENERAL, LOG_DEBUG,
"Using Folder mode");
688 LOG(VB_GENERAL, LOG_DEBUG,
"Using Genre mode");
692 LOG(VB_GENERAL, LOG_DEBUG,
"Using Category mode");
696 LOG(VB_GENERAL, LOG_DEBUG,
"Using Year mode");
700 LOG(VB_GENERAL, LOG_DEBUG,
"Using Director mode");
704 LOG(VB_GENERAL, LOG_DEBUG,
"Using Studio mode");
708 LOG(VB_GENERAL, LOG_DEBUG,
"Using Cast Mode");
712 LOG(VB_GENERAL, LOG_DEBUG,
"Using User Rating Mode");
716 LOG(VB_GENERAL, LOG_DEBUG,
"Using Insert Date Mode");
720 LOG(VB_GENERAL, LOG_DEBUG,
"Using TV/Movie Mode");
790 std::back_insert_iterator<metadata_view_list> mli(mlist);
794 #ifdef SORT_METADATA_LIST
796 std::sort(mlist.begin(), mlist.end(), mps);
799 using group_to_node_map = std::map<QString, meta_dir_node *>;
800 group_to_node_map gtnm;
807 for (
auto *data : mlist)
811 std::vector<QString> groups;
812 auto take_second = [](
const auto& item){
return item.second; };
818 const std::vector<std::pair <int, QString> >& genres =
821 std::transform(genres.cbegin(), genres.cend(),
822 std::back_inserter(groups), take_second);
827 groups.push_back(data->GetCategory());
832 groups.push_back(QString::number(data->GetYear()));
837 groups.push_back(data->GetDirector());
842 groups.push_back(data->GetStudio());
847 const std::vector<std::pair<int, QString> >& cast = data->GetCast();
849 std::transform(cast.cbegin(), cast.cend(),
850 std::back_inserter(groups), take_second);
855 int i = data->GetUserRating();
856 groups.push_back(QString::number(i));
861 QDate date = data->GetInsertdate();
864 groups.push_back(
tmp);
869 LOG(VB_GENERAL, LOG_ERR,
"Invalid type of grouping");
878 if (group_node ==
nullptr)
881 group_node = sdn2.
get();
882 gtnm[
"Unknown"] = group_node;
888 for (
const auto& item : groups)
892 if (group_node ==
nullptr)
895 group_node = sdn2.
get();
896 gtnm[item] = group_node;
913 std::back_insert_iterator<metadata_view_list> mli(mlist);
917 #ifdef SORT_METADATA_LIST
919 sort(mlist.begin(), mlist.end(), mps);
930 for (
auto &
p : mlist)
934 if ((
p->GetSeason() > 0) || (
p->GetEpisode() > 0))
940 QObject::tr(
"Season %1").arg(
p->GetSeason()));
959 std::back_insert_iterator<metadata_view_list> mli(mlist);
965 #ifdef SORT_METADATA_LIST
967 std::sort(mlist.begin(), mlist.end(), mps);
971 using prefix_to_node_map = std::map<QString, meta_dir_node *>;
972 prefix_to_node_map ptnm;
979 QString test_prefix(dirs[0]);
982 if (dirs.size() == 1)
985 video_root->
setPath(test_prefix);
987 ptnm.insert(prefix_to_node_map::value_type(test_prefix, video_root));
990 for (
auto & mv : mlist)
1002 using node_to_path_list = std::vector<std::pair<QString, QString> >;
1004 node_to_path_list node_paths;
1007 if (dirs.size() > 1)
1009 auto new_pl = [](
const auto& dir)
1011 std::transform(dirs.cbegin(), dirs.cend(), std::back_inserter(node_paths), new_pl);
1015 node_paths.emplace_back(QObject::tr(
"videos"), dirs[0]);
1022 for (
auto & path : node_paths)
1043 for (
auto & list : ml)
1044 list->FillDataFromFilename(mdlm);
1070 if (node ==
nullptr)
1100 std::back_insert_iterator<VideoListImp::metadata_view_list> bip(flat);
1145 using free_list = std::list<simple_ref_ptr<DirectoryHandler> >;
1150 free_list &dh_free_list,
bool infer_title) :
1157 const QString &fq_dir_name)
override
1169 const QString &fq_file_name,
1170 const QString &extension)
1172 handleFile(file_name, fq_file_name, extension,
"");
1176 const QString &fq_file_name,
1177 const QString &extension,
1178 const QString &host)
override
1182 const QString& file_string(fq_file_name);
1186 QFileInfo qfi(file_string);
1187 QString title = qfi.completeBaseName();
1191 if (!tmptitle.isEmpty())
1194 myData->SetTitle(title);
1197 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
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)...
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
void SetImageCb(mgtCbFn fn, void *data)
QVariant GetData(void) const
void fillMetadata(metadata_list_type whence)
VideoMetadata * GetMetadata(void)
void SetImageFromMap(const InfoMap &infoMap)
void SetTextCb(mgtCbFn fn, void *data)
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
QString GetPath(void) const
VideoListImp::metadata_view_list & m_list
void SetStateCb(mgtCbFn fn, void *data)
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="")
int AddFileNode(MythGenericTree *where_to_add, const QString &name, VideoMetadata *metadata)
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)
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
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