Browse Source

medialibrary: Udpate folder support

pull/134/head
Benjamin Arnaud 5 years ago
committed by Jean-Baptiste Kempf
parent
commit
6f2b25fac0
  1. 102
      include/vlc_media_library.h
  2. 1
      modules/gui/qt/medialibrary/mlqmltypes.hpp
  3. 12
      modules/misc/medialibrary/entities.cpp
  4. 127
      modules/misc/medialibrary/medialibrary.cpp
  5. 3
      modules/misc/medialibrary/medialibrary.h

102
include/vlc_media_library.h

@ -334,9 +334,11 @@ typedef struct vlc_ml_playlist_list_t
typedef struct vlc_ml_folder_t
{
int64_t i_id; /**< This folder's MRL. Will be NULL if b_present is false */
char* psz_mrl; /**< This folder's MRL. Will be NULL if b_present is false */
bool b_present; /**< The presence state for this folder. */
int64_t i_id; /**< The folder's MRL. Will be NULL if b_present is false */
char* psz_name; /**< The folder's name */
char* psz_mrl; /**< The folder's MRL. Will be NULL if b_present is false */
unsigned int i_nb_media; /**< The media count */
bool b_present; /**< The folder's presence state */
bool b_banned; /**< Will be true if the user required this folder to be excluded */
} vlc_ml_folder_t;
@ -443,6 +445,8 @@ enum vlc_ml_list_queries
VLC_ML_COUNT_ENTRY_POINTS, /**< arg1 bool: list_banned; arg2 (out): size_t* */
VLC_ML_LIST_FOLDERS, /**< arg1 (out): vlc_ml_folder_list_t** */
VLC_ML_COUNT_FOLDERS, /**< arg1 (out): size_t* */
VLC_ML_LIST_FOLDERS_BY_TYPE, /**< arg1 vlc_ml_media_type_t: the media type. arg2 (out): vlc_ml_media_list_t** */
VLC_ML_COUNT_FOLDERS_BY_TYPE, /**< arg1 vlc_ml_media_type_t: the media type. arg2 (out): vlc_ml_media_list_t** */
/* Album specific listings */
VLC_ML_LIST_ALBUM_TRACKS, /**< arg1: The album id. arg2 (out): vlc_ml_media_list_t** */
@ -484,8 +488,8 @@ enum vlc_ml_list_queries
/* Folder specific listings */
VLC_ML_LIST_SUBFOLDERS, /**< arg1: parent id; arg2 (out): vlc_ml_folder_list_t** */
VLC_ML_COUNT_SUBFOLDERS, /**< arg1: parent id; arg2 (out): size_t* */
VLC_ML_LIST_FOLDER_MEDIAS, /**< arg1: folder id; arg2 (out): vlc_ml_media_list_t** */
VLC_ML_COUNT_FOLDER_MEDIAS, /**< arg1: folder id; arg2 (out): size_t* */
VLC_ML_LIST_FOLDER_MEDIA, /**< arg1: folder id; arg2 (out): vlc_ml_media_list_t** */
VLC_ML_COUNT_FOLDER_MEDIA, /**< arg1: folder id; arg2 (out): size_t* */
/* Children entities listing */
VLC_ML_LIST_MEDIA_OF, /**< arg1: parent entity type; arg2: parent entity id; arg3(out): ml_media_list_t** */
@ -508,6 +512,7 @@ enum vlc_ml_parent_type
VLC_ML_PARENT_SHOW,
VLC_ML_PARENT_GENRE,
VLC_ML_PARENT_GROUP,
VLC_ML_PARENT_FOLDER,
VLC_ML_PARENT_PLAYLIST,
};
@ -1757,6 +1762,93 @@ static inline size_t vlc_ml_count_banned_entry_points( vlc_medialibrary_t* p_ml,
return res;
}
// Folders
static inline vlc_ml_folder_list_t * vlc_ml_list_folders(vlc_medialibrary_t * p_ml,
const vlc_ml_query_params_t * params)
{
vlc_assert(p_ml != NULL);
vlc_ml_folder_list_t * res;
if (vlc_ml_list(p_ml, VLC_ML_LIST_FOLDERS, params, &res) != VLC_SUCCESS)
return NULL;
return res;
}
static inline size_t vlc_ml_count_folders(vlc_medialibrary_t * p_ml,
const vlc_ml_query_params_t * params)
{
vlc_assert(p_ml != NULL);
size_t count;
if (vlc_ml_list(p_ml, VLC_ML_COUNT_FOLDERS, params, &count) != VLC_SUCCESS)
return 0;
return count;
}
static inline
vlc_ml_folder_list_t * vlc_ml_list_folders_by_type(vlc_medialibrary_t * p_ml,
const vlc_ml_query_params_t * params,
vlc_ml_media_type_t type)
{
vlc_assert(p_ml != NULL);
vlc_ml_folder_list_t * res;
if (vlc_ml_list(p_ml, VLC_ML_LIST_FOLDERS_BY_TYPE, params, (int) type, &res) != VLC_SUCCESS)
return NULL;
return res;
}
static inline size_t vlc_ml_count_folders_by_type(vlc_medialibrary_t * p_ml,
const vlc_ml_query_params_t * params,
vlc_ml_media_type_t type)
{
vlc_assert(p_ml != NULL);
size_t count;
if (vlc_ml_list(p_ml, VLC_ML_COUNT_FOLDERS_BY_TYPE, params, (int) type, &count) != VLC_SUCCESS)
return 0;
return count;
}
// Folder Media
static inline vlc_ml_media_list_t * vlc_ml_list_folder_media(vlc_medialibrary_t * p_ml,
const vlc_ml_query_params_t * params,
int64_t i_folder_id)
{
vlc_assert(p_ml != NULL);
vlc_ml_media_list_t * res;
if (vlc_ml_list(p_ml, VLC_ML_LIST_FOLDER_MEDIA, params, i_folder_id, &res) != VLC_SUCCESS)
return NULL;
return res;
}
static inline size_t vlc_ml_count_folder_media(vlc_medialibrary_t * p_ml,
const vlc_ml_query_params_t * params,
int64_t i_folder_id)
{
vlc_assert(p_ml != NULL);
size_t count;
if (vlc_ml_list(p_ml, VLC_ML_COUNT_FOLDER_MEDIA, params, i_folder_id, &count) != VLC_SUCCESS)
return 0;
return count;
}
#ifdef __cplusplus
}
#endif /* C++ */

