mirror of
				https://github.com/SuperBFG7/ympd
				synced 2025-10-31 13:53:00 +00:00 
			
		
		
		
	Fix: move functions in mympd_api.c
This commit is contained in:
		
							
								
								
									
										48
									
								
								src/global.c
									
									
									
									
									
								
							
							
						
						
									
										48
									
								
								src/global.c
									
									
									
									
									
								
							| @@ -33,6 +33,54 @@ | |||||||
| #include "list.h" | #include "list.h" | ||||||
| #include "global.h" | #include "global.h" | ||||||
|  |  | ||||||
|  | bool state_file_read(t_config *config, const char *name, char *value) { | ||||||
|  |     char cfg_file[400]; | ||||||
|  |     char *line; | ||||||
|  |     size_t n = 0; | ||||||
|  |     ssize_t read; | ||||||
|  |      | ||||||
|  |     if (!validate_string(name)) | ||||||
|  |         return false; | ||||||
|  |     snprintf(cfg_file, 400, "%s/state/%s", config->varlibdir, name); | ||||||
|  |     FILE *fp = fopen(cfg_file, "r"); | ||||||
|  |     if (fp == NULL) { | ||||||
|  |         printf("Error opening %s\n", cfg_file); | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  |     read = getline(&line, &n, fp); | ||||||
|  |     snprintf(value, 400, "%s", line); | ||||||
|  |     LOG_DEBUG() fprintf(stderr, "DEBUG: State %s: %s\n", name, value); | ||||||
|  |     fclose(fp); | ||||||
|  |     if (read > 0) | ||||||
|  |         return true; | ||||||
|  |     else | ||||||
|  |         return false; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | bool state_file_write(t_config *config, const char *name, const char *value) { | ||||||
|  |     char tmp_file[400]; | ||||||
|  |     char cfg_file[400]; | ||||||
|  |      | ||||||
|  |     if (!validate_string(name)) | ||||||
|  |         return false; | ||||||
|  |     snprintf(cfg_file, 400, "%s/state/%s", config->varlibdir, name); | ||||||
|  |     snprintf(tmp_file, 400, "%s/tmp/%s", config->varlibdir, name); | ||||||
|  |          | ||||||
|  |     FILE *fp = fopen(tmp_file, "w"); | ||||||
|  |     if (fp == NULL) { | ||||||
|  |         printf("Error opening %s\n", tmp_file); | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  |     fprintf(fp, "%s", value); | ||||||
|  |     fclose(fp); | ||||||
|  |     if (rename(tmp_file, cfg_file) == -1) { | ||||||
|  |         printf("Error renaming file from %s to %s\n", tmp_file, cfg_file); | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  |     return true; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| bool testdir(char *name, char *dirname) { | bool testdir(char *name, char *dirname) { | ||||||
|     DIR* dir = opendir(dirname); |     DIR* dir = opendir(dirname); | ||||||
|     if (dir) { |     if (dir) { | ||||||
|   | |||||||
| @@ -110,10 +110,11 @@ | |||||||
|     X(MPD_API_PLAYER_CURRENT_SONG) \ |     X(MPD_API_PLAYER_CURRENT_SONG) \ | ||||||
|     X(MPD_API_PLAYER_STATE) \ |     X(MPD_API_PLAYER_STATE) \ | ||||||
|     X(MPD_API_SETTINGS_GET) \ |     X(MPD_API_SETTINGS_GET) \ | ||||||
|     X(MPD_API_SETTINGS_SET) \ |  | ||||||
|     X(MPD_API_LIKE) \ |     X(MPD_API_LIKE) \ | ||||||
|     X(MPD_API_COLS_SAVE) \ |     X(MYMPD_API_COLS_SAVE) \ | ||||||
|     X(MYMPD_API_SYSCMD) |     X(MYMPD_API_SYSCMD) \ | ||||||
|  |     X(MYMPD_API_SETTINGS_GET) \ | ||||||
|  |     X(MYMPD_API_SETTINGS_SET) \ | ||||||
|  |  | ||||||
| #define GEN_ENUM(X) X, | #define GEN_ENUM(X) X, | ||||||
| #define GEN_STR(X) #X, | #define GEN_STR(X) #X, | ||||||
| @@ -129,6 +130,13 @@ enum mympd_cmd_ids { | |||||||
|     MYMPD_CMDS(GEN_ENUM) |     MYMPD_CMDS(GEN_ENUM) | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | enum jukebox_modes { | ||||||
|  |     JUKEBOX_OFF, | ||||||
|  |     JUKEBOX_ADD_SONG, | ||||||
|  |     JUKEBOX_ADD_ALBUM, | ||||||
|  | }; | ||||||
|  |  | ||||||
| //message queue | //message queue | ||||||
| tiny_queue_t *web_server_queue; | tiny_queue_t *web_server_queue; | ||||||
| tiny_queue_t *mpd_client_queue; | tiny_queue_t *mpd_client_queue; | ||||||
| @@ -176,7 +184,6 @@ typedef struct t_config { | |||||||
|     const char *streamurl; |     const char *streamurl; | ||||||
|     unsigned long last_played_count; |     unsigned long last_played_count; | ||||||
|     long loglevel; |     long loglevel; | ||||||
|     struct list syscmd_list; |  | ||||||
| } t_config; | } t_config; | ||||||
|  |  | ||||||
| //global functions | //global functions | ||||||
| @@ -186,4 +193,6 @@ bool validate_string(const char *data); | |||||||
| int copy_string(char * const dest, char const * const src, size_t const dst_len, size_t const src_len); | int copy_string(char * const dest, char const * const src, size_t const dst_len, size_t const src_len); | ||||||
| int replacechar(char *str, const char orig, const char rep); | int replacechar(char *str, const char orig, const char rep); | ||||||
| enum mympd_cmd_ids get_cmd_id(const char *cmd); | enum mympd_cmd_ids get_cmd_id(const char *cmd); | ||||||
|  | bool state_file_read(t_config *config, const char *name, char *value); | ||||||
|  | bool state_file_write(t_config *config, const char *name, const char *value); | ||||||
| #endif | #endif | ||||||
|   | |||||||
							
								
								
									
										92
									
								
								src/main.c
									
									
									
									
									
								
							
							
						
						
									
										92
									
								
								src/main.c
									
									
									
									
									
								
							| @@ -54,120 +54,94 @@ static int inihandler(void *user, const char *section, const char *name, const c | |||||||
|     t_config* p_config = (t_config*)user; |     t_config* p_config = (t_config*)user; | ||||||
|     char *crap; |     char *crap; | ||||||
|  |  | ||||||
|     #define MATCH(n) strcmp(name, n) == 0 |     #define MATCH(s, n) strcmp(section, s) == 0 && strcmp(name, n) == 0 | ||||||
|  |  | ||||||
|     if (MATCH("mpdhost")) |     if (MATCH("mpd", "mpdhost")) | ||||||
|         p_config->mpdhost = strdup(value); |         p_config->mpdhost = strdup(value); | ||||||
|     else if (MATCH("mpdport")) |     else if (MATCH("mpd", "mpdport")) | ||||||
|         p_config->mpdport = strtol(value, &crap, 10); |         p_config->mpdport = strtol(value, &crap, 10); | ||||||
|     else if (MATCH("mpdpass")) |     else if (MATCH("mpd", "mpdpass")) | ||||||
|         p_config->mpdpass = strdup(value); |         p_config->mpdpass = strdup(value); | ||||||
|     else if (MATCH("webport")) |     else if (MATCH("mpd", "streamport")) | ||||||
|  |         p_config->streamport = strtol(value, &crap, 10); | ||||||
|  |     else if (MATCH("webserver", "webport")) | ||||||
|         p_config->webport = strdup(value); |         p_config->webport = strdup(value); | ||||||
|     else if (MATCH("ssl")) |     else if (MATCH("webserver", "ssl")) | ||||||
|         if (strcmp(value, "true") == 0) |         if (strcmp(value, "true") == 0) | ||||||
|             p_config->ssl = true; |             p_config->ssl = true; | ||||||
|         else |         else | ||||||
|             p_config->ssl = false; |             p_config->ssl = false; | ||||||
|     else if (MATCH("sslport")) |     else if (MATCH("webserver", "sslport")) | ||||||
|         p_config->sslport = strdup(value); |         p_config->sslport = strdup(value); | ||||||
|     else if (MATCH("sslcert")) |     else if (MATCH("webserver", "sslcert")) | ||||||
|         p_config->sslcert = strdup(value); |         p_config->sslcert = strdup(value); | ||||||
|     else if (MATCH("sslkey")) |     else if (MATCH("webserver", "sslkey")) | ||||||
|         p_config->sslkey = strdup(value); |         p_config->sslkey = strdup(value); | ||||||
|     else if (MATCH("user")) |     else if (MATCH("mympd", "user")) | ||||||
|         p_config->user = strdup(value); |         p_config->user = strdup(value); | ||||||
|     else if (MATCH("streamport")) |     else if (MATCH("mympd", "coverimage")) | ||||||
|         p_config->streamport = strtol(value, &crap, 10); |  | ||||||
|     else if (MATCH("coverimage")) |  | ||||||
|         if (strcmp(value, "true") == 0) |         if (strcmp(value, "true") == 0) | ||||||
|             p_config->coverimage = true; |             p_config->coverimage = true; | ||||||
|         else |         else | ||||||
|             p_config->coverimage = false; |             p_config->coverimage = false; | ||||||
|     else if (MATCH("coverimagename")) |     else if (MATCH("mympd", "coverimagename")) | ||||||
|         p_config->coverimagename = strdup(value); |         p_config->coverimagename = strdup(value); | ||||||
|     else if (MATCH("coverimagesize")) |     else if (MATCH("mympd", "coverimagesize")) | ||||||
|         p_config->coverimagesize = strtol(value, &crap, 10); |         p_config->coverimagesize = strtol(value, &crap, 10); | ||||||
|     else if (MATCH("varlibdir")) |     else if (MATCH("mympd", "varlibdir")) | ||||||
|         p_config->varlibdir = strdup(value); |         p_config->varlibdir = strdup(value); | ||||||
|     else if (MATCH("stickers")) |     else if (MATCH("mympd", "stickers")) | ||||||
|         if (strcmp(value, "true") == 0) |         if (strcmp(value, "true") == 0) | ||||||
|             p_config->stickers = true; |             p_config->stickers = true; | ||||||
|         else |         else | ||||||
|             p_config->stickers = false; |             p_config->stickers = false; | ||||||
|     else if (MATCH("smartpls")) |     else if (MATCH("mympd", "smartpls")) | ||||||
|         if (strcmp(value, "true") == 0) |         if (strcmp(value, "true") == 0) | ||||||
|             p_config->smartpls = true; |             p_config->smartpls = true; | ||||||
|         else |         else | ||||||
|             p_config->smartpls = false; |             p_config->smartpls = false; | ||||||
|     else if (MATCH("mixramp")) |     else if (MATCH("mympd", "mixramp")) | ||||||
|         if (strcmp(value, "true") == 0) |         if (strcmp(value, "true") == 0) | ||||||
|             p_config->mixramp = true; |             p_config->mixramp = true; | ||||||
|         else |         else | ||||||
|             p_config->mixramp = false; |             p_config->mixramp = false; | ||||||
|     else if (MATCH("taglist")) |     else if (MATCH("mympd", "taglist")) | ||||||
|         p_config->taglist = strdup(value); |         p_config->taglist = strdup(value); | ||||||
|     else if (MATCH("searchtaglist")) |     else if (MATCH("mympd", "searchtaglist")) | ||||||
|         p_config->searchtaglist = strdup(value);         |         p_config->searchtaglist = strdup(value);         | ||||||
|     else if (MATCH("browsetaglist")) |     else if (MATCH("mympd", "browsetaglist")) | ||||||
|         p_config->browsetaglist = strdup(value); |         p_config->browsetaglist = strdup(value); | ||||||
|     else if (MATCH("max_elements_per_page")) { |     else if (MATCH("mympd", "max_elements_per_page")) { | ||||||
|         p_config->max_elements_per_page = strtol(value, &crap, 10); |         p_config->max_elements_per_page = strtol(value, &crap, 10); | ||||||
|         if (p_config->max_elements_per_page > MAX_ELEMENTS_PER_PAGE) { |         if (p_config->max_elements_per_page > MAX_ELEMENTS_PER_PAGE) { | ||||||
|             printf("Setting max_elements_per_page to maximal value %d", MAX_ELEMENTS_PER_PAGE); |             printf("Setting max_elements_per_page to maximal value %d", MAX_ELEMENTS_PER_PAGE); | ||||||
|             p_config->max_elements_per_page = MAX_ELEMENTS_PER_PAGE; |             p_config->max_elements_per_page = MAX_ELEMENTS_PER_PAGE; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     else if (MATCH("syscmds")) |     else if (MATCH("mympd", "syscmds")) | ||||||
|         if (strcmp(value, "true") == 0) |         if (strcmp(value, "true") == 0) | ||||||
|             p_config->syscmds = true; |             p_config->syscmds = true; | ||||||
|         else |         else | ||||||
|             p_config->syscmds = false; |             p_config->syscmds = false; | ||||||
|     else if (MATCH("localplayer")) |     else if (MATCH("mympd", "localplayer")) | ||||||
|         if (strcmp(value, "true") == 0) |         if (strcmp(value, "true") == 0) | ||||||
|             p_config->localplayer = true; |             p_config->localplayer = true; | ||||||
|         else |         else | ||||||
|             p_config->localplayer = false; |             p_config->localplayer = false; | ||||||
|     else if (MATCH("streamurl")) |     else if (MATCH("mympd", "streamurl")) | ||||||
|         p_config->streamurl = strdup(value); |         p_config->streamurl = strdup(value); | ||||||
|     else if (MATCH("last_played_count")) |     else if (MATCH("mympd", "last_played_count")) | ||||||
|         p_config->last_played_count = strtol(value, &crap, 10); |         p_config->last_played_count = strtol(value, &crap, 10); | ||||||
|     else if (MATCH("loglevel")) |     else if (MATCH("mympd", "loglevel")) | ||||||
|         p_config->loglevel = strtol(value, &crap, 10); |         p_config->loglevel = strtol(value, &crap, 10); | ||||||
|     else { |     else { | ||||||
|         printf("Unkown config line: %s\n", name); |         printf("Unkown config option: %s - %s\n", section, name); | ||||||
|         return 0;  /* unknown section/name, error */ |         return 0;  /* unknown section/name, error */ | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return 1; |     return 1; | ||||||
| } | } | ||||||
|  |  | ||||||
| void read_syscmds(t_config *config) { |  | ||||||
|     DIR *dir; |  | ||||||
|     struct dirent *ent; |  | ||||||
|     char dirname[400]; |  | ||||||
|     char *cmd; |  | ||||||
|     long order; |  | ||||||
|      |  | ||||||
|     if (config->syscmds == true) {     |  | ||||||
|         snprintf(dirname, 400, "%s/syscmds", config->etcdir); |  | ||||||
|         printf("Reading syscmds: %s\n", dirname); |  | ||||||
|         if ((dir = opendir (dirname)) != NULL) { |  | ||||||
|             while ((ent = readdir(dir)) != NULL) { |  | ||||||
|                 if (strncmp(ent->d_name, ".", 1) == 0) |  | ||||||
|                     continue; |  | ||||||
|                 order = strtol(ent->d_name, &cmd, 10); |  | ||||||
|                 if (strcmp(cmd, "") != 0) |  | ||||||
|                     list_push(&config->syscmd_list, strdup(cmd), order); |  | ||||||
|             } |  | ||||||
|             closedir(dir); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     else { |  | ||||||
|         printf("Syscmds are disabled\n"); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| int main(int argc, char **argv) { | int main(int argc, char **argv) { | ||||||
|     s_signal_received = 0; |     s_signal_received = 0; | ||||||
|     char testdirname[400]; |     char testdirname[400]; | ||||||
| @@ -298,11 +272,6 @@ int main(int argc, char **argv) { | |||||||
|     if (!testdir("State dir", testdirname))  |     if (!testdir("State dir", testdirname))  | ||||||
|         return EXIT_FAILURE; |         return EXIT_FAILURE; | ||||||
|  |  | ||||||
|     //read system command files |  | ||||||
|     list_init(&config.syscmd_list); |  | ||||||
|     read_syscmds(&config); |  | ||||||
|     list_sort_by_value(&config.syscmd_list, true); |  | ||||||
|  |  | ||||||
|     //Create working threads |     //Create working threads | ||||||
|     pthread_t mpd_client_thread, web_server_thread, mympd_api_thread; |     pthread_t mpd_client_thread, web_server_thread, mympd_api_thread; | ||||||
|     //mpd connection |     //mpd connection | ||||||
| @@ -314,10 +283,9 @@ int main(int argc, char **argv) { | |||||||
|  |  | ||||||
|     //Outsourced all work to separate threads, do nothing... |     //Outsourced all work to separate threads, do nothing... | ||||||
|  |  | ||||||
|     //clean up |     //cleanup | ||||||
|     pthread_join(mpd_client_thread, NULL); |     pthread_join(mpd_client_thread, NULL); | ||||||
|     pthread_join(web_server_thread, NULL); |     pthread_join(web_server_thread, NULL); | ||||||
|     list_free(&config.syscmd_list); |  | ||||||
|     tiny_queue_free(web_server_queue); |     tiny_queue_free(web_server_queue); | ||||||
|     tiny_queue_free(mpd_client_queue); |     tiny_queue_free(mpd_client_queue); | ||||||
|     tiny_queue_free(mympd_api_queue); |     tiny_queue_free(mympd_api_queue); | ||||||
|   | |||||||
							
								
								
									
										500
									
								
								src/mpd_client.c
									
									
									
									
									
								
							
							
						
						
									
										500
									
								
								src/mpd_client.c
									
									
									
									
									
								
							| @@ -101,26 +101,20 @@ typedef struct t_mpd_state { | |||||||
|     bool feat_tags; |     bool feat_tags; | ||||||
|     bool feat_library; |     bool feat_library; | ||||||
|     bool feat_advsearch; |     bool feat_advsearch; | ||||||
|  |     bool feat_smartpls; | ||||||
|      |      | ||||||
|     //mympd states |     //mympd states | ||||||
|     bool notificationWeb; |     enum jukebox_modes jukeboxMode; | ||||||
|     bool notificationPage; |  | ||||||
|     int jukeboxMode; |  | ||||||
|     const char *jukeboxPlaylist; |     const char *jukeboxPlaylist; | ||||||
|     int jukeboxQueueLength; |     int jukeboxQueueLength; | ||||||
|     char *colsQueueCurrent; |  | ||||||
|     char *colsSearch; |  | ||||||
|     char *colsBrowseDatabase; |  | ||||||
|     char *colsBrowsePlaylistsDetail; |  | ||||||
|     char *colsBrowseFilesystem; |  | ||||||
|     char *colsPlayback; |  | ||||||
|     char *colsQueueLastPlayed; |  | ||||||
|      |      | ||||||
|     //taglists |     //taglists | ||||||
|     struct list mpd_tags; |     struct list mpd_tags; | ||||||
|     struct list mympd_tags; |     struct list mympd_tags; | ||||||
|     struct list mympd_searchtags; |     struct list mympd_searchtags; | ||||||
|     struct list mympd_browsetags; |     struct list mympd_browsetags; | ||||||
|  |      | ||||||
|  |     //last played list | ||||||
|     struct list last_played; |     struct list last_played; | ||||||
| } t_mpd_state; | } t_mpd_state; | ||||||
|  |  | ||||||
| @@ -135,44 +129,41 @@ static void mpd_client_idle(t_config *config, t_mpd_state *mpd_state, const int | |||||||
| static void mpd_client_parse_idle(t_config *config, t_mpd_state *mpd_state, const int idle_bitmask); | static void mpd_client_parse_idle(t_config *config, t_mpd_state *mpd_state, const int idle_bitmask); | ||||||
| static void mpd_client_api(t_config *config, t_mpd_state *mpd_state, void *arg_request); | static void mpd_client_api(t_config *config, t_mpd_state *mpd_state, void *arg_request); | ||||||
| static void mpd_client_notify(const char *message, const size_t n); | static void mpd_client_notify(const char *message, const size_t n); | ||||||
| static bool mpd_client_count_song_id(t_config *config, t_mpd_state *mpd_state, const int song_id, const char *name, const int value); | static bool mpd_client_count_song_id(t_mpd_state *mpd_state, const int song_id, const char *name, const int value); | ||||||
| static bool mpd_client_count_song_uri(t_config *config, t_mpd_state *mpd_state, const char *uri, const char *name, const int value); | static bool mpd_client_count_song_uri(t_mpd_state *mpd_state, const char *uri, const char *name, const int value); | ||||||
| static bool mpd_client_like_song_uri(t_config *config, t_mpd_state *mpd_state, const char *uri, int value); | static bool mpd_client_like_song_uri(t_mpd_state *mpd_state, const char *uri, int value); | ||||||
| static bool mpd_client_last_played_song_id(t_config *config, t_mpd_state *mpd_state, const int song_id); | static bool mpd_client_last_played_song_id(t_mpd_state *mpd_state, const int song_id); | ||||||
| static bool mpd_client_last_played_song_uri(t_config *config, t_mpd_state *mpd_state, const char *uri); | static bool mpd_client_last_played_song_uri(t_mpd_state *mpd_state, const char *uri); | ||||||
| static bool mpd_client_get_sticker(t_config *config, t_mpd_state *mpd_state, const char *uri, t_sticker *sticker); | static bool mpd_client_get_sticker(t_mpd_state *mpd_state, const char *uri, t_sticker *sticker); | ||||||
| static bool mpd_client_last_played_list(t_config *config, t_mpd_state *mpd_state, const int song_id); | static bool mpd_client_last_played_list(t_config *config, t_mpd_state *mpd_state, const int song_id); | ||||||
| static bool mpd_client_jukebox(t_config *config, t_mpd_state *mpd_state); | static bool mpd_client_jukebox(t_config *config, t_mpd_state *mpd_state); | ||||||
| static bool mpd_client_state_get(t_config *config, t_mpd_state *mpd_state, const char *name, char *value); |  | ||||||
| static bool mpd_client_state_set(t_config *config, t_mpd_state *mpd_state, const char *name, const char *value); |  | ||||||
| static bool mpd_client_smartpls_save(t_config *config, t_mpd_state *mpd_state, const char *smartpltype, const char *playlist, const char *tag, const char *searchstr, const int maxentries, const int timerange); | static bool mpd_client_smartpls_save(t_config *config, t_mpd_state *mpd_state, const char *smartpltype, const char *playlist, const char *tag, const char *searchstr, const int maxentries, const int timerange); | ||||||
| static int mpd_client_smartpls_put(t_config *config, t_mpd_state *mpd_state, char *buffer, const char *playlist); | static int mpd_client_smartpls_put(t_config *config, char *buffer, const char *playlist); | ||||||
| static bool mpd_client_smartpls_update_all(t_config *config, t_mpd_state *mpd_state); | static bool mpd_client_smartpls_update_all(t_config *config, t_mpd_state *mpd_state); | ||||||
| static bool mpd_client_smartpls_clear(t_config *config, t_mpd_state *mpd_state, const char *playlist); | static bool mpd_client_smartpls_clear(t_mpd_state *mpd_state, const char *playlist); | ||||||
| static bool mpd_client_smartpls_update_sticker(t_config *config, t_mpd_state *mpd_state, const char *playlist, const char *sticker, const int maxentries); | static bool mpd_client_smartpls_update_sticker(t_mpd_state *mpd_state, const char *playlist, const char *sticker, const int maxentries); | ||||||
| static bool mpd_client_smartpls_update_newest(t_config *config, t_mpd_state *mpd_state, const char *playlist, const int timerange); | static bool mpd_client_smartpls_update_newest(t_config *config, t_mpd_state *mpd_state, const char *playlist, const int timerange); | ||||||
| static bool mpd_client_smartpls_update_search(t_config *config, t_mpd_state *mpd_state, const char *playlist, const char *tag, const char *searchstr); | static bool mpd_client_smartpls_update_search(t_config *config, t_mpd_state *mpd_state, const char *playlist, const char *tag, const char *searchstr); | ||||||
| static int mpd_client_get_updatedb_state(t_config *config, t_mpd_state *mpd_state, char *buffer); | static int mpd_client_get_updatedb_state(t_mpd_state *mpd_state, char *buffer); | ||||||
| static int mpd_client_put_state(t_config *config, t_mpd_state *mpd_state, char *buffer); | static int mpd_client_put_state(t_mpd_state *mpd_state, char *buffer); | ||||||
| static int mpd_client_put_outputs(t_config *config, t_mpd_state *mpd_state, char *buffer); | static int mpd_client_put_outputs(t_mpd_state *mpd_state, char *buffer); | ||||||
| static int mpd_client_put_current_song(t_config *config, t_mpd_state *mpd_state, char *buffer); | static int mpd_client_put_current_song(t_config *config, t_mpd_state *mpd_state, char *buffer); | ||||||
| static int mpd_client_put_queue(t_config *config, t_mpd_state *mpd_state, char *buffer, const unsigned int offset); | static int mpd_client_put_queue(t_config *config, t_mpd_state *mpd_state, char *buffer, const unsigned int offset); | ||||||
| static int mpd_client_put_browse(t_config *config, t_mpd_state *mpd_state, char *buffer, const char *path, const unsigned int offset, const char *filter); | static int mpd_client_put_browse(t_config *config, t_mpd_state *mpd_state, char *buffer, const char *path, const unsigned int offset, const char *filter); | ||||||
| static int mpd_client_search(t_config *config, t_mpd_state *mpd_state, char *buffer, const char *searchstr, const char *filter, const char *plist, const unsigned int offset); | static int mpd_client_search(t_config *config, t_mpd_state *mpd_state, char *buffer, const char *searchstr, const char *filter, const char *plist, const unsigned int offset); | ||||||
| static int mpd_client_search_adv(t_config *config, t_mpd_state *mpd_state, char *buffer, const char *expression, const char *sort, const bool sortdesc, const char *grouptag, const char *plist, const unsigned int offset); | static int mpd_client_search_adv(t_config *config, t_mpd_state *mpd_state, char *buffer, const char *expression, const char *sort, const bool sortdesc, const char *grouptag, const char *plist, const unsigned int offset); | ||||||
| static int mpd_client_search_queue(t_config *config, t_mpd_state *mpd_state, char *buffer, const char *mpdtagtype, const unsigned int offset, const char *searchstr); | static int mpd_client_search_queue(t_config *config, t_mpd_state *mpd_state, char *buffer, const char *mpdtagtype, const unsigned int offset, const char *searchstr); | ||||||
| static int mpd_client_put_volume(t_config *config, t_mpd_state *mpd_state, char *buffer); | static int mpd_client_put_volume(t_mpd_state *mpd_state, char *buffer); | ||||||
| static int mpd_client_put_stats(t_config *config, t_mpd_state *mpd_state, char *buffer); | static int mpd_client_put_stats(t_mpd_state *mpd_state, char *buffer); | ||||||
| static int mpd_client_put_settings(t_config *config, t_mpd_state *mpd_state, char *buffer); | static int mpd_client_put_settings(t_mpd_state *mpd_state, char *buffer); | ||||||
| static int mpd_client_put_db_tag(t_config *config, t_mpd_state *mpd_state, char *buffer, const unsigned int offset, const char *mpdtagtype, const char *mpdsearchtagtype, const char *searchstr, const char *filter); | static int mpd_client_put_db_tag(t_config *config, t_mpd_state *mpd_state, char *buffer, const unsigned int offset, const char *mpdtagtype, const char *mpdsearchtagtype, const char *searchstr, const char *filter); | ||||||
| static int mpd_client_put_songs_in_album(t_config *config, t_mpd_state *mpd_state, char *buffer, const char *album, const char *search, const char *tag); | static int mpd_client_put_songs_in_album(t_config *config, t_mpd_state *mpd_state, char *buffer, const char *album, const char *search, const char *tag); | ||||||
| static int mpd_client_put_playlists(t_config *config, t_mpd_state *mpd_state, char *buffer, const unsigned int offset, const char *filter); | static int mpd_client_put_playlists(t_config *config, t_mpd_state *mpd_state, char *buffer, const unsigned int offset, const char *filter); | ||||||
| static int mpd_client_put_playlist_list(t_config *config, t_mpd_state *mpd_state, char *buffer, const char *uri, const unsigned int offset, const char *filter); | static int mpd_client_put_playlist_list(t_config *config, t_mpd_state *mpd_state, char *buffer, const char *uri, const unsigned int offset, const char *filter); | ||||||
| static int mpd_client_put_songdetails(t_config *config, t_mpd_state *mpd_state, char *buffer, const char *uri); | static int mpd_client_put_songdetails(t_config *config, t_mpd_state *mpd_state, char *buffer, const char *uri); | ||||||
| static int mpd_client_put_last_played_songs(t_config *config, t_mpd_state *mpd_state, char *buffer, const unsigned int offset); | static int mpd_client_put_last_played_songs(t_config *config, t_mpd_state *mpd_state, char *buffer, const unsigned int offset); | ||||||
| static int mpd_client_queue_crop(t_config *config, t_mpd_state *mpd_state, char *buffer); | static int mpd_client_queue_crop(t_mpd_state *mpd_state, char *buffer); | ||||||
| static void mpd_client_disconnect(t_config *config, t_mpd_state *mpd_state); | static void mpd_client_disconnect(t_config *config, t_mpd_state *mpd_state); | ||||||
| static void mpd_client_read_statefiles(t_config *config, t_mpd_state *mpd_state); |  | ||||||
| static int mpd_client_read_last_played(t_config *config, t_mpd_state *mpd_state); | static int mpd_client_read_last_played(t_config *config, t_mpd_state *mpd_state); | ||||||
|  |  | ||||||
| //public functions | //public functions | ||||||
| @@ -186,6 +177,9 @@ void *mpd_client_loop(void *arg_config) { | |||||||
|     mpd_state.last_song_id = -1; |     mpd_state.last_song_id = -1; | ||||||
|     mpd_state.last_last_played_id = -1; |     mpd_state.last_last_played_id = -1; | ||||||
|     mpd_state.feat_library = false; |     mpd_state.feat_library = false; | ||||||
|  |     mpd_state.jukeboxMode = JUKEBOX_OFF; | ||||||
|  |     mpd_state.jukeboxPlaylist = strdup("Database"); | ||||||
|  |     mpd_state.jukeboxQueueLength = 1; | ||||||
|     list_init(&mpd_state.mpd_tags); |     list_init(&mpd_state.mpd_tags); | ||||||
|     list_init(&mpd_state.mympd_tags); |     list_init(&mpd_state.mympd_tags); | ||||||
|     list_init(&mpd_state.mympd_searchtags); |     list_init(&mpd_state.mympd_searchtags); | ||||||
| @@ -198,9 +192,6 @@ void *mpd_client_loop(void *arg_config) { | |||||||
|         mpd_state.feat_library = true; |         mpd_state.feat_library = true; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     //read myMPD states under config.varlibdir |  | ||||||
|     mpd_client_read_statefiles(config, &mpd_state); |  | ||||||
|  |  | ||||||
|     //read last played songs history file |     //read last played songs history file | ||||||
|     list_init(&mpd_state.last_played); |     list_init(&mpd_state.last_played); | ||||||
|     int len = mpd_client_read_last_played(config, &mpd_state); |     int len = mpd_client_read_last_played(config, &mpd_state); | ||||||
| @@ -230,7 +221,6 @@ static void mpd_client_api(t_config *config, t_mpd_state *mpd_state, void *arg_r | |||||||
|     float float_buf; |     float float_buf; | ||||||
|     bool bool_buf; |     bool bool_buf; | ||||||
|     char *p_charbuf1, *p_charbuf2, *p_charbuf3, *p_charbuf4; |     char *p_charbuf1, *p_charbuf2, *p_charbuf3, *p_charbuf4; | ||||||
|     char p_char[4]; |  | ||||||
|     #ifdef DEBUG |     #ifdef DEBUG | ||||||
|     struct timespec start, end; |     struct timespec start, end; | ||||||
|     #endif |     #endif | ||||||
| @@ -242,16 +232,18 @@ static void mpd_client_api(t_config *config, t_mpd_state *mpd_state, void *arg_r | |||||||
|     #endif |     #endif | ||||||
|     switch(request->cmd_id) { |     switch(request->cmd_id) { | ||||||
|         case MYMPD_API_SYSCMD: |         case MYMPD_API_SYSCMD: | ||||||
|             //is handled in mympd_api.c |         case MYMPD_API_COLS_SAVE: | ||||||
|  |         case MYMPD_API_SETTINGS_GET: | ||||||
|  |             //are handled in mympd_api.c | ||||||
|         case MPD_API_UNKNOWN: |         case MPD_API_UNKNOWN: | ||||||
|             len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Unknown request\"}"); |             len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Unknown request\"}"); | ||||||
|             printf("Unknown API request: %.*s\n", request->length, request->data); |             printf("Unknown API request: %.*s\n", request->length, request->data); | ||||||
|             break; |             break; | ||||||
|         case MPD_API_LIKE: |         case MPD_API_LIKE: | ||||||
|             if (config->stickers) { |             if (mpd_state->feat_sticker) { | ||||||
|                 je = json_scanf(request->data, request->length, "{data: {uri: %Q, like: %d}}", &p_charbuf1, &uint_buf1); |                 je = json_scanf(request->data, request->length, "{data: {uri: %Q, like: %d}}", &p_charbuf1, &uint_buf1); | ||||||
|                 if (je == 2) {         |                 if (je == 2) {         | ||||||
|                     if (!mpd_client_like_song_uri(config, mpd_state, p_charbuf1, uint_buf1)) |                     if (!mpd_client_like_song_uri(mpd_state, p_charbuf1, uint_buf1)) | ||||||
|                         len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Can't set like.\"}"); |                         len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Can't set like.\"}"); | ||||||
|                     else |                     else | ||||||
|                         len = snprintf(buffer, MAX_SIZE, "{\"type\": \"result\", \"data\": \"ok\"}"); |                         len = snprintf(buffer, MAX_SIZE, "{\"type\": \"result\", \"data\": \"ok\"}"); | ||||||
| @@ -263,125 +255,52 @@ static void mpd_client_api(t_config *config, t_mpd_state *mpd_state, void *arg_r | |||||||
|                 printf("MPD_API_LIKE: MPD stickers are disabled\n"); |                 printf("MPD_API_LIKE: MPD stickers are disabled\n"); | ||||||
|             } |             } | ||||||
|             break; |             break; | ||||||
|         case MPD_API_COLS_SAVE: |  | ||||||
|             je = json_scanf(request->data, request->length, "{data: {table: %Q}}", &p_charbuf1); |  | ||||||
|             if (je == 1) { |  | ||||||
|                 char column_list[800]; |  | ||||||
|                 snprintf(column_list, 800, "%.*s", request->length, request->data); |  | ||||||
|                 char *cols = strchr(column_list, '['); |  | ||||||
|                 int col_len = strlen(cols);  |  | ||||||
|                 if (col_len > 1) |  | ||||||
|                     cols[col_len - 2]  = '\0'; |  | ||||||
|                 if (strcmp(p_charbuf1, "colsQueueCurrent") == 0) { |  | ||||||
|                     free(mpd_state->colsQueueCurrent); |  | ||||||
|                     mpd_state->colsQueueCurrent = strdup(cols); |  | ||||||
|                 } |  | ||||||
|                 else if (strcmp(p_charbuf1, "colsSearch") == 0) { |  | ||||||
|                     free(mpd_state->colsSearch); |  | ||||||
|                     mpd_state->colsSearch = strdup(cols); |  | ||||||
|                 } |  | ||||||
|                 else if (strcmp(p_charbuf1, "colsBrowseDatabase") == 0) { |  | ||||||
|                     free(mpd_state->colsBrowseDatabase); |  | ||||||
|                     mpd_state->colsBrowseDatabase = strdup(cols); |  | ||||||
|                 } |  | ||||||
|                 else if (strcmp(p_charbuf1, "colsBrowsePlaylistsDetail") == 0) { |  | ||||||
|                     free(mpd_state->colsBrowsePlaylistsDetail); |  | ||||||
|                     mpd_state->colsBrowsePlaylistsDetail = strdup(cols); |  | ||||||
|                 } |  | ||||||
|                 else if (strcmp(p_charbuf1, "colsBrowseFilesystem") == 0) { |  | ||||||
|                     free(mpd_state->colsBrowseFilesystem); |  | ||||||
|                     mpd_state->colsBrowseFilesystem = strdup(cols); |  | ||||||
|                 } |  | ||||||
|                 else if (strcmp(p_charbuf1, "colsPlayback") == 0) { |  | ||||||
|                     free(mpd_state->colsPlayback); |  | ||||||
|                     mpd_state->colsPlayback = strdup(cols); |  | ||||||
|                 } |  | ||||||
|                 else if (strcmp(p_charbuf1, "colsQueueLastPlayed") == 0) { |  | ||||||
|                     free(mpd_state->colsQueueLastPlayed); |  | ||||||
|                     mpd_state->colsQueueLastPlayed = strdup(cols); |  | ||||||
|                 } |  | ||||||
|                 else { |  | ||||||
|                     len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Unknown table %s\"}", p_charbuf1); |  | ||||||
|                     printf("MPD_API_COLS_SAVE: Unknown table %s\n", p_charbuf1); |  | ||||||
|                     free(p_charbuf1); |  | ||||||
|                     break; |  | ||||||
|                 } |  | ||||||
|                 if (len == 0) { |  | ||||||
|                     if (mpd_client_state_set(config, mpd_state, p_charbuf1, cols)) |  | ||||||
|                         len = snprintf(buffer, MAX_SIZE, "{\"type\": \"result\", \"data\": \"ok\"}"); |  | ||||||
|                 } |  | ||||||
|                 free(p_charbuf1); |  | ||||||
|             } |  | ||||||
|             break; |  | ||||||
|         case MPD_API_PLAYER_STATE: |         case MPD_API_PLAYER_STATE: | ||||||
|             len = mpd_client_put_state(config, mpd_state, buffer); |             len = mpd_client_put_state(mpd_state, buffer); | ||||||
|             break; |             break; | ||||||
|         case MPD_API_SETTINGS_SET: |         case MYMPD_API_SETTINGS_SET: | ||||||
|             je = json_scanf(request->data, request->length, "{data: {notificationWeb: %B}}", &mpd_state->notificationWeb); |             //only update mpd_state, already saved in mympd_api.c | ||||||
|             if (je == 1) |  | ||||||
|                 if (!mpd_client_state_set(config, mpd_state, "notificationWeb", (mpd_state->notificationWeb == true ? "true" : "false"))) |  | ||||||
|                     len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Can't set state notificationWeb.\"}"); |  | ||||||
|              |  | ||||||
|             je = json_scanf(request->data, request->length, "{data: {notificationPage: %B}}", &mpd_state->notificationPage); |  | ||||||
|             if (je == 1) |  | ||||||
|                 if (!mpd_client_state_set(config, mpd_state, "notificationPage", (mpd_state->notificationPage == true ? "true" : "false"))) |  | ||||||
|                     len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Can't set state notificationPage.\"}"); |  | ||||||
|              |  | ||||||
|             je = json_scanf(request->data, request->length, "{data: {jukeboxMode: %d}}", &mpd_state->jukeboxMode); |             je = json_scanf(request->data, request->length, "{data: {jukeboxMode: %d}}", &mpd_state->jukeboxMode); | ||||||
|             if (je == 1) { |  | ||||||
|                 snprintf(p_char, 4, "%d", mpd_state->jukeboxMode); |  | ||||||
|                 if (!mpd_client_state_set(config, mpd_state, "jukeboxMode", p_char)) |  | ||||||
|                     len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Can't set state jukeboxMode.\"}"); |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             je = json_scanf(request->data, request->length, "{data: {jukeboxPlaylist: %Q}}", &mpd_state->jukeboxPlaylist); |             je = json_scanf(request->data, request->length, "{data: {jukeboxPlaylist: %Q}}", &mpd_state->jukeboxPlaylist); | ||||||
|             if (je == 1) |  | ||||||
|                 if (!mpd_client_state_set(config, mpd_state, "jukeboxPlaylist", mpd_state->jukeboxPlaylist)) |  | ||||||
|                     len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Can't set state jukeboxPlaylist.\"}"); |  | ||||||
|  |  | ||||||
|             je = json_scanf(request->data, request->length, "{data: {jukeboxQueueLength: %d}}", &mpd_state->jukeboxQueueLength); |             je = json_scanf(request->data, request->length, "{data: {jukeboxQueueLength: %d}}", &mpd_state->jukeboxQueueLength); | ||||||
|             if (je == 1) { |             //set mpd options | ||||||
|                 snprintf(p_char, 4, "%d", mpd_state->jukeboxQueueLength); |  | ||||||
|                 if (!mpd_client_state_set(config, mpd_state, "jukeboxQueueLength", p_char)) |  | ||||||
|                     len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Can't set state jukeboxQueueLength.\"}"); |  | ||||||
|             } |  | ||||||
|          |  | ||||||
|             je = json_scanf(request->data, request->length, "{data: {random: %u}}", &uint_buf1); |             je = json_scanf(request->data, request->length, "{data: {random: %u}}", &uint_buf1); | ||||||
|             if (je == 1)         |             if (je == 1) { | ||||||
|                 if (!mpd_run_random(mpd_state->conn, uint_buf1)) |                 if (!mpd_run_random(mpd_state->conn, uint_buf1)) | ||||||
|                     len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Can't set mpd state random.\"}"); |                     len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Can't set mpd state random.\"}"); | ||||||
|              |             } | ||||||
|             je = json_scanf(request->data, request->length, "{data: {repeat: %u}}", &uint_buf1); |             je = json_scanf(request->data, request->length, "{data: {repeat: %u}}", &uint_buf1); | ||||||
|             if (je == 1)         |             if (je == 1) { | ||||||
|                 if (!mpd_run_repeat(mpd_state->conn, uint_buf1)) |                 if (!mpd_run_repeat(mpd_state->conn, uint_buf1)) | ||||||
|                     len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Can't set mpd state repeat.\"}"); |                     len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Can't set mpd state repeat.\"}"); | ||||||
|              |             } | ||||||
|             je = json_scanf(request->data, request->length, "{data: {consume: %u}}", &uint_buf1); |             je = json_scanf(request->data, request->length, "{data: {consume: %u}}", &uint_buf1); | ||||||
|             if (je == 1)         |             if (je == 1) { | ||||||
|                 if (!mpd_run_consume(mpd_state->conn, uint_buf1)) |                 if (!mpd_run_consume(mpd_state->conn, uint_buf1)) | ||||||
|                     len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Can't set mpd state consume.\"}"); |                     len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Can't set mpd state consume.\"}"); | ||||||
|              |             } | ||||||
|             je = json_scanf(request->data, request->length, "{data: {single: %u}}", &uint_buf1); |             je = json_scanf(request->data, request->length, "{data: {single: %u}}", &uint_buf1); | ||||||
|             if (je == 1) |             if (je == 1) { | ||||||
|                 if (!mpd_run_single(mpd_state->conn, uint_buf1)) |                 if (!mpd_run_single(mpd_state->conn, uint_buf1)) | ||||||
|                     len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Can't set mpd state single.\"}"); |                     len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Can't set mpd state single.\"}"); | ||||||
|              |             } | ||||||
|             je = json_scanf(request->data, request->length, "{data: {crossfade: %u}}", &uint_buf1); |             je = json_scanf(request->data, request->length, "{data: {crossfade: %u}}", &uint_buf1); | ||||||
|             if (je == 1) |             if (je == 1) { | ||||||
|                 if (!mpd_run_crossfade(mpd_state->conn, uint_buf1)) |                 if (!mpd_run_crossfade(mpd_state->conn, uint_buf1)) | ||||||
|                     len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Can't set mpd state crossfade.\"}"); |                     len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Can't set mpd state crossfade.\"}"); | ||||||
|              |             } | ||||||
|             if (config->mixramp) { |             if (config->mixramp) { | ||||||
|                 je = json_scanf(request->data, request->length, "{data: {mixrampdb: %f}}", &float_buf); |                 je = json_scanf(request->data, request->length, "{data: {mixrampdb: %f}}", &float_buf); | ||||||
|                 if (je == 1)         |                 if (je == 1) { | ||||||
|                     if (!mpd_run_mixrampdb(mpd_state->conn, float_buf)) |                     if (!mpd_run_mixrampdb(mpd_state->conn, float_buf)) | ||||||
|                         len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Can't set mpd state mixrampdb.\"}"); |                         len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Can't set mpd state mixrampdb.\"}"); | ||||||
|              |                 } | ||||||
|                 je = json_scanf(request->data, request->length, "{data: {mixrampdelay: %f}}", &float_buf); |                 je = json_scanf(request->data, request->length, "{data: {mixrampdelay: %f}}", &float_buf); | ||||||
|                 if (je == 1) |                 if (je == 1) { | ||||||
|                     if (!mpd_run_mixrampdelay(mpd_state->conn, float_buf)) |                     if (!mpd_run_mixrampdelay(mpd_state->conn, float_buf)) | ||||||
|                         len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Can't set mpd state mixrampdelay.\"}"); |                         len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Can't set mpd state mixrampdelay.\"}"); | ||||||
|                 } |                 } | ||||||
|  |             } | ||||||
|              |              | ||||||
|             je = json_scanf(request->data, request->length, "{data: {replaygain: %Q}}", &p_charbuf1); |             je = json_scanf(request->data, request->length, "{data: {replaygain: %Q}}", &p_charbuf1); | ||||||
|             if (je == 1) { |             if (je == 1) { | ||||||
| @@ -390,8 +309,9 @@ static void mpd_client_api(t_config *config, t_mpd_state *mpd_state, void *arg_r | |||||||
|                 mpd_response_finish(mpd_state->conn); |                 mpd_response_finish(mpd_state->conn); | ||||||
|                 free(p_charbuf1);             |                 free(p_charbuf1);             | ||||||
|             } |             } | ||||||
|             if (mpd_state->jukeboxMode > 0) |             if (mpd_state->jukeboxMode != JUKEBOX_OFF) { | ||||||
|                 mpd_client_jukebox(config, mpd_state); |                 mpd_client_jukebox(config, mpd_state); | ||||||
|  |             } | ||||||
|             if (len == 0) |             if (len == 0) | ||||||
|                 len = snprintf(buffer, MAX_SIZE, "{\"type\": \"result\", \"data\": \"ok\"}"); |                 len = snprintf(buffer, MAX_SIZE, "{\"type\": \"result\", \"data\": \"ok\"}"); | ||||||
|             break; |             break; | ||||||
| @@ -450,7 +370,7 @@ static void mpd_client_api(t_config *config, t_mpd_state *mpd_state, void *arg_r | |||||||
|         case MPD_API_SMARTPLS_GET: |         case MPD_API_SMARTPLS_GET: | ||||||
|             je = json_scanf(request->data, request->length, "{data: {playlist: %Q}}", &p_charbuf1); |             je = json_scanf(request->data, request->length, "{data: {playlist: %Q}}", &p_charbuf1); | ||||||
|             if (je == 1) { |             if (je == 1) { | ||||||
|                 len = mpd_client_smartpls_put(config, mpd_state, buffer, p_charbuf1); |                 len = mpd_client_smartpls_put(config, buffer, p_charbuf1); | ||||||
|                 free(p_charbuf1); |                 free(p_charbuf1); | ||||||
|             } |             } | ||||||
|             break; |             break; | ||||||
| @@ -471,8 +391,8 @@ static void mpd_client_api(t_config *config, t_mpd_state *mpd_state, void *arg_r | |||||||
|             } |             } | ||||||
|             break; |             break; | ||||||
|         case MPD_API_PLAYER_NEXT: |         case MPD_API_PLAYER_NEXT: | ||||||
|             if (config->stickers) |             if (mpd_state->feat_sticker) | ||||||
|                 mpd_client_count_song_id(config, mpd_state, mpd_state->song_id, "skipCount", 1); |                 mpd_client_count_song_id(mpd_state, mpd_state->song_id, "skipCount", 1); | ||||||
|             if (mpd_run_next(mpd_state->conn)) |             if (mpd_run_next(mpd_state->conn)) | ||||||
|                 len = snprintf(buffer, MAX_SIZE, "{\"type\": \"result\", \"data\": \"ok\"}"); |                 len = snprintf(buffer, MAX_SIZE, "{\"type\": \"result\", \"data\": \"ok\"}"); | ||||||
|             else { |             else { | ||||||
| @@ -505,7 +425,7 @@ static void mpd_client_api(t_config *config, t_mpd_state *mpd_state, void *arg_r | |||||||
|             } |             } | ||||||
|             break; |             break; | ||||||
|         case MPD_API_QUEUE_CROP: |         case MPD_API_QUEUE_CROP: | ||||||
|             len = mpd_client_queue_crop(config, mpd_state, buffer); |             len = mpd_client_queue_crop(mpd_state, buffer); | ||||||
|             break; |             break; | ||||||
|         case MPD_API_QUEUE_RM_TRACK: |         case MPD_API_QUEUE_RM_TRACK: | ||||||
|             je = json_scanf(request->data, request->length, "{data: {track:%u}}", &uint_buf1); |             je = json_scanf(request->data, request->length, "{data: {track:%u}}", &uint_buf1); | ||||||
| @@ -574,7 +494,7 @@ static void mpd_client_api(t_config *config, t_mpd_state *mpd_state, void *arg_r | |||||||
|             } |             } | ||||||
|             break; |             break; | ||||||
|         case MPD_API_PLAYER_OUTPUT_LIST: |         case MPD_API_PLAYER_OUTPUT_LIST: | ||||||
|             len = mpd_client_put_outputs(config, mpd_state, buffer); |             len = mpd_client_put_outputs(mpd_state, buffer); | ||||||
|             break; |             break; | ||||||
|         case MPD_API_PLAYER_TOGGLE_OUTPUT: |         case MPD_API_PLAYER_TOGGLE_OUTPUT: | ||||||
|             je = json_scanf(request->data, request->length, "{data: {output: %u, state: %u}}", &uint_buf1, &uint_buf2); |             je = json_scanf(request->data, request->length, "{data: {output: %u, state: %u}}", &uint_buf1, &uint_buf2); | ||||||
| @@ -609,7 +529,7 @@ static void mpd_client_api(t_config *config, t_mpd_state *mpd_state, void *arg_r | |||||||
|             } |             } | ||||||
|             break; |             break; | ||||||
|         case MPD_API_PLAYER_VOLUME_GET: |         case MPD_API_PLAYER_VOLUME_GET: | ||||||
|             len = mpd_client_put_volume(config, mpd_state, buffer); |             len = mpd_client_put_volume(mpd_state, buffer); | ||||||
|             break;             |             break;             | ||||||
|         case MPD_API_PLAYER_SEEK: |         case MPD_API_PLAYER_SEEK: | ||||||
|             je = json_scanf(request->data, request->length, "{data: {songid: %u, seek: %u}}", &uint_buf1, &uint_buf2); |             je = json_scanf(request->data, request->length, "{data: {songid: %u, seek: %u}}", &uint_buf1, &uint_buf2); | ||||||
| @@ -941,11 +861,14 @@ static void mpd_client_api(t_config *config, t_mpd_state *mpd_state, void *arg_r | |||||||
|             } |             } | ||||||
|             break; |             break; | ||||||
|         case MPD_API_SETTINGS_GET: |         case MPD_API_SETTINGS_GET: | ||||||
|             len = mpd_client_put_settings(config, mpd_state, buffer); |             len = mpd_client_put_settings(mpd_state, buffer); | ||||||
|             break; |             break; | ||||||
|         case MPD_API_DATABASE_STATS: |         case MPD_API_DATABASE_STATS: | ||||||
|             len = mpd_client_put_stats(config, mpd_state, buffer); |             len = mpd_client_put_stats(mpd_state, buffer); | ||||||
|             break; |             break; | ||||||
|  |         default: | ||||||
|  |             len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Unknown request\"}"); | ||||||
|  |             printf("Unknown API request: %.*s\n", request->length, request->data); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (mpd_state->conn_state == MPD_CONNECTED && mpd_connection_get_error(mpd_state->conn) != MPD_ERROR_SUCCESS) { |     if (mpd_state->conn_state == MPD_CONNECTED && mpd_connection_get_error(mpd_state->conn) != MPD_ERROR_SUCCESS) { | ||||||
| @@ -1011,23 +934,23 @@ static void mpd_client_parse_idle(t_config *config, t_mpd_state *mpd_state, int | |||||||
|                     break; |                     break; | ||||||
|                 case MPD_IDLE_QUEUE: |                 case MPD_IDLE_QUEUE: | ||||||
|                     len = snprintf(buffer, MAX_SIZE, "{\"type\": \"update_queue\"}"); |                     len = snprintf(buffer, MAX_SIZE, "{\"type\": \"update_queue\"}"); | ||||||
|                     if (mpd_state->jukeboxMode > 0) |                     if (mpd_state->jukeboxMode != JUKEBOX_OFF) | ||||||
|                         mpd_client_jukebox(config, mpd_state); |                         mpd_client_jukebox(config, mpd_state); | ||||||
|                     break; |                     break; | ||||||
|                 case MPD_IDLE_PLAYER: |                 case MPD_IDLE_PLAYER: | ||||||
|                     len = mpd_client_put_state(config, mpd_state, buffer); |                     len = mpd_client_put_state(mpd_state, buffer); | ||||||
|                     if (mpd_state->song_id != mpd_state->last_song_id) { |                     if (mpd_state->song_id != mpd_state->last_song_id) { | ||||||
|                         if (mpd_state->last_last_played_id != mpd_state->song_id) |                         if (mpd_state->last_last_played_id != mpd_state->song_id) | ||||||
|                             mpd_client_last_played_list(config, mpd_state, mpd_state->song_id); |                             mpd_client_last_played_list(config, mpd_state, mpd_state->song_id); | ||||||
|                         if (config->stickers && mpd_state->last_update_sticker_song_id != mpd_state->song_id) { |                         if (mpd_state->feat_sticker && mpd_state->last_update_sticker_song_id != mpd_state->song_id) { | ||||||
|                             mpd_client_count_song_id(config, mpd_state, mpd_state->song_id, "playCount", 1); |                             mpd_client_count_song_id(mpd_state, mpd_state->song_id, "playCount", 1); | ||||||
|                             mpd_client_last_played_song_id(config, mpd_state, mpd_state->song_id); |                             mpd_client_last_played_song_id(mpd_state, mpd_state->song_id); | ||||||
|                             mpd_state->last_update_sticker_song_id = mpd_state->song_id; |                             mpd_state->last_update_sticker_song_id = mpd_state->song_id; | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                     break; |                     break; | ||||||
|                 case MPD_IDLE_MIXER: |                 case MPD_IDLE_MIXER: | ||||||
|                     len = mpd_client_put_volume(config, mpd_state, buffer); |                     len = mpd_client_put_volume(mpd_state, buffer); | ||||||
|                     break; |                     break; | ||||||
|                 case MPD_IDLE_OUTPUT: |                 case MPD_IDLE_OUTPUT: | ||||||
|                     len = snprintf(buffer, MAX_SIZE, "{\"type\": \"update_outputs\"}"); |                     len = snprintf(buffer, MAX_SIZE, "{\"type\": \"update_outputs\"}"); | ||||||
| @@ -1036,7 +959,7 @@ static void mpd_client_parse_idle(t_config *config, t_mpd_state *mpd_state, int | |||||||
|                     len = snprintf(buffer, MAX_SIZE, "{\"type\": \"update_options\"}"); |                     len = snprintf(buffer, MAX_SIZE, "{\"type\": \"update_options\"}"); | ||||||
|                     break; |                     break; | ||||||
|                 case MPD_IDLE_UPDATE: |                 case MPD_IDLE_UPDATE: | ||||||
|                     len = mpd_client_get_updatedb_state(config, mpd_state, buffer); |                     len = mpd_client_get_updatedb_state(mpd_state, buffer); | ||||||
|                     break; |                     break; | ||||||
|                 case MPD_IDLE_STICKER: |                 case MPD_IDLE_STICKER: | ||||||
|                     len = snprintf(buffer, MAX_SIZE, "{\"type\": \"update_sticker\"}"); |                     len = snprintf(buffer, MAX_SIZE, "{\"type\": \"update_sticker\"}"); | ||||||
| @@ -1070,10 +993,11 @@ static void mpd_client_mpd_features(t_config *config, t_mpd_state *mpd_state) { | |||||||
|     LOG_INFO() printf("MPD protocoll version: %u.%u.%u\n", mpd_state->protocol[0], mpd_state->protocol[1], mpd_state->protocol[2]); |     LOG_INFO() printf("MPD protocoll version: %u.%u.%u\n", mpd_state->protocol[0], mpd_state->protocol[1], mpd_state->protocol[2]); | ||||||
|  |  | ||||||
|     // Defaults |     // Defaults | ||||||
|     mpd_state->feat_sticker = false; |     mpd_state->feat_sticker = config->stickers; | ||||||
|     mpd_state->feat_playlists = false; |     mpd_state->feat_playlists = false; | ||||||
|     mpd_state->feat_tags = false; |     mpd_state->feat_tags = false; | ||||||
|     mpd_state->feat_advsearch = false; |     mpd_state->feat_advsearch = false; | ||||||
|  |     mpd_state->feat_smartpls = config->smartpls; | ||||||
|  |  | ||||||
|     if (mpd_send_allowed_commands(mpd_state->conn)) { |     if (mpd_send_allowed_commands(mpd_state->conn)) { | ||||||
|         while ((pair = mpd_recv_command_pair(mpd_state->conn)) != NULL) { |         while ((pair = mpd_recv_command_pair(mpd_state->conn)) != NULL) { | ||||||
| @@ -1088,17 +1012,17 @@ static void mpd_client_mpd_features(t_config *config, t_mpd_state *mpd_state) { | |||||||
|     else { |     else { | ||||||
|         LOG_ERROR_AND_RECOVER("mpd_send_allowed_commands"); |         LOG_ERROR_AND_RECOVER("mpd_send_allowed_commands"); | ||||||
|     } |     } | ||||||
|     if (mpd_state->feat_sticker == false && config->stickers == true) { |     if (mpd_state->feat_sticker == true && config->stickers == false) { | ||||||
|         LOG_INFO() printf("MPD don't support stickers, disabling myMPD feature\n"); |         LOG_INFO() printf("MPD don't support stickers, disabling myMPD feature\n"); | ||||||
|         config->stickers = false; |         mpd_state->feat_sticker = false; | ||||||
|     } |     } | ||||||
|     if (config->stickers == false && config->smartpls == true) { |     if (mpd_state->feat_sticker == false && config->smartpls == true) { | ||||||
|         LOG_INFO() printf("Stickers are disabled, disabling smartplaylists\n"); |         LOG_INFO() printf("Stickers are disabled, disabling smart playlists\n"); | ||||||
|         config->smartpls = false; |         mpd_state->feat_smartpls = false; | ||||||
|     } |     } | ||||||
|     if (mpd_state->feat_playlists == false && config->smartpls == true) { |     if (mpd_state->feat_playlists == false && config->smartpls == true) { | ||||||
|         LOG_INFO() printf("Playlists are disabled, disabling smartplaylists\n"); |         LOG_INFO() printf("Playlists are disabled, disabling smart playlists\n"); | ||||||
|         config->smartpls = false; |         mpd_state->feat_smartpls = false; | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     LOG_INFO() printf("MPD supported tags: "); |     LOG_INFO() printf("MPD supported tags: "); | ||||||
| @@ -1220,7 +1144,7 @@ static void mpd_client_idle(t_config *config, t_mpd_state *mpd_state, const int | |||||||
|             mpd_state->conn_state = MPD_CONNECTED; |             mpd_state->conn_state = MPD_CONNECTED; | ||||||
|             mpd_client_mpd_features(config, mpd_state); |             mpd_client_mpd_features(config, mpd_state); | ||||||
|             mpd_client_smartpls_update_all(config, mpd_state); |             mpd_client_smartpls_update_all(config, mpd_state); | ||||||
|             if (mpd_state->jukeboxMode > 0) |             if (mpd_state->jukeboxMode != JUKEBOX_OFF) | ||||||
|                 mpd_client_jukebox(config, mpd_state); |                 mpd_client_jukebox(config, mpd_state); | ||||||
|             mpd_send_idle(mpd_state->conn); |             mpd_send_idle(mpd_state->conn); | ||||||
|             break; |             break; | ||||||
| @@ -1270,7 +1194,7 @@ static void mpd_client_idle(t_config *config, t_mpd_state *mpd_state, const int | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| static int mpd_client_get_updatedb_state(t_config *config, t_mpd_state *mpd_state, char *buffer) { | static int mpd_client_get_updatedb_state(t_mpd_state *mpd_state, char *buffer) { | ||||||
|     struct mpd_status *status; |     struct mpd_status *status; | ||||||
|     int len, update_id; |     int len, update_id; | ||||||
|     struct json_out out = JSON_OUT_BUF(buffer, MAX_SIZE); |     struct json_out out = JSON_OUT_BUF(buffer, MAX_SIZE); | ||||||
| @@ -1291,7 +1215,7 @@ static int mpd_client_get_updatedb_state(t_config *config, t_mpd_state *mpd_stat | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| static bool mpd_client_get_sticker(t_config *config, t_mpd_state *mpd_state, const char *uri, t_sticker *sticker) { | static bool mpd_client_get_sticker(t_mpd_state *mpd_state, const char *uri, t_sticker *sticker) { | ||||||
|     struct mpd_pair *pair; |     struct mpd_pair *pair; | ||||||
|     char *crap; |     char *crap; | ||||||
|     sticker->playCount = 0; |     sticker->playCount = 0; | ||||||
| @@ -1321,12 +1245,12 @@ static bool mpd_client_get_sticker(t_config *config, t_mpd_state *mpd_state, con | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
|  |  | ||||||
| static bool mpd_client_count_song_id(t_config *config, t_mpd_state *mpd_state, const int song_id, const char *name, const int value) { | static bool mpd_client_count_song_id(t_mpd_state *mpd_state, const int song_id, const char *name, const int value) { | ||||||
|     struct mpd_song *song; |     struct mpd_song *song; | ||||||
|     if (song_id > -1) { |     if (song_id > -1) { | ||||||
|         song = mpd_run_get_queue_song_id(mpd_state->conn, song_id); |         song = mpd_run_get_queue_song_id(mpd_state->conn, song_id); | ||||||
|         if (song) { |         if (song) { | ||||||
|             if (!mpd_client_count_song_uri(config, mpd_state, mpd_song_get_uri(song), name, value)) { |             if (!mpd_client_count_song_uri(mpd_state, mpd_song_get_uri(song), name, value)) { | ||||||
|                 mpd_song_free(song); |                 mpd_song_free(song); | ||||||
|                 return false; |                 return false; | ||||||
|             } |             } | ||||||
| @@ -1342,7 +1266,7 @@ static bool mpd_client_count_song_id(t_config *config, t_mpd_state *mpd_state, c | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
|  |  | ||||||
| static bool mpd_client_count_song_uri(t_config *config, t_mpd_state *mpd_state, const char *uri, const char *name, const int value) { | static bool mpd_client_count_song_uri(t_mpd_state *mpd_state, const char *uri, const char *name, const int value) { | ||||||
|     if (uri == NULL || strncasecmp("http:", uri, 5) == 0 || strncasecmp("https:", uri, 6) == 0) |     if (uri == NULL || strncasecmp("http:", uri, 5) == 0 || strncasecmp("https:", uri, 6) == 0) | ||||||
|         return false; |         return false; | ||||||
|     struct mpd_pair *pair; |     struct mpd_pair *pair; | ||||||
| @@ -1373,7 +1297,7 @@ static bool mpd_client_count_song_uri(t_config *config, t_mpd_state *mpd_state, | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
|  |  | ||||||
| static bool mpd_client_like_song_uri(t_config *config, t_mpd_state *mpd_state, const char *uri, int value) { | static bool mpd_client_like_song_uri(t_mpd_state *mpd_state, const char *uri, int value) { | ||||||
|     if (uri == NULL || strncasecmp("http:", uri, 5) == 0 || strncasecmp("https:", uri, 6) == 0) |     if (uri == NULL || strncasecmp("http:", uri, 5) == 0 || strncasecmp("https:", uri, 6) == 0) | ||||||
|         return false; |         return false; | ||||||
|     char v[2]; |     char v[2]; | ||||||
| @@ -1429,13 +1353,13 @@ static bool mpd_client_last_played_list(t_config *config, t_mpd_state *mpd_state | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
|  |  | ||||||
| static bool mpd_client_last_played_song_id(t_config *config, t_mpd_state *mpd_state, const int song_id) { | static bool mpd_client_last_played_song_id(t_mpd_state *mpd_state, const int song_id) { | ||||||
|     struct mpd_song *song; |     struct mpd_song *song; | ||||||
|      |      | ||||||
|     if (song_id > -1) { |     if (song_id > -1) { | ||||||
|         song = mpd_run_get_queue_song_id(mpd_state->conn, song_id); |         song = mpd_run_get_queue_song_id(mpd_state->conn, song_id); | ||||||
|         if (song) { |         if (song) { | ||||||
|             if (mpd_client_last_played_song_uri(config, mpd_state, mpd_song_get_uri(song)) == false) { |             if (mpd_client_last_played_song_uri(mpd_state, mpd_song_get_uri(song)) == false) { | ||||||
|                 mpd_song_free(song); |                 mpd_song_free(song); | ||||||
|                 return false; |                 return false; | ||||||
|             } |             } | ||||||
| @@ -1455,7 +1379,7 @@ static bool mpd_client_last_played_song_id(t_config *config, t_mpd_state *mpd_st | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
|  |  | ||||||
| static bool mpd_client_last_played_song_uri(t_config *config, t_mpd_state *mpd_state, const char *uri) { | static bool mpd_client_last_played_song_uri(t_mpd_state *mpd_state, const char *uri) { | ||||||
|     if (uri == NULL || strncasecmp("http:", uri, 5) == 0 || strncasecmp("https:", uri, 6) == 0) |     if (uri == NULL || strncasecmp("http:", uri, 5) == 0 || strncasecmp("https:", uri, 6) == 0) | ||||||
|         return false; |         return false; | ||||||
|     char v[20]; |     char v[20]; | ||||||
| @@ -1501,7 +1425,7 @@ static bool mpd_client_jukebox(t_config *config, t_mpd_state *mpd_state) { | |||||||
|     if (queue_length > mpd_state->jukeboxQueueLength) |     if (queue_length > mpd_state->jukeboxQueueLength) | ||||||
|         return true; |         return true; | ||||||
|  |  | ||||||
|     if (mpd_state->jukeboxMode == 1)  |     if (mpd_state->jukeboxMode == JUKEBOX_ADD_SONG)  | ||||||
|         addSongs = mpd_state->jukeboxQueueLength - queue_length; |         addSongs = mpd_state->jukeboxQueueLength - queue_length; | ||||||
|     else |     else | ||||||
|         addSongs = 1; |         addSongs = 1; | ||||||
| @@ -1519,7 +1443,7 @@ static bool mpd_client_jukebox(t_config *config, t_mpd_state *mpd_state) { | |||||||
|     struct list add_list; |     struct list add_list; | ||||||
|     list_init(&add_list); |     list_init(&add_list); | ||||||
|      |      | ||||||
|     if (mpd_state->jukeboxMode == 1) { |     if (mpd_state->jukeboxMode == JUKEBOX_ADD_SONG) { | ||||||
|         //add songs |         //add songs | ||||||
|         if (strcmp(mpd_state->jukeboxPlaylist, "Database") == 0) { |         if (strcmp(mpd_state->jukeboxPlaylist, "Database") == 0) { | ||||||
|             if (!mpd_send_list_all(mpd_state->conn, "/")) { |             if (!mpd_send_list_all(mpd_state->conn, "/")) { | ||||||
| @@ -1562,7 +1486,7 @@ static bool mpd_client_jukebox(t_config *config, t_mpd_state *mpd_state) { | |||||||
|             mpd_entity_free(entity); |             mpd_entity_free(entity); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     else if (mpd_state->jukeboxMode == 2) { |     else if (mpd_state->jukeboxMode == JUKEBOX_ADD_ALBUM) { | ||||||
|         //add album |         //add album | ||||||
|         if (!mpd_search_db_tags(mpd_state->conn, MPD_TAG_ALBUM)) { |         if (!mpd_search_db_tags(mpd_state->conn, MPD_TAG_ALBUM)) { | ||||||
|             LOG_ERROR_AND_RECOVER("mpd_search_db_tags"); |             LOG_ERROR_AND_RECOVER("mpd_search_db_tags"); | ||||||
| @@ -1605,7 +1529,7 @@ static bool mpd_client_jukebox(t_config *config, t_mpd_state *mpd_state) { | |||||||
|     nkeep = 0; |     nkeep = 0; | ||||||
|     struct node *current = add_list.list; |     struct node *current = add_list.list; | ||||||
|     while (current != NULL) { |     while (current != NULL) { | ||||||
|         if (mpd_state->jukeboxMode == 1) { |         if (mpd_state->jukeboxMode == JUKEBOX_ADD_SONG) { | ||||||
| 	    LOG_INFO() printf("Jukebox adding song: %s\n", current->data); | 	    LOG_INFO() printf("Jukebox adding song: %s\n", current->data); | ||||||
| 	    if (!mpd_run_add(mpd_state->conn, current->data)) | 	    if (!mpd_run_add(mpd_state->conn, current->data)) | ||||||
|                 LOG_ERROR_AND_RECOVER("mpd_run_add"); |                 LOG_ERROR_AND_RECOVER("mpd_run_add"); | ||||||
| @@ -1634,7 +1558,7 @@ static bool mpd_client_jukebox(t_config *config, t_mpd_state *mpd_state) { | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int mpd_client_put_state(t_config *config, t_mpd_state *mpd_state, char *buffer) { | static int mpd_client_put_state(t_mpd_state *mpd_state, char *buffer) { | ||||||
|     size_t len = 0; |     size_t len = 0; | ||||||
|     struct json_out out = JSON_OUT_BUF(buffer, MAX_SIZE); |     struct json_out out = JSON_OUT_BUF(buffer, MAX_SIZE); | ||||||
|  |  | ||||||
| @@ -1680,7 +1604,7 @@ static int mpd_client_put_state(t_config *config, t_mpd_state *mpd_state, char * | |||||||
|     CHECK_RETURN_LEN(); |     CHECK_RETURN_LEN(); | ||||||
| } | } | ||||||
|  |  | ||||||
| static int mpd_client_put_volume(t_config *config, t_mpd_state *mpd_state, char *buffer) { | static int mpd_client_put_volume(t_mpd_state *mpd_state, char *buffer) { | ||||||
|     size_t len = 0; |     size_t len = 0; | ||||||
|     struct json_out out = JSON_OUT_BUF(buffer, MAX_SIZE); |     struct json_out out = JSON_OUT_BUF(buffer, MAX_SIZE); | ||||||
|  |  | ||||||
| @@ -1698,54 +1622,7 @@ static int mpd_client_put_volume(t_config *config, t_mpd_state *mpd_state, char | |||||||
|     CHECK_RETURN_LEN(); |     CHECK_RETURN_LEN(); | ||||||
| } | } | ||||||
|  |  | ||||||
| static bool mpd_client_state_get(t_config *config, t_mpd_state *mpd_state, const char *name, char *value) { | static int mpd_client_put_settings(t_mpd_state *mpd_state, char *buffer) { | ||||||
|     char cfg_file[400]; |  | ||||||
|     char *line; |  | ||||||
|     size_t n = 0; |  | ||||||
|     ssize_t read; |  | ||||||
|      |  | ||||||
|     if (!validate_string(name)) |  | ||||||
|         return false; |  | ||||||
|     snprintf(cfg_file, 400, "%s/state/%s", config->varlibdir, name); |  | ||||||
|     FILE *fp = fopen(cfg_file, "r"); |  | ||||||
|     if (fp == NULL) { |  | ||||||
|         printf("Error opening %s\n", cfg_file); |  | ||||||
|         return false; |  | ||||||
|     } |  | ||||||
|     read = getline(&line, &n, fp); |  | ||||||
|     snprintf(value, 400, "%s", line); |  | ||||||
|     LOG_DEBUG() fprintf(stderr, "DEBUG: State %s: %s\n", name, value); |  | ||||||
|     fclose(fp); |  | ||||||
|     if (read > 0) |  | ||||||
|         return true; |  | ||||||
|     else |  | ||||||
|         return false; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| static bool mpd_client_state_set(t_config *config, t_mpd_state *mpd_state, const char *name, const char *value) { |  | ||||||
|     char tmp_file[400]; |  | ||||||
|     char cfg_file[400]; |  | ||||||
|      |  | ||||||
|     if (!validate_string(name)) |  | ||||||
|         return false; |  | ||||||
|     snprintf(cfg_file, 400, "%s/state/%s", config->varlibdir, name); |  | ||||||
|     snprintf(tmp_file, 400, "%s/tmp/%s", config->varlibdir, name); |  | ||||||
|          |  | ||||||
|     FILE *fp = fopen(tmp_file, "w"); |  | ||||||
|     if (fp == NULL) { |  | ||||||
|         printf("Error opening %s\n", tmp_file); |  | ||||||
|         return false; |  | ||||||
|     } |  | ||||||
|     fprintf(fp, "%s", value); |  | ||||||
|     fclose(fp); |  | ||||||
|     if (rename(tmp_file, cfg_file) == -1) { |  | ||||||
|         printf("Error renaming file from %s to %s\n", tmp_file, cfg_file); |  | ||||||
|         return false; |  | ||||||
|     } |  | ||||||
|     return true; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| static int mpd_client_put_settings(t_config *config, t_mpd_state *mpd_state, char *buffer) { |  | ||||||
|     char *replaygain = ""; |     char *replaygain = ""; | ||||||
|     size_t len; |     size_t len; | ||||||
|     int nr = 0; |     int nr = 0; | ||||||
| @@ -1758,8 +1635,9 @@ static int mpd_client_put_settings(t_config *config, t_mpd_state *mpd_state, cha | |||||||
|         return 0; |         return 0; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (!mpd_send_command(mpd_state->conn, "replay_gain_status", NULL)) |     if (!mpd_send_command(mpd_state->conn, "replay_gain_status", NULL)) { | ||||||
|         RETURN_ERROR_AND_RECOVER("replay_gain_status"); |         RETURN_ERROR_AND_RECOVER("replay_gain_status"); | ||||||
|  |     } | ||||||
|     struct mpd_pair *pair; |     struct mpd_pair *pair; | ||||||
|     while ((pair = mpd_recv_pair(mpd_state->conn)) != NULL) { |     while ((pair = mpd_recv_pair(mpd_state->conn)) != NULL) { | ||||||
|         replaygain = strdup(pair->value); |         replaygain = strdup(pair->value); | ||||||
| @@ -1768,10 +1646,8 @@ static int mpd_client_put_settings(t_config *config, t_mpd_state *mpd_state, cha | |||||||
|      |      | ||||||
|     len = json_printf(&out, "{type: settings, data: {" |     len = json_printf(&out, "{type: settings, data: {" | ||||||
|         "repeat: %d, single: %d, crossfade: %d, consume: %d, random: %d, " |         "repeat: %d, single: %d, crossfade: %d, consume: %d, random: %d, " | ||||||
|         "mixrampdb: %f, mixrampdelay: %f, mpdhost: %Q, mpdport: %d, passwort_set: %B, featSyscmds: %B, featPlaylists: %B, featTags: %B, featLibrary: %B, " |         "mixrampdb: %f, mixrampdelay: %f, replaygain: %Q, featPlaylists: %B, featTags: %B, featLibrary: %B, " | ||||||
|         "featAdvsearch: %B, featLocalplayer: %B, streamport: %d, streamurl: %Q, featCoverimage: %B, coverimagename: %Q, featStickers: %B, mixramp: %B, " |         "featAdvsearch: %B, featStickers: %B, featSmartpls: %B,  tags: [",  | ||||||
|         "featSmartpls: %B, maxElementsPerPage: %d, replaygain: %Q, notificationWeb: %B, notificationPage: %B, jukeboxMode: %d, jukeboxPlaylist: %Q, " |  | ||||||
|         "jukeboxQueueLength: %d, coverimagesize: %d, tags: [",  |  | ||||||
|         mpd_status_get_repeat(status), |         mpd_status_get_repeat(status), | ||||||
|         mpd_status_get_single(status), |         mpd_status_get_single(status), | ||||||
|         mpd_status_get_crossfade(status), |         mpd_status_get_crossfade(status), | ||||||
| @@ -1779,30 +1655,13 @@ static int mpd_client_put_settings(t_config *config, t_mpd_state *mpd_state, cha | |||||||
|         mpd_status_get_random(status), |         mpd_status_get_random(status), | ||||||
|         mpd_status_get_mixrampdb(status), |         mpd_status_get_mixrampdb(status), | ||||||
|         mpd_status_get_mixrampdelay(status), |         mpd_status_get_mixrampdelay(status), | ||||||
|         config->mpdhost,  |         replaygain, | ||||||
|         config->mpdport,  |  | ||||||
|         config->mpdpass ? "true" : "false", |  | ||||||
|         config->syscmds, |  | ||||||
|         mpd_state->feat_playlists, |         mpd_state->feat_playlists, | ||||||
|         mpd_state->feat_tags, |         mpd_state->feat_tags, | ||||||
|         mpd_state->feat_library, |         mpd_state->feat_library, | ||||||
|         mpd_state->feat_advsearch, |         mpd_state->feat_advsearch, | ||||||
|         config->localplayer, |         mpd_state->feat_sticker, | ||||||
|         config->streamport, |         mpd_state->feat_smartpls | ||||||
|         config->streamurl, |  | ||||||
|         config->coverimage, |  | ||||||
|         config->coverimagename, |  | ||||||
|         config->stickers, |  | ||||||
|         config->mixramp, |  | ||||||
|         config->smartpls, |  | ||||||
|         config->max_elements_per_page, |  | ||||||
|         replaygain, |  | ||||||
|         mpd_state->notificationWeb, |  | ||||||
|         mpd_state->notificationPage, |  | ||||||
|         mpd_state->jukeboxMode, |  | ||||||
|         mpd_state->jukeboxPlaylist, |  | ||||||
|         mpd_state->jukeboxQueueLength, |  | ||||||
|         config->coverimagesize |  | ||||||
|     ); |     ); | ||||||
|     mpd_status_free(status); |     mpd_status_free(status); | ||||||
|     free(replaygain); |     free(replaygain); | ||||||
| @@ -1833,35 +1692,12 @@ static int mpd_client_put_settings(t_config *config, t_mpd_state *mpd_state, cha | |||||||
|         len += json_printf(&out, "%Q", current->data); |         len += json_printf(&out, "%Q", current->data); | ||||||
|         current = current->next; |         current = current->next; | ||||||
|     } |     } | ||||||
|     len += json_printf(&out, "]"); |     len += json_printf(&out, "]}}"); | ||||||
|      |  | ||||||
|     if (config->syscmds == true) { |  | ||||||
|         len += json_printf(&out, ", syscmds: ["); |  | ||||||
|         nr = 0; |  | ||||||
|         current = config->syscmd_list.list; |  | ||||||
|         while (current != NULL) { |  | ||||||
|             if (nr++)  |  | ||||||
|                 len += json_printf(&out, ","); |  | ||||||
|             len += json_printf(&out, "%Q", current->data); |  | ||||||
|             current = current->next; |  | ||||||
|         } |  | ||||||
|         len += json_printf(&out, "]"); |  | ||||||
|     } |  | ||||||
|     len += json_printf(&out, ", colsQueueCurrent: %s, colsSearch: %s, colsBrowseDatabase: %s, colsBrowsePlaylistsDetail: %s, " |  | ||||||
|         "colsBrowseFilesystem: %s, colsPlayback: %s, colsQueueLastPlayed: %s}}", |  | ||||||
|         mpd_state->colsQueueCurrent, |  | ||||||
|         mpd_state->colsSearch, |  | ||||||
|         mpd_state->colsBrowseDatabase, |  | ||||||
|         mpd_state->colsBrowsePlaylistsDetail, |  | ||||||
|         mpd_state->colsBrowseFilesystem, |  | ||||||
|         mpd_state->colsPlayback, |  | ||||||
|         mpd_state->colsQueueLastPlayed |  | ||||||
|     ); |  | ||||||
|      |      | ||||||
|     CHECK_RETURN_LEN(); |     CHECK_RETURN_LEN(); | ||||||
| } | } | ||||||
|  |  | ||||||
| static int mpd_client_put_outputs(t_config *config, t_mpd_state *mpd_state, char *buffer) { | static int mpd_client_put_outputs(t_mpd_state *mpd_state, char *buffer) { | ||||||
|     struct mpd_output *output; |     struct mpd_output *output; | ||||||
|     size_t len; |     size_t len; | ||||||
|     int nr; |     int nr; | ||||||
| @@ -1954,9 +1790,9 @@ static int mpd_client_put_current_song(t_config *config, t_mpd_state *mpd_state, | |||||||
|  |  | ||||||
|     mpd_response_finish(mpd_state->conn); |     mpd_response_finish(mpd_state->conn); | ||||||
|      |      | ||||||
|     if (config->stickers) { |     if (mpd_state->feat_sticker) { | ||||||
|         t_sticker *sticker = (t_sticker *) malloc(sizeof(t_sticker)); |         t_sticker *sticker = (t_sticker *) malloc(sizeof(t_sticker)); | ||||||
|         mpd_client_get_sticker(config, mpd_state, mpd_song_get_uri(song), sticker); |         mpd_client_get_sticker(mpd_state, mpd_song_get_uri(song), sticker); | ||||||
|         len += json_printf(&out, ", playCount: %d, skipCount: %d, like: %d, lastPlayed: %d", |         len += json_printf(&out, ", playCount: %d, skipCount: %d, like: %d, lastPlayed: %d", | ||||||
|             sticker->playCount, |             sticker->playCount, | ||||||
|             sticker->skipCount, |             sticker->skipCount, | ||||||
| @@ -1993,9 +1829,9 @@ static int mpd_client_put_songdetails(t_config *config, t_mpd_state *mpd_state, | |||||||
|     } |     } | ||||||
|     mpd_response_finish(mpd_state->conn); |     mpd_response_finish(mpd_state->conn); | ||||||
|  |  | ||||||
|     if (config->stickers) { |     if (mpd_state->feat_sticker) { | ||||||
|         t_sticker *sticker = (t_sticker *) malloc(sizeof(t_sticker)); |         t_sticker *sticker = (t_sticker *) malloc(sizeof(t_sticker)); | ||||||
|         mpd_client_get_sticker(config, mpd_state, uri, sticker); |         mpd_client_get_sticker(mpd_state, uri, sticker); | ||||||
|         len += json_printf(&out, ", playCount: %d, skipCount: %d, like: %d, lastPlayed: %d", |         len += json_printf(&out, ", playCount: %d, skipCount: %d, like: %d, lastPlayed: %d", | ||||||
|             sticker->playCount, |             sticker->playCount, | ||||||
|             sticker->skipCount, |             sticker->skipCount, | ||||||
| @@ -2597,7 +2433,7 @@ static int mpd_client_search_adv(t_config *config, t_mpd_state *mpd_state, char | |||||||
|     CHECK_RETURN_LEN(); |     CHECK_RETURN_LEN(); | ||||||
| } | } | ||||||
|  |  | ||||||
| static int mpd_client_queue_crop(t_config *config, t_mpd_state *mpd_state, char *buffer) { | static int mpd_client_queue_crop(t_mpd_state *mpd_state, char *buffer) { | ||||||
|     size_t len = 0; |     size_t len = 0; | ||||||
|     struct json_out out = JSON_OUT_BUF(buffer, MAX_SIZE); |     struct json_out out = JSON_OUT_BUF(buffer, MAX_SIZE); | ||||||
|     struct mpd_status *status = mpd_run_status(mpd_state->conn); |     struct mpd_status *status = mpd_run_status(mpd_state->conn); | ||||||
| @@ -2681,7 +2517,7 @@ static int mpd_client_search_queue(t_config *config, t_mpd_state *mpd_state, cha | |||||||
|     CHECK_RETURN_LEN(); |     CHECK_RETURN_LEN(); | ||||||
| } | } | ||||||
|  |  | ||||||
| static int mpd_client_put_stats(t_config *config, t_mpd_state *mpd_state, char *buffer) { | static int mpd_client_put_stats(t_mpd_state *mpd_state, char *buffer) { | ||||||
|     struct mpd_stats *stats = mpd_run_stats(mpd_state->conn); |     struct mpd_stats *stats = mpd_run_stats(mpd_state->conn); | ||||||
|     const unsigned *version = mpd_connection_get_server_version(mpd_state->conn); |     const unsigned *version = mpd_connection_get_server_version(mpd_state->conn); | ||||||
|     size_t len = 0; |     size_t len = 0; | ||||||
| @@ -2718,7 +2554,7 @@ static void mpd_client_disconnect(t_config *config, t_mpd_state *mpd_state) { | |||||||
|     mpd_client_idle(config, mpd_state, 100); |     mpd_client_idle(config, mpd_state, 100); | ||||||
| } | } | ||||||
|  |  | ||||||
| static int mpd_client_smartpls_put(t_config *config, t_mpd_state *mpd_state, char *buffer, const char *playlist) { | static int mpd_client_smartpls_put(t_config *config, char *buffer, const char *playlist) { | ||||||
|     char pl_file[400]; |     char pl_file[400]; | ||||||
|     char *smartpltype; |     char *smartpltype; | ||||||
|     char *p_charbuf1, *p_charbuf2; |     char *p_charbuf1, *p_charbuf2; | ||||||
| @@ -2808,7 +2644,7 @@ static bool mpd_client_smartpls_save(t_config *config, t_mpd_state *mpd_state, c | |||||||
|             printf("Error renaming file from %s to %s\n", tmp_file, pl_file); |             printf("Error renaming file from %s to %s\n", tmp_file, pl_file); | ||||||
|             return false; |             return false; | ||||||
|         } |         } | ||||||
|         else if (mpd_client_smartpls_update_sticker(config, mpd_state, playlist, tag, maxentries) == 1) { |         else if (mpd_client_smartpls_update_sticker(mpd_state, playlist, tag, maxentries) == 1) { | ||||||
|             printf("Update of smart playlist %s failed.\n", playlist); |             printf("Update of smart playlist %s failed.\n", playlist); | ||||||
|             return false; |             return false; | ||||||
|         } |         } | ||||||
| @@ -2854,7 +2690,7 @@ static bool mpd_client_smartpls_update_all(t_config *config, t_mpd_state *mpd_st | |||||||
|     char *p_charbuf1, *p_charbuf2; |     char *p_charbuf1, *p_charbuf2; | ||||||
|     int int_buf1; |     int int_buf1; | ||||||
|      |      | ||||||
|     if (config->smartpls == false) { |     if (mpd_state->feat_smartpls == false) { | ||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
|      |      | ||||||
| @@ -2875,7 +2711,7 @@ static bool mpd_client_smartpls_update_all(t_config *config, t_mpd_state *mpd_st | |||||||
|             if (strcmp(smartpltype, "sticker") == 0) { |             if (strcmp(smartpltype, "sticker") == 0) { | ||||||
|                 je = json_scanf(content, strlen(content), "{sticker: %Q, maxentries: %d}", &p_charbuf1, &int_buf1); |                 je = json_scanf(content, strlen(content), "{sticker: %Q, maxentries: %d}", &p_charbuf1, &int_buf1); | ||||||
|                 if (je == 2) { |                 if (je == 2) { | ||||||
|                     mpd_client_smartpls_update_sticker(config, mpd_state, ent->d_name, p_charbuf1, int_buf1); |                     mpd_client_smartpls_update_sticker(mpd_state, ent->d_name, p_charbuf1, int_buf1); | ||||||
|                     free(p_charbuf1); |                     free(p_charbuf1); | ||||||
|                 } |                 } | ||||||
|                 else |                 else | ||||||
| @@ -2910,7 +2746,7 @@ static bool mpd_client_smartpls_update_all(t_config *config, t_mpd_state *mpd_st | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
|  |  | ||||||
| static bool mpd_client_smartpls_clear(t_config *config, t_mpd_state *mpd_state, const char *playlist) { | static bool mpd_client_smartpls_clear(t_mpd_state *mpd_state, const char *playlist) { | ||||||
|     struct mpd_playlist *pl; |     struct mpd_playlist *pl; | ||||||
|     const char *plpath; |     const char *plpath; | ||||||
|     bool exists = false; |     bool exists = false; | ||||||
| @@ -2940,7 +2776,7 @@ static bool mpd_client_smartpls_clear(t_config *config, t_mpd_state *mpd_state, | |||||||
|  |  | ||||||
| static bool mpd_client_smartpls_update_search(t_config *config, t_mpd_state *mpd_state, const char *playlist, const char *tag, const char *searchstr) { | static bool mpd_client_smartpls_update_search(t_config *config, t_mpd_state *mpd_state, const char *playlist, const char *tag, const char *searchstr) { | ||||||
|     char buffer[MAX_SIZE]; |     char buffer[MAX_SIZE]; | ||||||
|     mpd_client_smartpls_clear(config, mpd_state, playlist); |     mpd_client_smartpls_clear(mpd_state, playlist); | ||||||
|     if (mpd_state->feat_advsearch == true && strcmp(tag, "expression") == 0) { |     if (mpd_state->feat_advsearch == true && strcmp(tag, "expression") == 0) { | ||||||
|         mpd_client_search_adv(config, mpd_state, buffer, searchstr, NULL, true, NULL, playlist, 0); |         mpd_client_search_adv(config, mpd_state, buffer, searchstr, NULL, true, NULL, playlist, 0); | ||||||
|     } |     } | ||||||
| @@ -2951,7 +2787,7 @@ static bool mpd_client_smartpls_update_search(t_config *config, t_mpd_state *mpd | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
|  |  | ||||||
| static bool mpd_client_smartpls_update_sticker(t_config *config, t_mpd_state *mpd_state, const char *playlist, const char *sticker, const int maxentries) { | static bool mpd_client_smartpls_update_sticker(t_mpd_state *mpd_state, const char *playlist, const char *sticker, const int maxentries) { | ||||||
|     struct mpd_pair *pair; |     struct mpd_pair *pair; | ||||||
|     char *uri = NULL; |     char *uri = NULL; | ||||||
|     const char *p_value; |     const char *p_value; | ||||||
| @@ -2990,7 +2826,7 @@ static bool mpd_client_smartpls_update_sticker(t_config *config, t_mpd_state *mp | |||||||
|     mpd_response_finish(mpd_state->conn); |     mpd_response_finish(mpd_state->conn); | ||||||
|     free(uri); |     free(uri); | ||||||
|  |  | ||||||
|     mpd_client_smartpls_clear(config, mpd_state, playlist); |     mpd_client_smartpls_clear(mpd_state, playlist); | ||||||
|       |       | ||||||
|     if (value_max > 2) { |     if (value_max > 2) { | ||||||
|         value_max = value_max / 2; |         value_max = value_max / 2; | ||||||
| @@ -3032,7 +2868,7 @@ static bool mpd_client_smartpls_update_newest(t_config *config, t_mpd_state *mpd | |||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     mpd_client_smartpls_clear(config, mpd_state, playlist); |     mpd_client_smartpls_clear(mpd_state, playlist); | ||||||
|     value_max -= timerange; |     value_max -= timerange; | ||||||
|     if (value_max > 0) { |     if (value_max > 0) { | ||||||
|         if (mpd_state->feat_advsearch == true) { |         if (mpd_state->feat_advsearch == true) { | ||||||
| @@ -3048,104 +2884,6 @@ static bool mpd_client_smartpls_update_newest(t_config *config, t_mpd_state *mpd | |||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
|  |  | ||||||
| static void mpd_client_read_statefiles(t_config *config, t_mpd_state *mpd_state) { |  | ||||||
|     char *crap; |  | ||||||
|     char value[400]; |  | ||||||
|  |  | ||||||
|     LOG_INFO() printf("Reading states\n"); |  | ||||||
|     if (mpd_client_state_get(config, mpd_state, "notificationWeb", value)) { |  | ||||||
|         if (strcmp(value, "true") == 0) |  | ||||||
|             mpd_state->notificationWeb = true; |  | ||||||
|         else |  | ||||||
|             mpd_state->notificationWeb = false; |  | ||||||
|     } |  | ||||||
|     else { |  | ||||||
|         mpd_state->notificationWeb = false; |  | ||||||
|         mpd_client_state_set(config, mpd_state, "notificationWeb", "false"); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     if (mpd_client_state_get(config, mpd_state, "notificationPage", value)) { |  | ||||||
|         if (strcmp(value, "true") == 0) |  | ||||||
|             mpd_state->notificationPage = true; |  | ||||||
|         else |  | ||||||
|             mpd_state->notificationPage = false; |  | ||||||
|     } |  | ||||||
|     else { |  | ||||||
|         mpd_state->notificationPage = true; |  | ||||||
|         mpd_client_state_set(config, mpd_state, "notificationPage", "true"); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     if (mpd_client_state_get(config, mpd_state, "jukeboxMode", value)) |  | ||||||
|         mpd_state->jukeboxMode = strtol(value, &crap, 10); |  | ||||||
|     else { |  | ||||||
|         mpd_state->jukeboxMode = 0; |  | ||||||
|         mpd_client_state_set(config, mpd_state, "jukeboxMode", "0"); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     if (mpd_client_state_get(config, mpd_state, "jukeboxPlaylist", value)) |  | ||||||
|         mpd_state->jukeboxPlaylist = strdup(value); |  | ||||||
|     else { |  | ||||||
|         mpd_state->jukeboxPlaylist = strdup("Database"); |  | ||||||
|         mpd_client_state_set(config, mpd_state, "jukeboxPlaylist", "Database"); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     if (mpd_client_state_get(config, mpd_state, "jukeboxQueueLength", value)) |  | ||||||
|         mpd_state->jukeboxQueueLength = strtol(value, &crap, 10); |  | ||||||
|     else { |  | ||||||
|         mpd_state->jukeboxQueueLength = 1; |  | ||||||
|         mpd_client_state_set(config, mpd_state, "jukeboxQueueLength", "1"); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     if (mpd_client_state_get(config, mpd_state, "colsQueueCurrent", value)) |  | ||||||
|         mpd_state->colsQueueCurrent = strdup(value); |  | ||||||
|     else { |  | ||||||
|         mpd_state->colsQueueCurrent = strdup("[\"Pos\",\"Title\",\"Artist\",\"Album\",\"Duration\"]"); |  | ||||||
|         mpd_client_state_set(config, mpd_state, "colsQueueCurrent", mpd_state->colsQueueCurrent); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     if (mpd_client_state_get(config, mpd_state, "colsSearch", value)) |  | ||||||
|         mpd_state->colsSearch = strdup(value); |  | ||||||
|     else { |  | ||||||
|         mpd_state->colsSearch = strdup("[\"Title\",\"Artist\",\"Album\",\"Duration\"]"); |  | ||||||
|         mpd_client_state_set(config, mpd_state, "colsSearch", mpd_state->colsSearch); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     if (mpd_client_state_get(config, mpd_state, "colsBrowseDatabase", value)) |  | ||||||
|         mpd_state->colsBrowseDatabase = strdup(value); |  | ||||||
|     else { |  | ||||||
|         mpd_state->colsBrowseDatabase = strdup("[\"Track\",\"Title\",\"Duration\"]"); |  | ||||||
|         mpd_client_state_set(config, mpd_state, "colsBrowseDatabase", mpd_state->colsBrowseDatabase); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     if (mpd_client_state_get(config, mpd_state, "colsBrowsePlaylistsDetail", value)) |  | ||||||
|         mpd_state->colsBrowsePlaylistsDetail = strdup(value); |  | ||||||
|     else { |  | ||||||
|         mpd_state->colsBrowsePlaylistsDetail = strdup("[\"Pos\",\"Title\",\"Artist\",\"Album\",\"Duration\"]"); |  | ||||||
|         mpd_client_state_set(config, mpd_state, "colsBrowsePlaylistsDetail", mpd_state->colsBrowsePlaylistsDetail); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     if (mpd_client_state_get(config, mpd_state, "colsBrowseFilesystem", value)) |  | ||||||
|         mpd_state->colsBrowseFilesystem = strdup(value); |  | ||||||
|     else { |  | ||||||
|         mpd_state->colsBrowseFilesystem = strdup("[\"Type\",\"Title\",\"Artist\",\"Album\",\"Duration\"]"); |  | ||||||
|         mpd_client_state_set(config, mpd_state, "colsBrowseFilesystem", mpd_state->colsBrowseFilesystem); |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     if (mpd_client_state_get(config, mpd_state, "colsPlayback", value)) |  | ||||||
|         mpd_state->colsPlayback = strdup(value); |  | ||||||
|     else { |  | ||||||
|         mpd_state->colsPlayback = strdup("[\"Artist\",\"Album\",\"Genre\"]"); |  | ||||||
|         mpd_client_state_set(config, mpd_state, "colsPlayback", mpd_state->colsPlayback); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     if (mpd_client_state_get(config, mpd_state, "colsQueueLastPlayed", value)) |  | ||||||
|         mpd_state->colsQueueLastPlayed = strdup(value); |  | ||||||
|     else { |  | ||||||
|         mpd_state->colsQueueLastPlayed = strdup("[\"Pos\",\"Title\",\"Artist\",\"Album\",\"LastPlayed\"]"); |  | ||||||
|         mpd_client_state_set(config, mpd_state, "colsQueueLastPlayed", mpd_state->colsQueueLastPlayed); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| static int mpd_client_read_last_played(t_config *config, t_mpd_state *mpd_state) { | static int mpd_client_read_last_played(t_config *config, t_mpd_state *mpd_state) { | ||||||
|     char cfgfile[400]; |     char cfgfile[400]; | ||||||
|     char *line; |     char *line; | ||||||
| @@ -3163,11 +2901,15 @@ static int mpd_client_read_last_played(t_config *config, t_mpd_state *mpd_state) | |||||||
|     } |     } | ||||||
|     while ((read = getline(&line, &n, fp)) > 0) { |     while ((read = getline(&line, &n, fp)) > 0) { | ||||||
|         value = strtol(line, &data, 10); |         value = strtol(line, &data, 10); | ||||||
|         if (strlen(data) > 2) |         if (strlen(data) > 2) { | ||||||
|             data = data + 2; |             data = data + 2; | ||||||
|             strtok_r(data, "\n", &crap); |             strtok_r(data, "\n", &crap); | ||||||
|             list_push(&mpd_state->last_played, data, value); |             list_push(&mpd_state->last_played, data, value); | ||||||
|         } |         } | ||||||
|  |         else { | ||||||
|  |             printf("Error reading last_played line.\n"); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|     fclose(fp); |     fclose(fp); | ||||||
|     return mpd_state->last_played.length;; |     return mpd_state->last_played.length;; | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										342
									
								
								src/mympd_api.c
									
									
									
									
									
								
							
							
						
						
									
										342
									
								
								src/mympd_api.c
									
									
									
									
									
								
							| @@ -36,36 +36,91 @@ | |||||||
| #include "tiny_queue.h" | #include "tiny_queue.h" | ||||||
| #include "global.h" | #include "global.h" | ||||||
| #include "mympd_api.h" | #include "mympd_api.h" | ||||||
|  | #include "mpd_client.h" | ||||||
| #include "../dist/src/frozen/frozen.h" | #include "../dist/src/frozen/frozen.h" | ||||||
|  |  | ||||||
| //private definitions | //private definitions | ||||||
| //static void mympd_api(void *arg_request, void *arg_config); | typedef struct t_mympd_state { | ||||||
| static void mympd_api(t_work_request *request, t_config *config); |     //notifications | ||||||
| static int mympd_api_syscmd(char *buffer, const char *cmd, t_config *config); |     bool notificationWeb; | ||||||
|  |     bool notificationPage; | ||||||
|  |  | ||||||
|  |     //jukebox | ||||||
|  |     enum jukebox_modes jukeboxMode; | ||||||
|  |     char *jukeboxPlaylist; | ||||||
|  |     int jukeboxQueueLength; | ||||||
|  |  | ||||||
|  |     //columns | ||||||
|  |     char *colsQueueCurrent; | ||||||
|  |     char *colsSearch; | ||||||
|  |     char *colsBrowseDatabase; | ||||||
|  |     char *colsBrowsePlaylistsDetail; | ||||||
|  |     char *colsBrowseFilesystem; | ||||||
|  |     char *colsPlayback; | ||||||
|  |     char *colsQueueLastPlayed; | ||||||
|  |      | ||||||
|  |     //system commands | ||||||
|  |     struct list syscmd_list; | ||||||
|  | } t_mympd_state; | ||||||
|  |  | ||||||
|  | static void mympd_api(t_config *config, t_mympd_state *mympd_state, t_work_request *request); | ||||||
|  | static bool mympd_api_read_syscmds(t_config *config, t_mympd_state *mympd_state); | ||||||
|  | static int mympd_api_syscmd(t_config *config, t_mympd_state *mympd_state, char *buffer, const char *cmd); | ||||||
|  | static void mympd_api_read_statefiles(t_config *config, t_mympd_state *mympd_state); | ||||||
|  | static int mympd_api_put_settings(t_config *config, t_mympd_state *mympd_state, char *buffer); | ||||||
|  |  | ||||||
|  |  | ||||||
| //public functions | //public functions | ||||||
| void *mympd_api_loop(void *arg_config) { | void *mympd_api_loop(void *arg_config) { | ||||||
|  |     t_config *config = (t_config *) arg_config; | ||||||
|  |      | ||||||
|  |     //read myMPD states under config.varlibdir | ||||||
|  |     t_mympd_state mympd_state; | ||||||
|  |     mympd_api_read_statefiles(config, &mympd_state); | ||||||
|  |  | ||||||
|  |     //push jukebox settings to mpd_client queue | ||||||
|  |     t_work_request *mpd_client_request = (t_work_request *)malloc(sizeof(t_work_request)); | ||||||
|  |     mpd_client_request->conn_id = 0; | ||||||
|  |     mpd_client_request->cmd_id = MYMPD_API_SETTINGS_SET; | ||||||
|  |     mpd_client_request->length = snprintf(mpd_client_request->data, MAX_SIZE,  | ||||||
|  |         "{\"cmd\":\"MYMPD_API_SETTINGS_SET\", \"data\":{\"jukeboxMode\": %d, \"jukeboxPlaylist\": \"%s\", \"jukeboxQueueLength\": %d}}", | ||||||
|  |         mympd_state.jukeboxMode, | ||||||
|  |         mympd_state.jukeboxPlaylist, | ||||||
|  |         mympd_state.jukeboxQueueLength | ||||||
|  |     ); | ||||||
|  |     tiny_queue_push(mpd_client_queue, mpd_client_request); | ||||||
|  |  | ||||||
|  |     //read system command files | ||||||
|  |     list_init(&mympd_state.syscmd_list); | ||||||
|  |     bool rc = mympd_api_read_syscmds(config, &mympd_state); | ||||||
|  |     if (rc == true) { | ||||||
|  |         list_sort_by_value(&mympd_state.syscmd_list, true); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     while (s_signal_received == 0) { |     while (s_signal_received == 0) { | ||||||
|         struct t_work_request *request = tiny_queue_shift(mympd_api_queue); |         struct t_work_request *request = tiny_queue_shift(mympd_api_queue); | ||||||
|         mympd_api(request, arg_config); |         mympd_api(config, &mympd_state, request); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     list_free(&mympd_state.syscmd_list); | ||||||
|     return NULL; |     return NULL; | ||||||
| } | } | ||||||
|  |  | ||||||
| //private functions | //private functions | ||||||
| static void mympd_api(t_work_request *request, t_config *config) { | static void mympd_api(t_config *config, t_mympd_state *mympd_state, t_work_request *request) { | ||||||
|     //t_work_request *request = (t_work_request *) arg_request; |     //t_work_request *request = (t_work_request *) arg_request; | ||||||
|     size_t len = 0; |     size_t len = 0; | ||||||
|     char buffer[MAX_SIZE]; |     char buffer[MAX_SIZE]; | ||||||
|     int je; |     int je; | ||||||
|     char *p_charbuf1; |     char *p_charbuf1; | ||||||
|  |     char p_char[4]; | ||||||
|     LOG_VERBOSE() printf("MYMPD API request: %.*s\n", request->length, request->data); |     LOG_VERBOSE() printf("MYMPD API request: %.*s\n", request->length, request->data); | ||||||
|      |      | ||||||
|     if (request->cmd_id == MYMPD_API_SYSCMD) { |     if (request->cmd_id == MYMPD_API_SYSCMD) { | ||||||
|         if (config->syscmds == true) { |         if (config->syscmds == true) { | ||||||
|             je = json_scanf(request->data, request->length, "{data: {cmd: %Q}}", &p_charbuf1); |             je = json_scanf(request->data, request->length, "{data: {cmd: %Q}}", &p_charbuf1); | ||||||
|             if (je == 1) { |             if (je == 1) { | ||||||
|                 len = mympd_api_syscmd(buffer, p_charbuf1, config); |                 len = mympd_api_syscmd(config, mympd_state, buffer, p_charbuf1); | ||||||
|                 free(p_charbuf1); |                 free(p_charbuf1); | ||||||
|             } |             } | ||||||
|         }  |         }  | ||||||
| @@ -73,6 +128,95 @@ static void mympd_api(t_work_request *request, t_config *config) { | |||||||
|             len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"System commands are disabled.\"}"); |             len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"System commands are disabled.\"}"); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |     else if (request->cmd_id == MYMPD_API_COLS_SAVE) { | ||||||
|  |         je = json_scanf(request->data, request->length, "{data: {table: %Q}}", &p_charbuf1); | ||||||
|  |         if (je == 1) { | ||||||
|  |             char column_list[800]; | ||||||
|  |             snprintf(column_list, 800, "%.*s", request->length, request->data); | ||||||
|  |             char *cols = strchr(column_list, '['); | ||||||
|  |             int col_len = strlen(cols);  | ||||||
|  |             if (col_len > 1) | ||||||
|  |                 cols[col_len - 2]  = '\0'; | ||||||
|  |             if (strcmp(p_charbuf1, "colsQueueCurrent") == 0) { | ||||||
|  |                 free(mympd_state->colsQueueCurrent); | ||||||
|  |                 mympd_state->colsQueueCurrent = strdup(cols); | ||||||
|  |             } | ||||||
|  |             else if (strcmp(p_charbuf1, "colsSearch") == 0) { | ||||||
|  |                 free(mympd_state->colsSearch); | ||||||
|  |                 mympd_state->colsSearch = strdup(cols); | ||||||
|  |             } | ||||||
|  |             else if (strcmp(p_charbuf1, "colsBrowseDatabase") == 0) { | ||||||
|  |                 free(mympd_state->colsBrowseDatabase); | ||||||
|  |                 mympd_state->colsBrowseDatabase = strdup(cols); | ||||||
|  |             } | ||||||
|  |             else if (strcmp(p_charbuf1, "colsBrowsePlaylistsDetail") == 0) { | ||||||
|  |                 free(mympd_state->colsBrowsePlaylistsDetail); | ||||||
|  |                 mympd_state->colsBrowsePlaylistsDetail = strdup(cols); | ||||||
|  |             } | ||||||
|  |             else if (strcmp(p_charbuf1, "colsBrowseFilesystem") == 0) { | ||||||
|  |                 free(mympd_state->colsBrowseFilesystem); | ||||||
|  |                 mympd_state->colsBrowseFilesystem = strdup(cols); | ||||||
|  |             } | ||||||
|  |             else if (strcmp(p_charbuf1, "colsPlayback") == 0) { | ||||||
|  |                 free(mympd_state->colsPlayback); | ||||||
|  |                 mympd_state->colsPlayback = strdup(cols); | ||||||
|  |             } | ||||||
|  |             else if (strcmp(p_charbuf1, "colsQueueLastPlayed") == 0) { | ||||||
|  |                 free(mympd_state->colsQueueLastPlayed); | ||||||
|  |                 mympd_state->colsQueueLastPlayed = strdup(cols); | ||||||
|  |             } | ||||||
|  |             else { | ||||||
|  |                 len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Unknown table %s\"}", p_charbuf1); | ||||||
|  |                 printf("MYMPD_API_COLS_SAVE: Unknown table %s\n", p_charbuf1); | ||||||
|  |                 free(p_charbuf1); | ||||||
|  |             } | ||||||
|  |             if (len == 0) { | ||||||
|  |                 if (state_file_write(config, p_charbuf1, cols)) | ||||||
|  |                     len = snprintf(buffer, MAX_SIZE, "{\"type\": \"result\", \"data\": \"ok\"}"); | ||||||
|  |             } | ||||||
|  |             free(p_charbuf1); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     else if (request->cmd_id == MYMPD_API_SETTINGS_SET) { | ||||||
|  |         je = json_scanf(request->data, request->length, "{data: {notificationWeb: %B}}", &mympd_state->notificationWeb); | ||||||
|  |         if (je == 1) { | ||||||
|  |             if (!state_file_write(config, "notificationWeb", (mympd_state->notificationWeb == true ? "true" : "false"))) | ||||||
|  |                 len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Can't set state notificationWeb.\"}"); | ||||||
|  |         }     | ||||||
|  |         je = json_scanf(request->data, request->length, "{data: {notificationPage: %B}}", &mympd_state->notificationPage); | ||||||
|  |         if (je == 1) { | ||||||
|  |             if (!state_file_write(config, "notificationPage", (mympd_state->notificationPage == true ? "true" : "false"))) | ||||||
|  |                 len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Can't set state notificationPage.\"}"); | ||||||
|  |         } | ||||||
|  |         je = json_scanf(request->data, request->length, "{data: {jukeboxMode: %d}}", &mympd_state->jukeboxMode); | ||||||
|  |         if (je == 1) { | ||||||
|  |             snprintf(p_char, 4, "%d", mympd_state->jukeboxMode); | ||||||
|  |             if (!state_file_write(config, "jukeboxMode", p_char)) | ||||||
|  |                 len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Can't set state jukeboxMode.\"}"); | ||||||
|  |         } | ||||||
|  |         je = json_scanf(request->data, request->length, "{data: {jukeboxPlaylist: %Q}}", &mympd_state->jukeboxPlaylist); | ||||||
|  |         if (je == 1) { | ||||||
|  |             if (!state_file_write(config, "jukeboxPlaylist", mympd_state->jukeboxPlaylist)) | ||||||
|  |                 len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Can't set state jukeboxPlaylist.\"}"); | ||||||
|  |         } | ||||||
|  |         je = json_scanf(request->data, request->length, "{data: {jukeboxQueueLength: %d}}", &mympd_state->jukeboxQueueLength); | ||||||
|  |         if (je == 1) { | ||||||
|  |            snprintf(p_char, 4, "%d", mympd_state->jukeboxQueueLength); | ||||||
|  |            if (!state_file_write(config, "jukeboxQueueLength", p_char)) | ||||||
|  |                len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Can't set state jukeboxQueueLength.\"}"); | ||||||
|  |         } | ||||||
|  |         if (len == 0) { | ||||||
|  |             len = snprintf(buffer, MAX_SIZE, "{\"type\": \"result\", \"data\": \"ok\"}"); | ||||||
|  |         } | ||||||
|  |         //push settings to mpd_client queue | ||||||
|  |         t_work_request *mpd_client_request = (t_work_request *)malloc(sizeof(t_work_request)); | ||||||
|  |         mpd_client_request->conn_id = request->conn_id; | ||||||
|  |         mpd_client_request->length = copy_string(mpd_client_request->data, request->data, MAX_SIZE, request->length); | ||||||
|  |         tiny_queue_push(mpd_client_queue, mpd_client_request); | ||||||
|  |     } | ||||||
|  |     else if (request->cmd_id == MYMPD_API_SETTINGS_GET) { | ||||||
|  |         len = mympd_api_put_settings(config, mympd_state, buffer); | ||||||
|  |     } | ||||||
|     else { |     else { | ||||||
|         len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Unknown cmd_id %u.\"}", request->cmd_id); |         len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"Unknown cmd_id %u.\"}", request->cmd_id); | ||||||
|         printf("ERROR: Unknown cmd_id %u\n", request->cmd_id);     |         printf("ERROR: Unknown cmd_id %u\n", request->cmd_id);     | ||||||
| @@ -92,7 +236,37 @@ static void mympd_api(t_work_request *request, t_config *config) { | |||||||
|     free(request); |     free(request); | ||||||
| } | } | ||||||
|  |  | ||||||
| static int mympd_api_syscmd(char *buffer, const char *cmd, t_config *config) { | static bool mympd_api_read_syscmds(t_config *config, t_mympd_state *mympd_state) { | ||||||
|  |     DIR *dir; | ||||||
|  |     struct dirent *ent; | ||||||
|  |     char dirname[400]; | ||||||
|  |     char *cmd; | ||||||
|  |     long order; | ||||||
|  |  | ||||||
|  |     if (config->syscmds == true) { | ||||||
|  |         snprintf(dirname, 400, "%s/syscmds", config->etcdir); | ||||||
|  |         printf("Reading syscmds: %s\n", dirname); | ||||||
|  |         if ((dir = opendir (dirname)) != NULL) { | ||||||
|  |             while ((ent = readdir(dir)) != NULL) { | ||||||
|  |                 if (strncmp(ent->d_name, ".", 1) == 0) | ||||||
|  |                     continue; | ||||||
|  |                 order = strtol(ent->d_name, &cmd, 10); | ||||||
|  |                 if (strcmp(cmd, "") != 0) | ||||||
|  |                     list_push(&mympd_state->syscmd_list, strdup(cmd), order); | ||||||
|  |             } | ||||||
|  |             closedir(dir); | ||||||
|  |         } | ||||||
|  |         else { | ||||||
|  |             printf("ERROR: Can't read syscmds"); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |         printf("Syscmds are disabled\n"); | ||||||
|  |     } | ||||||
|  |     return true; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static int mympd_api_syscmd(t_config *config, t_mympd_state *mympd_state, char *buffer, const char *cmd) { | ||||||
|     int len; |     int len; | ||||||
|     char filename[400]; |     char filename[400]; | ||||||
|     char *line; |     char *line; | ||||||
| @@ -100,7 +274,7 @@ static int mympd_api_syscmd(char *buffer, const char *cmd, t_config *config) { | |||||||
|     size_t n = 0; |     size_t n = 0; | ||||||
|     ssize_t read; |     ssize_t read; | ||||||
|      |      | ||||||
|     const int order = list_get_value(&config->syscmd_list, cmd); |     const int order = list_get_value(&mympd_state->syscmd_list, cmd); | ||||||
|     if (order == -1) { |     if (order == -1) { | ||||||
|         printf("ERROR: Syscmd not defined: %s\n", cmd); |         printf("ERROR: Syscmd not defined: %s\n", cmd); | ||||||
|         len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"System command not defined\"}"); |         len = snprintf(buffer, MAX_SIZE, "{\"type\": \"error\", \"data\": \"System command not defined\"}"); | ||||||
| @@ -134,3 +308,155 @@ static int mympd_api_syscmd(char *buffer, const char *cmd, t_config *config) { | |||||||
|     CHECK_RETURN_LEN();     |     CHECK_RETURN_LEN();     | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static void mympd_api_read_statefiles(t_config *config, t_mympd_state *mympd_state) { | ||||||
|  |     char *crap; | ||||||
|  |     char value[400]; | ||||||
|  |  | ||||||
|  |     LOG_INFO() printf("Reading states\n"); | ||||||
|  |     if (state_file_read(config, "notificationWeb", value)) { | ||||||
|  |         if (strcmp(value, "true") == 0) | ||||||
|  |             mympd_state->notificationWeb = true; | ||||||
|  |         else | ||||||
|  |             mympd_state->notificationWeb = false; | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |         mympd_state->notificationWeb = false; | ||||||
|  |         state_file_write(config, "notificationWeb", "false"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (state_file_read(config, "notificationPage", value)) { | ||||||
|  |         if (strcmp(value, "true") == 0) | ||||||
|  |             mympd_state->notificationPage = true; | ||||||
|  |         else | ||||||
|  |             mympd_state->notificationPage = false; | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |         mympd_state->notificationPage = true; | ||||||
|  |         state_file_write(config, "notificationPage", "true"); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     if (state_file_read(config, "jukeboxMode", value)) | ||||||
|  |         mympd_state->jukeboxMode = strtol(value, &crap, 10); | ||||||
|  |     else { | ||||||
|  |         mympd_state->jukeboxMode = JUKEBOX_OFF; | ||||||
|  |         state_file_write(config, "jukeboxMode", "0"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (state_file_read(config, "jukeboxPlaylist", value)) | ||||||
|  |         mympd_state->jukeboxPlaylist = strdup(value); | ||||||
|  |     else { | ||||||
|  |         mympd_state->jukeboxPlaylist = strdup("Database"); | ||||||
|  |         state_file_write(config, "jukeboxPlaylist", "Database"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (state_file_read(config, "jukeboxQueueLength", value)) | ||||||
|  |         mympd_state->jukeboxQueueLength = strtol(value, &crap, 10); | ||||||
|  |     else { | ||||||
|  |         mympd_state->jukeboxQueueLength = 1; | ||||||
|  |         state_file_write(config, "jukeboxQueueLength", "1"); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     if (state_file_read(config, "colsQueueCurrent", value)) | ||||||
|  |         mympd_state->colsQueueCurrent = strdup(value); | ||||||
|  |     else { | ||||||
|  |         mympd_state->colsQueueCurrent = strdup("[\"Pos\",\"Title\",\"Artist\",\"Album\",\"Duration\"]"); | ||||||
|  |         state_file_write(config, "colsQueueCurrent", mympd_state->colsQueueCurrent); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     if (state_file_read(config, "colsSearch", value)) | ||||||
|  |         mympd_state->colsSearch = strdup(value); | ||||||
|  |     else { | ||||||
|  |         mympd_state->colsSearch = strdup("[\"Title\",\"Artist\",\"Album\",\"Duration\"]"); | ||||||
|  |         state_file_write(config, "colsSearch", mympd_state->colsSearch); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     if (state_file_read(config, "colsBrowseDatabase", value)) | ||||||
|  |         mympd_state->colsBrowseDatabase = strdup(value); | ||||||
|  |     else { | ||||||
|  |         mympd_state->colsBrowseDatabase = strdup("[\"Track\",\"Title\",\"Duration\"]"); | ||||||
|  |         state_file_write(config, "colsBrowseDatabase", mympd_state->colsBrowseDatabase); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     if (state_file_read(config, "colsBrowsePlaylistsDetail", value)) | ||||||
|  |         mympd_state->colsBrowsePlaylistsDetail = strdup(value); | ||||||
|  |     else { | ||||||
|  |         mympd_state->colsBrowsePlaylistsDetail = strdup("[\"Pos\",\"Title\",\"Artist\",\"Album\",\"Duration\"]"); | ||||||
|  |         state_file_write(config, "colsBrowsePlaylistsDetail", mympd_state->colsBrowsePlaylistsDetail); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     if (state_file_read(config, "colsBrowseFilesystem", value)) | ||||||
|  |         mympd_state->colsBrowseFilesystem = strdup(value); | ||||||
|  |     else { | ||||||
|  |         mympd_state->colsBrowseFilesystem = strdup("[\"Type\",\"Title\",\"Artist\",\"Album\",\"Duration\"]"); | ||||||
|  |         state_file_write(config, "colsBrowseFilesystem", mympd_state->colsBrowseFilesystem); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     if (state_file_read(config, "colsPlayback", value)) | ||||||
|  |         mympd_state->colsPlayback = strdup(value); | ||||||
|  |     else { | ||||||
|  |         mympd_state->colsPlayback = strdup("[\"Artist\",\"Album\",\"Genre\"]"); | ||||||
|  |         state_file_write(config, "colsPlayback", mympd_state->colsPlayback); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (state_file_read(config, "colsQueueLastPlayed", value)) | ||||||
|  |         mympd_state->colsQueueLastPlayed = strdup(value); | ||||||
|  |     else { | ||||||
|  |         mympd_state->colsQueueLastPlayed = strdup("[\"Pos\",\"Title\",\"Artist\",\"Album\",\"LastPlayed\"]"); | ||||||
|  |         state_file_write(config, "colsQueueLastPlayed", mympd_state->colsQueueLastPlayed); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static int mympd_api_put_settings(t_config *config, t_mympd_state *mympd_state, char *buffer) { | ||||||
|  |     size_t len; | ||||||
|  |     int nr = 0; | ||||||
|  |     struct json_out out = JSON_OUT_BUF(buffer, MAX_SIZE); | ||||||
|  |      | ||||||
|  |     len = json_printf(&out, "{type: settings, data: {mpdhost: %Q, mpdport: %d, passwort_set: %B, featSyscmds: %B, featStickers: %B, featSmartpls: %B, " | ||||||
|  |         "featLocalplayer: %B, streamport: %d, streamurl: %Q, featCoverimage: %B, coverimagename: %Q, coverimagesize: %d, featMixramp: %B, " | ||||||
|  |         "maxElementsPerPage: %d, notificationWeb: %B, notificationPage: %B, jukeboxMode: %d, jukeboxPlaylist: %Q, jukeboxQueueLength: %d",  | ||||||
|  |         config->mpdhost,  | ||||||
|  |         config->mpdport,  | ||||||
|  |         config->mpdpass ? "true" : "false", | ||||||
|  |         config->syscmds, | ||||||
|  |         config->stickers, | ||||||
|  |         config->smartpls, | ||||||
|  |         config->localplayer, | ||||||
|  |         config->streamport, | ||||||
|  |         config->streamurl, | ||||||
|  |         config->coverimage, | ||||||
|  |         config->coverimagename, | ||||||
|  |         config->coverimagesize, | ||||||
|  |         config->mixramp, | ||||||
|  |         config->max_elements_per_page, | ||||||
|  |         mympd_state->notificationWeb, | ||||||
|  |         mympd_state->notificationPage, | ||||||
|  |         mympd_state->jukeboxMode, | ||||||
|  |         mympd_state->jukeboxPlaylist, | ||||||
|  |         mympd_state->jukeboxQueueLength | ||||||
|  |     ); | ||||||
|  |      | ||||||
|  |     if (config->syscmds == true) { | ||||||
|  |         len += json_printf(&out, ", syscmds: ["); | ||||||
|  |         nr = 0; | ||||||
|  |         struct node *current = mympd_state->syscmd_list.list; | ||||||
|  |         while (current != NULL) { | ||||||
|  |             if (nr++)  | ||||||
|  |                 len += json_printf(&out, ","); | ||||||
|  |             len += json_printf(&out, "%Q", current->data); | ||||||
|  |             current = current->next; | ||||||
|  |         } | ||||||
|  |         len += json_printf(&out, "]"); | ||||||
|  |     } | ||||||
|  |     len += json_printf(&out, ", colsQueueCurrent: %s, colsSearch: %s, colsBrowseDatabase: %s, colsBrowsePlaylistsDetail: %s, " | ||||||
|  |         "colsBrowseFilesystem: %s, colsPlayback: %s, colsQueueLastPlayed: %s}}", | ||||||
|  |         mympd_state->colsQueueCurrent, | ||||||
|  |         mympd_state->colsSearch, | ||||||
|  |         mympd_state->colsBrowseDatabase, | ||||||
|  |         mympd_state->colsBrowsePlaylistsDetail, | ||||||
|  |         mympd_state->colsBrowseFilesystem, | ||||||
|  |         mympd_state->colsPlayback, | ||||||
|  |         mympd_state->colsQueueLastPlayed | ||||||
|  |     ); | ||||||
|  |  | ||||||
|  |     CHECK_RETURN_LEN(); | ||||||
|  | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 jcorporation
					jcorporation