command: add "findadd" command.
This commit is contained in:
		
				
					committed by
					
						
						Max Kellermann
					
				
			
			
				
	
			
			
			
						parent
						
							1e56c7b862
						
					
				
				
					commit
					df0c26a394
				
			
							
								
								
									
										1
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								NEWS
									
									
									
									
									
								
							@@ -3,6 +3,7 @@ ver 0.16 (20??/??/??)
 | 
			
		||||
  - send song modification time to client
 | 
			
		||||
  - added "update" idle event
 | 
			
		||||
  - removed the deprecated "volume" command
 | 
			
		||||
  - added the "findadd" command
 | 
			
		||||
* input:
 | 
			
		||||
  - lastfm: use metadata
 | 
			
		||||
* tags:
 | 
			
		||||
 
 | 
			
		||||
@@ -1100,6 +1100,23 @@ OK
 | 
			
		||||
            </para>
 | 
			
		||||
          </listitem>
 | 
			
		||||
        </varlistentry>
 | 
			
		||||
        <varlistentry id="command_findadd">
 | 
			
		||||
          <term>
 | 
			
		||||
            <cmdsynopsis>
 | 
			
		||||
              <command>findadd</command>
 | 
			
		||||
              <arg choice="req"><replaceable>TYPE</replaceable></arg>
 | 
			
		||||
              <arg choice="req"><replaceable>WHAT</replaceable></arg>
 | 
			
		||||
            </cmdsynopsis>
 | 
			
		||||
          </term>
 | 
			
		||||
          <listitem>
 | 
			
		||||
            <para>
 | 
			
		||||
              Finds songs in the db that are exactly
 | 
			
		||||
              <varname>WHAT</varname> and adds them to current playlist.
 | 
			
		||||
              <varname>TYPE</varname> can be any tag supported by MPD.
 | 
			
		||||
              <varname>WHAT</varname> is what to find.
 | 
			
		||||
            </para>
 | 
			
		||||
          </listitem>
 | 
			
		||||
        </varlistentry>
 | 
			
		||||
        <varlistentry id="command_list">
 | 
			
		||||
          <term>
 | 
			
		||||
            <cmdsynopsis>
 | 
			
		||||
 
 | 
			
		||||
@@ -869,6 +869,30 @@ handle_find(struct client *client, int argc, char *argv[])
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static enum command_return
 | 
			
		||||
handle_findadd(struct client *client, int argc, char *argv[])
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
    struct locate_item_list *list =
 | 
			
		||||
	    locate_item_list_parse(argv + 1, argc - 1);
 | 
			
		||||
    if (list == NULL || list->length == 0) {
 | 
			
		||||
	    if (list != NULL)
 | 
			
		||||
		    locate_item_list_free(list);
 | 
			
		||||
 | 
			
		||||
	    command_error(client, ACK_ERROR_ARG, "incorrect arguments");
 | 
			
		||||
	    return COMMAND_RETURN_ERROR;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = findAddIn(client, NULL, list);
 | 
			
		||||
    if (ret == -1)
 | 
			
		||||
	    command_error(client, ACK_ERROR_NO_EXIST,
 | 
			
		||||
			  "directory or file not found");
 | 
			
		||||
 | 
			
		||||
    locate_item_list_free(list);
 | 
			
		||||
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static enum command_return
 | 
			
		||||
handle_search(struct client *client, int argc, char *argv[])
 | 
			
		||||
{
 | 
			
		||||
@@ -1671,6 +1695,7 @@ static const struct command commands[] = {
 | 
			
		||||
	{ "disableoutput", PERMISSION_ADMIN, 1, 1, handle_disableoutput },
 | 
			
		||||
	{ "enableoutput", PERMISSION_ADMIN, 1, 1, handle_enableoutput },
 | 
			
		||||
	{ "find", PERMISSION_READ, 2, -1, handle_find },
 | 
			
		||||
	{ "findadd", PERMISSION_READ, 2, -1, handle_findadd},
 | 
			
		||||
	{ "idle", PERMISSION_READ, 0, -1, handle_idle },
 | 
			
		||||
	{ "kill", PERMISSION_ADMIN, -1, -1, handle_kill },
 | 
			
		||||
	{ "list", PERMISSION_READ, 1, -1, handle_list },
 | 
			
		||||
 
 | 
			
		||||
@@ -199,6 +199,28 @@ int addAllInToStoredPlaylist(const char *name, const char *utf8file)
 | 
			
		||||
	return db_walk(name, directoryAddSongToStoredPlaylist, NULL, &data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
findAddInDirectory(struct song *song, void *_data)
 | 
			
		||||
{
 | 
			
		||||
	struct search_data *data = _data;
 | 
			
		||||
 | 
			
		||||
	if (locate_song_match(song, data->criteria))
 | 
			
		||||
		return directoryAddSongToPlaylist(song, data);
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int findAddIn(struct client *client, const char *name,
 | 
			
		||||
	      const struct locate_item_list *criteria)
 | 
			
		||||
{
 | 
			
		||||
	struct search_data data;
 | 
			
		||||
 | 
			
		||||
	data.client   = client;
 | 
			
		||||
	data.criteria = criteria;
 | 
			
		||||
 | 
			
		||||
	return db_walk(name, findAddInDirectory, NULL, &data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
directoryPrintSongInfo(struct song *song, void *data)
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -39,6 +39,10 @@ int
 | 
			
		||||
findSongsIn(struct client *client, const char *name,
 | 
			
		||||
	    const struct locate_item_list *criteria);
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
findAddIn(struct client *client, const char *name,
 | 
			
		||||
	  const struct locate_item_list *criteria);
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
searchStatsForSongsIn(struct client *client, const char *name,
 | 
			
		||||
		      const struct locate_item_list *criteria);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user