1
modules/gui/qt/medialibrary/mlqmltypes.hpp

@ -53,6 +53,7 @@ public:
ML_PARENT_TYPE_CASE(VLC_ML_PARENT_SHOW);
ML_PARENT_TYPE_CASE(VLC_ML_PARENT_GENRE);
ML_PARENT_TYPE_CASE(VLC_ML_PARENT_GROUP);
ML_PARENT_TYPE_CASE(VLC_ML_PARENT_FOLDER);
ML_PARENT_TYPE_CASE(VLC_ML_PARENT_PLAYLIST);
default:
return QString("UNKNOWN - %2").arg(id);

12
modules/misc/medialibrary/entities.cpp

@ -455,18 +455,28 @@ bool Convert( const medialibrary::IPlaylist* input, vlc_ml_playlist_t& output )
bool Convert( const medialibrary::IFolder* input, vlc_ml_folder_t& output )
{
output.i_id = input->id();
output.i_nb_media = input->nbMedia();
output.b_banned = input->isBanned();
if ( strdup_helper( input->name(), output.psz_name ) == false )
return false;
try
{
if ( strdup_helper( input->mrl(), output.psz_mrl ) == false )
if (strdup_helper(input->mrl(), output.psz_mrl) == false)
return false;
output.b_present = true;
}
catch ( const medialibrary::fs::errors::DeviceRemoved& )
{
output.psz_mrl = nullptr;
output.b_present = false;
}
return true;
}

