10#include <QScopedPointer>
35#undef SORT_METADATA_LIST
179 return sort(&lhs, &rhs);
184 return sort(lhs, rhs);
198 static bool sort(
const QString &lhs,
const QString &rhs)
207 int slashLoc = path.lastIndexOf(
'/', -2) + 1;
208 if (path.endsWith(
"/"))
209 ret = path.mid(slashLoc, path.length() - slashLoc - 1);
211 ret = path.mid(slashLoc);
222 QString host = metadata->
GetHost();
227 if (metadata->
GetFilename().startsWith(hint->getFQPath() +
"/"))
231 metadata->
GetFilename().mid(hint->getFQPath().length());
235 if (insert_chunk.startsWith(dir->
getFQPath() +
"/"))
240 QStringList path = insert_chunk.split(
"/", Qt::SkipEmptyParts);
250 for (
const auto & part : std::as_const(path))
265 return smn->getData();
282 const QString& name, QString fqPath,
bool add_up_dirs,
283 QString host =
"", QString
prefix =
"")
289 sub_node->
SetText(name,
"title");
320 where_to_add->
SetImage(
"buttonimage", imageMap[
"smartimage"]);
346 bool include_updirs);
348 bool filebrowser,
bool flatlist,
350 bool include_updirs);
353 bool flat_list,
int group_type);
376 return std::count_if(list.cbegin(), list.cend(), filtermatch);
395 ret = mp->DeleteFile();
431 const QString &
prefix)
const;
463 bool filebrowser,
bool flatlist,
468 group_type, parental_level, include_updirs);
473 bool flat_list,
int group_type)
551 if ((*dir)->has_entries())
553 bool incUpDir = include_updirs;
559 dst, (*dir)->getName(),
560 (*dir)->getFQPath(), incUpDir, (*dir)->GetHost(),
561 (*dir)->GetPrefix());
570 if (((*entry)->getData()->GetSeason() > 0) ||
571 ((*entry)->getData()->GetEpisode() > 0))
573 QString seas = QString::number((*entry)->getData()->GetSeason());
574 QString ep = QString::number((*entry)->getData()->GetEpisode());
575 QString title = (*entry)->getData()->GetTitle();
576 QString subtitle = (*entry)->getData()->GetSubtitle();
581 QString displayTitle = QString(
"%1 %2x%3 - %4")
582 .arg(title, seas, ep, subtitle);
586 displayTitle = QString(
"%2x%3 - %4")
587 .arg(seas, ep, subtitle);
589 AddFileNode(dst, displayTitle, (*entry)->getData());
591 else if ((*entry)->getData()->GetSubtitle().isEmpty())
594 dst, (*entry)->getData()->GetTitle(), (*entry)->getData());
598 QString TitleSub = QString(
"%1 - %2")
599 .arg((*entry)->getData()->GetTitle(),
600 (*entry)->getData()->GetSubtitle());
620 bool filebrowser,
bool flatlist,
int group_type,
623 refreshList(filebrowser, parental_level, flatlist, group_type);
650 QVariant data = node->
GetData();
667 bool flat_list,
int group_type)
682 LOG(VB_GENERAL, LOG_DEBUG,
"Using Folder mode");
686 LOG(VB_GENERAL, LOG_DEBUG,
"Using Genre mode");
690 LOG(VB_GENERAL, LOG_DEBUG,
"Using Category mode");
694 LOG(VB_GENERAL, LOG_DEBUG,
"Using Year mode");
698 LOG(VB_GENERAL, LOG_DEBUG,
"Using Director mode");
702 LOG(VB_GENERAL, LOG_DEBUG,
"Using Studio mode");
706 LOG(VB_GENERAL, LOG_DEBUG,
"Using Cast Mode");
710 LOG(VB_GENERAL, LOG_DEBUG,
"Using User Rating Mode");
714 LOG(VB_GENERAL, LOG_DEBUG,
"Using Insert Date Mode");
718 LOG(VB_GENERAL, LOG_DEBUG,
"Using TV/Movie Mode");
788 std::back_insert_iterator<metadata_view_list> mli(mlist);
792#ifdef SORT_METADATA_LIST
794 std::sort(mlist.begin(), mlist.end(), mps);
797 using group_to_node_map = std::map<QString, meta_dir_node *>;
798 group_to_node_map gtnm;
805 for (
auto *data : mlist)
809 std::vector<QString> groups;
810 auto take_second = [](
const auto& item){
return item.second; };
816 const std::vector<std::pair <int, QString> >& genres =
819 std::transform(genres.cbegin(), genres.cend(),
820 std::back_inserter(groups), take_second);
825 groups.push_back(data->GetCategory());
830 groups.push_back(QString::number(data->GetYear()));
835 groups.push_back(data->GetDirector());
840 groups.push_back(data->GetStudio());
845 const std::vector<std::pair<int, QString> >& cast = data->GetCast();
847 std::transform(cast.cbegin(), cast.cend(),
848 std::back_inserter(groups), take_second);
853 int i = data->GetUserRating();
854 groups.push_back(QString::number(i));
859 QDate date = data->GetInsertdate();
862 groups.push_back(
tmp);
867 LOG(VB_GENERAL, LOG_ERR,
"Invalid type of grouping");
876 if (group_node ==
nullptr)
879 group_node = sdn2.
get();
880 gtnm[
"Unknown"] = group_node;
886 for (
const auto& item : groups)
890 if (group_node ==
nullptr)
893 group_node = sdn2.
get();
894 gtnm[item] = group_node;
911 std::back_insert_iterator<metadata_view_list> mli(mlist);
915#ifdef SORT_METADATA_LIST
917 sort(mlist.begin(), mlist.end(), mps);
928 for (
auto &
p : mlist)
932 if ((
p->GetSeason() > 0) || (
p->GetEpisode() > 0))
938 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 [[maybe_unused]]
const QString &fq_dir_name)
override
1168 const QString &fq_file_name,
1169 const QString &extension)
1171 handleFile(file_name, fq_file_name, extension,
"");
1175 const QString &fq_file_name,
1176 [[maybe_unused]]
const QString &extension,
1177 const QString &host)
override
1179 const QString& file_string(fq_file_name);
1183 QFileInfo qfi(file_string);
1184 QString title = qfi.completeBaseName();
1188 if (!tmptitle.isEmpty())
1191 myData->SetTitle(title);
1194 myData->SetHost(host);
void getExtensionIgnoreList(ext_ignore_list &ext_ignore) const
std::vector< std::pair< QString, bool > > ext_ignore_list
static FileAssociations & getFileAssociation()
bool GetBoolSetting(const QString &key, bool defaultval=false)
QVariant GetData(void) const
QString GetText(const QString &name="") const
void SetImageFromMap(const InfoMap &infoMap)
MythGenericTree * getParent(void) const
void SetImageCb(mgtCbFn fn, void *data)
void SetText(const QString &text, const QString &name="", const QString &state="")
MythGenericTree * addNode(const QString &a_string, int an_int=0, bool selectable_flag=false, bool visible=true)
void SetImage(const QString &filename, const QString &name="")
void SetStateCb(mgtCbFn fn, void *data)
uint visibleChildCount() const
void DisplayState(const QString &state, const QString &name="")
void SetData(QVariant data)
void SetTextCb(mgtCbFn fn, void *data)
QString GetPath(void) const
const VideoMetadata * GetMetadata(void) const
TreeNodeDataPrivate(VideoMetadata *metadata)
TreeNodeDataPrivate(QString path, QString host, QString prefix)
VideoMetadata * GetMetadata(void)
QString GetPrefix(void) const
VideoMetadata * m_metadata
QString GetHost(void) const
TreeNodeData & operator=(const TreeNodeData &rhs)
class TreeNodeDataPrivate * m_d
QString GetPrefix() const
VideoMetadata * GetMetadata()
static UPNPScanner * Instance(UPNPSubscription *sub=nullptr)
Returns the global UPNPScanner instance if it has been enabled or nullptr if UPNPScanner is currently...
void GetInitialMetadata(VideoMetadataListManager::metadata_list *list, meta_dir_node *node)
Fill the given metadata_list and meta_dir_node with the root media server metadata (i....
bool matches_filter(const VideoMetadata &mdata) const
unsigned int getChangedState()
bool meta_less_than(const VideoMetadata &lhs, const VideoMetadata &rhs) const
Compares two VideoMetadata instances.
void setParentalLevel(ParentalLevel::Level parental_level)
metadata_list_type m_metadataListType
unsigned int count(void) const
const VideoFilterSettings & getCurrentVideoFilter() const
const VideoMetadataListManager & getListCache(void) const
void update_meta_view(bool flat_list)
bool refreshNode(MythGenericTree *node)
QScopedPointer< MythGenericTree > m_videoTreeRoot
MythGenericTree * GetTreeRoot(void)
int TryFilter(const VideoFilterSettings &filter) const
meta_dir_node m_metadataViewTree
void buildGroupList(metadata_list_type whence)
std::vector< VideoMetadata * > metadata_view_list
VideoFilterSettings m_videoFilter
meta_dir_node m_metadataTree
void build_generic_tree(MythGenericTree *dst, meta_dir_node *src, bool include_updirs)
void buildFileList(smart_dir_node &directory, metadata_list &metalist, const QString &prefix) const
void fillMetadata(metadata_list_type whence)
VideoMetadataListManager m_metadata
metadata_view_list m_metadataViewFlat
MythGenericTree * buildVideoList(bool filebrowser, bool flatlist, int group_type, const ParentalLevel &parental_level, bool include_updirs)
unsigned int getFilterChangedState(void)
void setCurrentVideoFilter(const VideoFilterSettings &filter)
VideoMetadataListManager::metadata_list metadata_list
void refreshList(bool filebrowser, const ParentalLevel &parental_level, bool flat_list, int group_type)
void sort_view_data(bool flat_list)
bool Delete(unsigned int video_id, VideoList &)
bool Delete(int video_id)
bool refreshNode(MythGenericTree *node)
const VideoMetadataListManager & getListCache() const
void setCurrentVideoFilter(const VideoFilterSettings &filter)
int TryFilter(const VideoFilterSettings &filter) const
unsigned int count() const
void refreshList(bool filebrowser, const ParentalLevel &parental_level, bool flat_list, int group_type)
class VideoListImp * m_imp
unsigned int getFilterChangedState()
const VideoFilterSettings & getCurrentVideoFilter() const
MythGenericTree * GetTreeRoot()
MythGenericTree * buildVideoList(bool filebrowser, bool flatlist, int group_type, const ParentalLevel &parental_level, bool include_updirs)
smart_dir_node m_directory
void handleFile(const QString &file_name, const QString &fq_file_name, const QString &extension, const QString &host) override
dirhandler(smart_dir_node &directory, const QString &prefix, VideoMetadataListManager::metadata_list &metalist, free_list &dh_free_list, bool infer_title)
VideoMetadataListManager::metadata_list & m_metalist
std::list< simple_ref_ptr< DirectoryHandler > > free_list
DirectoryHandler * newDir(const QString &dir_name, const QString &fq_dir_name) override
void handleFile(const QString &file_name, const QString &fq_file_name, const QString &extension)
bool ScanVideoDirectory(const QString &start_path, DirectoryHandler *handler, const FileAssociations::ext_ignore_list &ext_disposition, bool list_unknown_extensions)
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
QHash< QString, QString > InfoMap
QString toString(const QDateTime &raw_dt, uint format)
Returns formatted string representing the time.
@ kSimplify
Do Today/Yesterday/Tomorrow transform.
@ kDateFull
Default local time.
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 operator()(smart_dir_node &sdn)
VideoListImp::metadata_view_list & m_list
call_tree_flat(VideoListImp::metadata_view_list &list)
static meta_dir_node * AddMetadataToDir(VideoMetadata *metadata, meta_dir_node *dir, meta_dir_node *hint=nullptr)
static QString path_to_node_name(const QString &path)
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)
static MythGenericTree * AddDirNode(MythGenericTree *where_to_add, const QString &name, QString fqPath, bool add_up_dirs, QString host="", QString prefix="")
void tree_view_to_flat(meta_dir_node &tree, VideoListImp::metadata_view_list &flat)
QStringList GetVideoDirs()