diff --git a/core/controllers/playlists.php b/core/controllers/playlists.php index b075ba7c..0a926d55 100644 --- a/core/controllers/playlists.php +++ b/core/controllers/playlists.php @@ -140,7 +140,10 @@ public function search() $my = $this->data('my'); - $search_result = $this->models->playlists('search', $query, $limit, $offset, $sort_by, $sort_dir, $my); + $owner = $this->data('owner'); + $group = $this->data('group'); + + $search_result = $this->models->playlists('search', $query, $limit, $offset, $sort_by, $sort_dir, $my, $owner, $group); foreach ($search_result['playlists'] as &$playlist) { $playlist['can_edit'] = $this->user_can_edit($playlist); diff --git a/core/models/media_model.php b/core/models/media_model.php index ad873823..5382fbab 100644 --- a/core/models/media_model.php +++ b/core/models/media_model.php @@ -954,7 +954,7 @@ public function search_filters_validate($args = []) OBFHelpers::require_args($args, ['filters']); $filters = $args['filters']; - $allowed_filters = ['comments','artist','title','album','year','type','category','country','language','genre','duration','is_copyright_owner','status','dynamic_select']; + $allowed_filters = ['comments','artist','title','album','year','type','category','country','language','genre','duration','is_copyright_owner','status','dynamic_select','owner','group']; $allowed_operators = [ // deprecated 'like', @@ -1037,6 +1037,7 @@ public function search_filters_where_array($args = []) $column_array['comments'] = 'media.comments'; $column_array['is_copyright_owner'] = 'media.is_copyright_owner'; $column_array['dynamic_select'] = 'media.dynamic_select'; + $column_array['owner'] = 'media.owner_id'; $metadata_fields = $this->models->mediametadata('get_all'); $metadata_defaults = []; @@ -1057,6 +1058,18 @@ public function search_filters_where_array($args = []) } } + // group filter uses a subquery on media_permissions_groups + if ($filter['filter'] === 'group') { + $group_id = $this->db->escape($filter['val']); + if (in_array($filter['op'], ['is', 'eq'])) { + $tmp_sql = 'media.id IN (SELECT media_id FROM media_permissions_groups WHERE group_id = "' . $group_id . '")'; + } else { + $tmp_sql = 'media.id NOT IN (SELECT media_id FROM media_permissions_groups WHERE group_id = "' . $group_id . '")'; + } + $where_array[] = $tmp_sql; + continue; + } + // find_in_set works a bit differently // TODO note not_has deprecated if (in_array($filter['op'], ['has','not_has','nhas'])) { diff --git a/core/models/playlists_model.php b/core/models/playlists_model.php index 86649a37..4563504b 100644 --- a/core/models/playlists_model.php +++ b/core/models/playlists_model.php @@ -294,7 +294,7 @@ public function where_used($id) * * @return [num_results, playlists] */ - public function search($query, $limit, $offset, $sort_by, $sort_dir, $my = false) + public function search($query, $limit, $offset, $sort_by, $sort_dir, $my = false, $owner = null, $group = null) { $where_strings = []; @@ -310,6 +310,16 @@ public function search($query, $limit, $offset, $sort_by, $sort_dir, $my = false $where_strings[] = 'owner_id = "' . $this->db->escape($this->user->param('id')) . '"'; } + // filter by owner + if (!empty($owner)) { + $where_strings[] = 'owner_id = "' . $this->db->escape($owner) . '"'; + } + + // filter by group + if (!empty($group)) { + $where_strings[] = 'playlists.id IN (SELECT playlist_id FROM playlists_permissions_groups WHERE group_id = "' . $this->db->escape($group) . '")'; + } + if (count($where_strings) > 0) { $this->db->where_string(implode(' AND ', $where_strings)); } diff --git a/public/html/sidebar/advanced_search.html b/public/html/sidebar/advanced_search.html index cffcba45..fc27bffc 100644 --- a/public/html/sidebar/advanced_search.html +++ b/public/html/sidebar/advanced_search.html @@ -23,6 +23,8 @@ + + + + + +   diff --git a/public/js/settings.js b/public/js/settings.js index eb141f11..dcc09963 100644 --- a/public/js/settings.js +++ b/public/js/settings.js @@ -17,6 +17,7 @@ OB.Settings.genres = new Array(); OB.Settings.permissions = null; OB.Settings.groups = null; +OB.Settings.users = null; OB.Settings.storeCache = {}; @@ -31,6 +32,8 @@ OB.Settings.getSettings = function (callback) { post.push(["metadata", "media_get_fields", {}]); post.push(["metadata", "playlist_item_types", {}]); post.push(["metadata", "recording_default_values", {}]); + post.push(["users", "user_list", {}]); + post.push(["users", "group_list", {}]); OB.API.multiPost( post, @@ -44,6 +47,8 @@ OB.Settings.getSettings = function (callback) { OB.Settings.media_required_fields = response[6].data; OB.Settings.playlist_item_types = response[7].data; OB.Settings.recording_metadata = response[8].data; + OB.Settings.users = response[9].data; + OB.Settings.groups = response[10].data; if (callback) callback(); }, diff --git a/public/js/sidebar.js b/public/js/sidebar.js index 7565691b..c0824cb2 100644 --- a/public/js/sidebar.js +++ b/public/js/sidebar.js @@ -1293,6 +1293,22 @@ OB.Sidebar.advancedSearchWindowInit = function () { ); }); + if (OB.Settings.users) { + $.each(OB.Settings.users, function (index, user) { + $("#advanced_search_owner_options").append( + '", + ); + }); + } + + if (OB.Settings.groups) { + $.each(OB.Settings.groups, function (index, group) { + $("#advanced_search_group_options").append( + '", + ); + }); + } + $.each(OB.Settings.media_metadata, function (index, metadata) { // skip hidden metadata and media/playlist currently unsupported for advanced search if (metadata.type == "hidden" || metadata.type == "media" || metadata.type == "playlist") return;