127
modules/misc/medialibrary/medialibrary.cpp

@ -1002,6 +1002,13 @@ int MediaLibrary::List( int listQuery, const vlc_ml_query_params_t* params, va_l
case VLC_ML_LIST_GROUP_MEDIA:
case VLC_ML_COUNT_GROUP_MEDIA:
return listGroup( listQuery, paramsPtr, type, psz_pattern, nbItems, offset, args );
case VLC_ML_LIST_FOLDERS:
case VLC_ML_COUNT_FOLDERS:
case VLC_ML_LIST_FOLDERS_BY_TYPE:
case VLC_ML_COUNT_FOLDERS_BY_TYPE:
case VLC_ML_LIST_FOLDER_MEDIA:
case VLC_ML_COUNT_FOLDER_MEDIA:
return listFolder( listQuery, paramsPtr, type, psz_pattern, nbItems, offset, args );
case VLC_ML_LIST_PLAYLIST_MEDIA:
case VLC_ML_COUNT_PLAYLIST_MEDIA:
case VLC_ML_LIST_PLAYLISTS:
@ -1097,42 +1104,6 @@ int MediaLibrary::List( int listQuery, const vlc_ml_query_params_t* params, va_l
*( va_arg( args, size_t* ) ) = query == nullptr ? 0 : query->count();
break;
}
case VLC_ML_LIST_FOLDERS:
{
const auto query = m_ml->folders( medialibrary::IMedia::Type::Unknown, paramsPtr );
if ( query == nullptr )
return VLC_EGENERIC;
auto* res = ml_convert_list<vlc_ml_folder_list_t, vlc_ml_folder_t>( query->all() );
*( va_arg( args, vlc_ml_folder_list_t** ) ) = res;
break;
}
case VLC_ML_COUNT_FOLDERS:
{
const auto query = m_ml->folders( medialibrary::IMedia::Type::Unknown, paramsPtr );
*( va_arg( args, size_t* ) ) = query == nullptr ? 0 : query->count();
break;
}
case VLC_ML_LIST_FOLDER_MEDIAS:
{
const auto folder = m_ml->folder( va_arg( args, int64_t ) );
if ( folder == nullptr )
return VLC_EGENERIC;
const auto query = folder->media( medialibrary::IMedia::Type::Unknown, paramsPtr );
if ( query == nullptr )
return VLC_EGENERIC;
auto* res = ml_convert_list<vlc_ml_media_list_t, vlc_ml_media_t>( query->all() );
*( va_arg( args, vlc_ml_media_list_t** ) ) = res;
break;
}
case VLC_ML_COUNT_FOLDER_MEDIAS:
{
const auto folder = m_ml->folder( va_arg( args, int64_t ) );
if ( folder == nullptr )
return VLC_EGENERIC;
const auto query = folder->media( medialibrary::IMedia::Type::Unknown, paramsPtr );
*( va_arg( args, size_t* ) ) = query == nullptr ? 0 : query->count();
break;
}
}
return VLC_SUCCESS;
}
@ -1550,6 +1521,8 @@ int MediaLibrary::filterListChildrenQuery( int query, int parentType )
return VLC_ML_LIST_GENRE_TRACKS;
case VLC_ML_PARENT_GROUP:
return VLC_ML_LIST_GROUP_MEDIA;
case VLC_ML_PARENT_FOLDER:
return VLC_ML_LIST_FOLDER_MEDIA;
case VLC_ML_PARENT_PLAYLIST:
return VLC_ML_LIST_PLAYLIST_MEDIA;
default:
@ -1570,6 +1543,8 @@ int MediaLibrary::filterListChildrenQuery( int query, int parentType )
return VLC_ML_COUNT_GENRE_TRACKS;
case VLC_ML_PARENT_GROUP:
return VLC_ML_COUNT_GROUP_MEDIA;
case VLC_ML_PARENT_FOLDER:
return VLC_ML_COUNT_FOLDER_MEDIA;
case VLC_ML_PARENT_PLAYLIST:
return VLC_ML_COUNT_PLAYLIST_MEDIA;
default:
@ -1901,6 +1876,86 @@ int MediaLibrary::listGroup( int listQuery, const medialibrary::QueryParameters*
}
}
int MediaLibrary::listFolder(int listQuery, const medialibrary::QueryParameters * paramsPtr,
medialibrary::IMedia::Type type, const char * pattern,
uint32_t nbItems, uint32_t offset, va_list args)
{
switch (listQuery)
{
case VLC_ML_LIST_FOLDERS:
case VLC_ML_COUNT_FOLDERS:
case VLC_ML_LIST_FOLDERS_BY_TYPE:
case VLC_ML_COUNT_FOLDERS_BY_TYPE:
{
medialibrary::Query<medialibrary::IFolder> query;
if (pattern)
query = m_ml->searchFolders(pattern, type, paramsPtr);
else
query = m_ml->folders(type, paramsPtr);
if (query == nullptr)
return VLC_EGENERIC;
switch (listQuery)
{
case VLC_ML_LIST_FOLDERS:
case VLC_ML_LIST_FOLDERS_BY_TYPE:
*va_arg(args, vlc_ml_folder_list_t **) =
ml_convert_list<vlc_ml_folder_list_t, vlc_ml_folder_t>
(query->items(nbItems, offset));
return VLC_SUCCESS;
case VLC_ML_COUNT_FOLDERS:
case VLC_ML_COUNT_FOLDERS_BY_TYPE:
*va_arg(args, size_t *) = query->count();
return VLC_SUCCESS;
default:
vlc_assert_unreachable();
}
}
case VLC_ML_LIST_FOLDER_MEDIA:
case VLC_ML_COUNT_FOLDER_MEDIA:
{
medialibrary::FolderPtr folder = m_ml->folder(va_arg(args, int64_t));
if (folder == nullptr)
return VLC_EGENERIC;
medialibrary::Query<medialibrary::IMedia> query;
if (pattern)
query = folder->searchMedia(pattern, type, paramsPtr);
else
query = folder->media(type, paramsPtr);
if (query == nullptr)
return VLC_EGENERIC;
switch (listQuery)
{
case VLC_ML_LIST_FOLDER_MEDIA:
*va_arg(args, vlc_ml_media_list_t **) =
ml_convert_list<vlc_ml_media_list_t, vlc_ml_media_t>
(query->items(nbItems, offset));
return VLC_SUCCESS;
case VLC_ML_COUNT_FOLDER_MEDIA:
*va_arg(args, size_t *) = query->count();
return VLC_SUCCESS;
default:
vlc_assert_unreachable();
}
}
default:
vlc_assert_unreachable();
}
}
int MediaLibrary::listPlaylist( int listQuery, const medialibrary::QueryParameters* paramsPtr,
const char* pattern, uint32_t nbItems, uint32_t offset, va_list args )
{

3
modules/misc/medialibrary/medialibrary.h

@ -172,6 +172,9 @@ private:
int listGroup( int listQuery, const medialibrary::QueryParameters* paramsPtr,
medialibrary::IMedia::Type type, const char* pattern, uint32_t nbItems,
uint32_t offset, va_list args );
int listFolder( int listQuery, const medialibrary::QueryParameters* paramsPtr,
medialibrary::IMedia::Type type, const char* pattern, uint32_t nbItems,
uint32_t offset, va_list args );
int listPlaylist( int listQuery, const medialibrary::QueryParameters* paramsPtr,
const char* pattern, uint32_t nbItems, uint32_t offset, va_list args );
int listMedia( int listQuery, const medialibrary::QueryParameters* paramsPtr,

Loading…
Cancel
Save