6 #include <QScopedPointer> 35 m_host = m_metadata->GetHost();
41 m_metadata(nullptr), m_host(host), m_path(path), m_prefix(
prefix)
174 return sort(&lhs, &rhs);
179 return sort(lhs, rhs);
193 bool sort(
const QString &lhs,
const QString &rhs)
202 int slashLoc = path.lastIndexOf(
'/', -2) + 1;
203 if (path.endsWith(
"/"))
204 ret = path.mid(slashLoc, path.length() - slashLoc - 1);
206 ret = path.mid(slashLoc);
217 QString host = metadata->
GetHost();
222 if (metadata->
GetFilename().startsWith(hint->getFQPath() +
"/"))
226 metadata->
GetFilename().mid(hint->getFQPath().length());
230 if (insert_chunk.startsWith(dir->
getFQPath() +
"/"))
235 QStringList path = insert_chunk.split(
"/", QString::SkipEmptyParts);
245 for (QStringList::const_iterator p = path.begin(); p != path.end(); ++p)
260 return smn->getData();
277 QString
name, QString fqPath,
bool add_up_dirs,
278 QString host =
"", QString
prefix =
"")
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 flatlist,
int group_type);
403 ret = mp->DeleteFile();
471 bool filebrowser,
bool flatlist,
476 group_type, parental_level, include_updirs);
481 bool flat_list,
int group_type)
559 if ((*dir)->has_entries())
561 bool incUpDir = include_updirs;
567 dst, (*dir)->getName(),
568 (*dir)->getFQPath(), incUpDir, (*dir)->GetHost(),
569 (*dir)->GetPrefix());
578 if (((*entry)->getData()->GetSeason() > 0) ||
579 ((*entry)->getData()->GetEpisode() > 0))
581 QString seas = QString::number((*entry)->getData()->GetSeason());
582 QString ep = QString::number((*entry)->getData()->GetEpisode());
583 QString title = (*entry)->getData()->GetTitle();
584 QString subtitle = (*entry)->getData()->GetSubtitle();
589 QString displayTitle = QString(
"%1 %2x%3 - %4")
590 .arg(title).arg(seas).arg(ep).arg(subtitle);
594 displayTitle = QString(
"%2x%3 - %4")
595 .arg(seas).arg(ep).arg(subtitle);
597 AddFileNode(dst, displayTitle, (*entry)->getData());
599 else if ((*entry)->getData()->GetSubtitle().isEmpty())
602 dst, (*entry)->getData()->GetTitle(), (*entry)->getData());
606 QString TitleSub = QString(
"%1 - %2")
607 .arg((*entry)->getData()->GetTitle())
608 .arg((*entry)->getData()->GetSubtitle());
628 bool filebrowser,
bool flatlist,
int group_type,
631 refreshList(filebrowser, parental_level, flatlist, group_type);
658 QVariant data = node->
GetData();
675 bool flat_list,
int group_type)
690 LOG(VB_GENERAL, LOG_DEBUG,
"Using Folder mode");
694 LOG(VB_GENERAL, LOG_DEBUG,
"Using Genre mode");
698 LOG(VB_GENERAL, LOG_DEBUG,
"Using Category mode");
702 LOG(VB_GENERAL, LOG_DEBUG,
"Using Year mode");
706 LOG(VB_GENERAL, LOG_DEBUG,
"Using Director mode");
710 LOG(VB_GENERAL, LOG_DEBUG,
"Using Studio mode");
714 LOG(VB_GENERAL, LOG_DEBUG,
"Using Cast Mode");
718 LOG(VB_GENERAL, LOG_DEBUG,
"Using User Rating Mode");
722 LOG(VB_GENERAL, LOG_DEBUG,
"Using Insert Date Mode");
726 LOG(VB_GENERAL, LOG_DEBUG,
"Using TV/Movie Mode");
796 back_insert_iterator<metadata_view_list> mli(mlist);
801 sort(mlist.begin(), mlist.end(), mps);
803 typedef map<QString, meta_dir_node *> group_to_node_map;
804 group_to_node_map gtnm;
811 for (metadata_view_list::iterator p = mlist.begin(); p != mlist.end(); ++p)
817 vector<QString> groups;
823 vector<pair <int, QString> > genres =
826 for (vector<pair <int, QString> >::iterator i =
827 genres.begin(); i != genres.end(); ++i)
829 pair<int, QString> item = *i;
830 groups.push_back(item.second);
841 groups.push_back(QString::number(data->
GetYear()));
856 vector<pair<int, QString> > cast = data->
GetCast();
858 for (vector<pair<int, QString> >::iterator i =
859 cast.begin(); i != cast.end(); ++i)
861 pair<int, QString> item = *i;
862 groups.push_back(item.second);
869 groups.push_back(QString::number(i));
877 groups.push_back(
tmp);
882 LOG(VB_GENERAL, LOG_ERR,
"Invalid type of grouping");
891 if (group_node ==
nullptr)
894 group_node = sdn2.
get();
895 gtnm[
"Unknown"] = group_node;
901 for (vector<QString>::iterator i = groups.begin();
902 i != groups.end(); ++i)
908 if (group_node ==
nullptr)
911 group_node = sdn2.
get();
912 gtnm[item] = group_node;
929 back_insert_iterator<metadata_view_list> mli(mlist);
934 sort(mlist.begin(), mlist.end(), mps);
944 for (metadata_view_list::iterator p = mlist.begin(); p != mlist.end(); ++p)
948 if (((*p)->GetSeason() > 0) || ((*p)->GetEpisode() > 0))
954 QObject::tr(
"Season %1").arg((*p)->GetSeason()));
973 back_insert_iterator<metadata_view_list> mli(mlist);
980 sort(mlist.begin(), mlist.end(), mps);
983 typedef map<QString, meta_dir_node *> prefix_to_node_map;
984 prefix_to_node_map ptnm;
991 QString test_prefix(dirs[0]);
994 if (dirs.size() == 1)
997 video_root->
setPath(test_prefix);
999 ptnm.insert(prefix_to_node_map::value_type(test_prefix, video_root));
1002 for (metadata_view_list::iterator p = mlist.begin(); p != mlist.end(); ++p)
1016 typedef vector<pair<QString, QString> > node_to_path_list;
1018 node_to_path_list node_paths;
1021 if (dirs.size() > 1)
1023 for (QStringList::const_iterator iter = dirs.begin();
1024 iter != dirs.end(); ++iter)
1026 node_paths.push_back(
1033 node_paths.push_back(
1034 node_to_path_list::value_type(QObject::tr(
"videos"), dirs[0]));
1041 for (node_to_path_list::iterator p = node_paths.begin();
1042 p != node_paths.end(); ++p)
1063 for (metadata_list::iterator p = ml.begin(); p != ml.end(); ++p)
1065 (*p)->FillDataFromFilename(mdlm);
1096 (*dir)->GetPrefix(),
1120 back_insert_iterator<VideoListImp::metadata_view_list> bip(flat);
1174 free_list &dh_free_list,
bool infer_title) :
1181 const QString &fq_dir_name)
override 1193 const QString &fq_file_name,
1194 const QString &extension)
1196 handleFile(file_name, fq_file_name, extension,
"");
1200 const QString &fq_file_name,
1201 const QString &extension,
1202 const QString &host)
override 1206 QString file_string(fq_file_name);
1210 QFileInfo qfi(file_string);
1211 QString title = qfi.completeBaseName();
1215 if (tmptitle.length())
1218 myData->SetTitle(title);
1221 myData->SetHost(host);
unsigned int count() const
MythGenericTree * buildVideoList(bool filebrowser, bool flatlist, int group_type, const ParentalLevel &parental_level, bool include_updirs)
TreeNodeDataPrivate(QString path, QString host, QString prefix)
void fillMetadata(metadata_list_type whence)
void buildGroupList(metadata_list_type whence)
QStringList GetVideoDirs()
std::vector< std::pair< QString, bool > > ext_ignore_list
MythGenericTree * addNode(const QString &a_string, int an_int=0, bool selectable_flag=false, bool visible=true)
void setCurrentVideoFilter(const VideoFilterSettings &filter)
uint visibleChildCount() const
TreeNodeDataPrivate(VideoMetadata *metadata)
metadata_view_list m_metadata_view_flat
const VideoMetadataListManager & getListCache() const
void SetText(const QString &text, const QString &name="", const QString &state="")
VideoMetadata * GetMetadata()
MythGenericTree * GetTreeRoot(void)
void GetMetadata(VideoMetadataListManager::metadata_list *list, meta_dir_node *node)
Fill the given metadata_list and meta_dir_node with the metadata of content retrieved from known medi...
VideoMetadata * GetMetadata(void)
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....
vector< VideoMetadata * > metadata_view_list
QString GetPath(void) const
void operator()(smart_dir_node &sdn)
QString GetPrefix(void) const
VideoMetadataListManager::VideoMetadataPtr MetadataPtr
bool ScanVideoDirectory(const QString &start_path, DirectoryHandler *handler, const FileAssociations::ext_ignore_list &ext_disposition, bool list_unknown_extensions)
QString GetPrefix() const
const VideoFilterSettings & getCurrentVideoFilter() const
const QVariant GetData(void) const
MythGenericTree * GetTreeRoot()
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
VideoMetadataListManager::metadata_list & m_metalist
void DisplayState(const QString &state, const QString &name="")
VideoListImp::metadata_view_list & m_list
QString GetHost(void) const
unsigned int getFilterChangedState(void)
meta_dir_node m_metadata_view_tree
metadata_list_type m_metadata_list_type
static void copy_filtered_tree(meta_dir_node &dst, meta_dir_node &src, const VideoFilterSettings &filter)
smart_dir_node m_directory
QString GetText(const QString &name="") const
VideoMetadataListManager m_metadata
void SetImage(const QString &filename, const QString &name="")
void sort_view_data(bool flat_list)
void setCurrentVideoFilter(const VideoFilterSettings &filter)
void SetTextFromMap(const InfoMap &infoMap, const QString &state="")
unsigned int getFilterChangedState()
QScopedPointer< MythGenericTree > video_tree_root
list< simple_ref_ptr< DirectoryHandler > > free_list
bool refreshNode(MythGenericTree *node)
dirhandler(smart_dir_node &directory, const QString &prefix, VideoMetadataListManager::metadata_list &metalist, free_list &dh_free_list, bool infer_title)
QHash< QString, QString > InfoMap
void tree_view_to_flat(meta_dir_node &tree, VideoListImp::metadata_view_list &flat)
static meta_dir_node * AddMetadataToDir(VideoMetadata *metadata, meta_dir_node *dir, meta_dir_node *hint=nullptr)
void buildFileList(smart_dir_node &directory, metadata_list &metalist, const QString &prefix)
void SetImageFromMap(const InfoMap &infoMap)
static int AddFileNode(MythGenericTree *where_to_add, QString name, VideoMetadata *metadata)
DirectoryHandler * newDir(const QString &dir_name, const QString &fq_dir_name) override
const VideoFilterSettings & getCurrentVideoFilter() const
const VideoMetadata * GetMetadata(void) const
Do Today/Yesterday/Tomorrow transform.
class VideoListImp * m_imp
MythGenericTree * buildVideoList(bool filebrowser, bool flatlist, int group_type, const ParentalLevel &parental_level, bool include_updirs)
QString toString(const QDateTime &raw_dt, uint format)
Returns formatted string representing the time.
bool matches_filter(const VideoMetadata &mdata) const
static FileAssociations & getFileAssociation()
bool meta_less_than(const VideoMetadata &lhs, const VideoMetadata &rhs) const
Compares two VideoMetadata instances.
int TryFilter(const VideoFilterSettings &filter) const
bool refreshNode(MythGenericTree *node)
#define LOG(_MASK_, _LEVEL_, _STRING_)
void setParentalLevel(ParentalLevel::Level parental_level)
meta_dir_node m_metadata_tree
static MythGenericTree * AddDirNode(MythGenericTree *where_to_add, QString name, QString fqPath, bool add_up_dirs, QString host="", QString prefix="")
bool GetBoolSetting(const QString &key, bool defaultval=false)
static QString path_to_node_name(const QString &path)
void build_generic_tree(MythGenericTree *dst, meta_dir_node *src, bool include_updirs)
void update_meta_view(bool flat_list)
unsigned int count(void) const
void refreshList(bool filebrowser, const ParentalLevel &parental_level, bool flatlist, int group_type)
TreeNodeData & operator=(const TreeNodeData &rhs)
void SetData(QVariant data)
void handleFile(const QString &file_name, const QString &fq_file_name, const QString &extension, const QString &host) override
MythGenericTree * getParent(void) const
const VideoMetadataListManager & getListCache(void) const
void handleFile(const QString &file_name, const QString &fq_file_name, const QString &extension)
VideoFilterSettings m_video_filter
unsigned int getChangedState()
bool Delete(int video_id)
free_list & m_dh_free_list
class TreeNodeDataPrivate * m_d
static void copy_entries(meta_dir_node &dst, meta_dir_node &src, const VideoFilterSettings &filter)
VideoMetadata * m_metadata
void refreshList(bool filebrowser, const ParentalLevel &parental_level, bool flatlist, int group_type)
int naturalCompare(const QString &_a, const QString &_b, Qt::CaseSensitivity caseSensitivity)
bool Delete(unsigned int video_id, VideoList &)
static UPNPScanner * Instance(UPNPSubscription *sub=nullptr)
Returns the global UPNPScanner instance if it has been enabled or nullptr if UPNPScanner is currently...
void getExtensionIgnoreList(ext_ignore_list &ext_ignore) const
VideoMetadataListManager::metadata_list metadata_list
int TryFilter(const VideoFilterSettings &filter) const
call_tree_flat(VideoListImp::metadata_view_list &list)
void DisplayStateFromMap(const InfoMap &infoMap)