mirror of
				https://github.com/SuperBFG7/ympd
				synced 2025-10-30 21:33:00 +00:00 
			
		
		
		
	Feat: improve last_played function
This commit is contained in:
		| @@ -982,6 +982,8 @@ function filterCols(x) { | ||||
|         tags.push('Pos'); | ||||
|     else if (x == 'colsBrowseFilesystem') | ||||
|         tags.push('Type'); | ||||
|     if (x == 'colsLastPlayed') | ||||
|         tags.push('LastPlayed'); | ||||
|          | ||||
|     var cols = []; | ||||
|     for (var i = 0; i < settings[x].length; i++) { | ||||
| @@ -1189,6 +1191,8 @@ function setCols(table, className) { | ||||
|         tags.push('Pos'); | ||||
|     if (table == 'BrowseFilesystem') | ||||
|         tags.push('Type'); | ||||
|     if (table == 'LastPlayed') | ||||
|         tags.push('LastPlayed'); | ||||
|      | ||||
|     tags.sort(); | ||||
|      | ||||
| @@ -1526,6 +1530,7 @@ function parseLastPlayed(obj) { | ||||
|         var minutes = Math.floor(obj.data[i].Duration / 60); | ||||
|         var seconds = obj.data[i].Duration - minutes * 60; | ||||
|         obj.data[i].Duration = minutes + ':' + (seconds < 10 ? '0' : '') + seconds; | ||||
|         obj.data[i].LastPlayed = new Date(obj.data[i].LastPlayed * 1000).toUTCString(); | ||||
|         var row = document.createElement('tr'); | ||||
|         row.setAttribute('data-songpos', (obj.data[i].Pos + 1)); | ||||
|         row.setAttribute('data-uri', obj.data[i].uri); | ||||
| @@ -1582,9 +1587,6 @@ function parseFilesystem(obj) { | ||||
|     var tr = tbody.getElementsByTagName('tr'); | ||||
|     for (var i = 0; i < nrItems; i++) { | ||||
|         var uri = encodeURI(obj.data[i].uri); | ||||
|         //if (tr[i]) | ||||
|         //    if (tr[i].getAttribute('data-uri') == uri) | ||||
|         //        continue; | ||||
|         var row = document.createElement('tr'); | ||||
|         row.setAttribute('data-type', obj.data[i].Type); | ||||
|         row.setAttribute('data-uri', uri); | ||||
| @@ -1686,9 +1688,6 @@ function parsePlaylists(obj) { | ||||
|     if (app.current.view == 'All') { | ||||
|         for (var i = 0; i < nrItems; i++) { | ||||
|             var uri = encodeURI(obj.data[i].uri); | ||||
|             if (tr[i]) | ||||
|                 if (tr[i].getAttribute('data-uri') == uri) | ||||
|                     continue; | ||||
|             var d = new Date(obj.data[i].last_modified * 1000); | ||||
|             var row = document.createElement('tr'); | ||||
|             row.setAttribute('data-uri', uri); | ||||
| @@ -1707,9 +1706,6 @@ function parsePlaylists(obj) { | ||||
|     else if (app.current.view == 'Detail') { | ||||
|         for (var i = 0; i < nrItems; i++) { | ||||
|             var uri = encodeURI(obj.data[i].uri); | ||||
|             //if (tr[i]) | ||||
|             //    if (tr[i].getAttribute('data-uri') == uri && tr[i].getAttribute('id') == 'playlistTrackId' + songpos) | ||||
|             //        continue; | ||||
|             var row = document.createElement('tr'); | ||||
|             if (obj.smartpls == false) | ||||
|                 row.setAttribute('draggable','true'); | ||||
| @@ -1772,9 +1768,6 @@ function parseListDBtags(obj) { | ||||
|         var cards = cardContainer.getElementsByClassName('card'); | ||||
|         for (var i = 0; i < nrItems; i++) { | ||||
|             var id = genId(obj.data[i].value); | ||||
| //            if (cards[i]) | ||||
| //                if (cards[i].getAttribute('id') == id) | ||||
| //                    continue;               | ||||
|             var card = document.createElement('div'); | ||||
|             card.classList.add('card', 'ml-4', 'mr-4', 'mb-4', 'w-100'); | ||||
|             card.setAttribute('id', 'card' + id); | ||||
| @@ -1822,9 +1815,6 @@ function parseListDBtags(obj) { | ||||
|         var tr = tbody.getElementsByTagName('tr'); | ||||
|         for (var i = 0; i < nrItems; i++) { | ||||
|             var uri = encodeURI(obj.data[i].value); | ||||
|             if (tr[i]) | ||||
|                 if (tr[i].getAttribute('data-uri') == uri) | ||||
|                     continue; | ||||
|             var row = document.createElement('tr'); | ||||
|             row.setAttribute('data-uri', uri); | ||||
|             row.innerHTML='<td data-col="Type"><span class="material-icons">album</span></td>' + | ||||
|   | ||||
							
								
								
									
										11
									
								
								src/list.c
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								src/list.c
									
									
									
									
									
								
							| @@ -140,6 +140,17 @@ int list_push(struct list *l, const char *data, int value) { | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| int list_insert(struct list *l, const char *data, int value) { | ||||
|     struct node *n = malloc(sizeof(struct node)); | ||||
|     n->value = value; | ||||
|     n->data = strdup(data); | ||||
|     n->next = l->list; | ||||
|      | ||||
|     l->list = n; | ||||
|     l->length++; | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| struct node *list_node_extract(struct list *l, unsigned idx) { | ||||
|     if (l->list == NULL) { return NULL; } | ||||
|     struct node *current = l->list, **previous = &l->list; | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| struct node { | ||||
|     char *data; | ||||
|     int value; | ||||
|     long value; | ||||
|     struct node *next; | ||||
| }; | ||||
|  | ||||
| @@ -13,6 +13,7 @@ struct list { | ||||
|  | ||||
| int list_init(struct list *l); | ||||
| int list_push(struct list *l, const char *data, int value); | ||||
| int list_insert(struct list *l, const char *data, int value); | ||||
| int list_shift(struct list *l, unsigned idx); | ||||
| struct node *list_node_extract(struct list *l, unsigned idx); | ||||
| int list_replace(struct list *l, int pos, const char *data, int value); | ||||
|   | ||||
| @@ -1014,22 +1014,39 @@ void mympd_like_song_uri(const char *uri, int value) { | ||||
|  | ||||
| void mympd_last_played_list(int song_id) { | ||||
|     struct mpd_song *song; | ||||
|     char tmpfile[400]; | ||||
|     char cfgfile[400]; | ||||
|     snprintf(cfgfile, 400, "%s/state/last_played", config.varlibdir); | ||||
|     snprintf(tmpfile, 400, "%s/tmp/last_played", config.varlibdir); | ||||
|  | ||||
|     if (song_id > -1) { | ||||
|         song = mpd_run_get_queue_song_id(mpd.conn, song_id); | ||||
|         if (song) { | ||||
|             list_push(&last_played, mpd_song_get_uri(song), 1); | ||||
|             list_insert(&last_played, mpd_song_get_uri(song), time(NULL)); | ||||
|             mpd.last_last_played_id = song_id; | ||||
|             mpd_song_free(song); | ||||
|             if (last_played.length > config.last_played_count) { | ||||
|                 list_shift(&last_played, 0); | ||||
|                 list_shift(&last_played, last_played.length -1); | ||||
|             } | ||||
|             FILE *fp = fopen(tmpfile, "w"); | ||||
|             if (fp == NULL) { | ||||
|                 printf("Error opening %s\n", tmpfile); | ||||
|                 return; | ||||
|             } | ||||
|             struct node *current = last_played.list; | ||||
|             while (current != NULL) { | ||||
|                 fprintf(fp, "%ld::%s\n", current->value, current->data); | ||||
|                 current = current->next; | ||||
|             } | ||||
|             fclose(fp); | ||||
|             rename(tmpfile, cfgfile);             | ||||
|         } | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| void mympd_last_played_song_id(int song_id) { | ||||
|     struct mpd_song *song; | ||||
|      | ||||
|     if (song_id > -1) { | ||||
|         song = mpd_run_get_queue_song_id(mpd.conn, song_id); | ||||
|         if (song) { | ||||
| @@ -1665,7 +1682,7 @@ int mympd_put_last_played_songs(char *buffer, unsigned int offset) { | ||||
|         if (entity_count > offset && entity_count <= offset + config.max_elements_per_page) { | ||||
|             if (entities_returned++)  | ||||
|                 len += json_printf(&out, ","); | ||||
|             len += json_printf(&out, "{Pos: %d, ", entity_count); | ||||
|             len += json_printf(&out, "{Pos: %d, LastPlayed: %ld, ", entity_count, current->value); | ||||
|             if (!mpd_send_list_all_meta(mpd.conn, current->data)) | ||||
|                 RETURN_ERROR_AND_RECOVER("mpd_send_list_all_meta"); | ||||
|             if ((entity = mpd_recv_entity(mpd.conn)) != NULL) { | ||||
|   | ||||
							
								
								
									
										26
									
								
								src/mympd.c
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								src/mympd.c
									
									
									
									
									
								
							| @@ -329,6 +329,31 @@ void read_statefiles() { | ||||
|     } | ||||
| } | ||||
|  | ||||
| int read_last_played() { | ||||
|     char cfgfile[400]; | ||||
|     char *line; | ||||
|     char *data; | ||||
|     size_t n = 0; | ||||
|     ssize_t read; | ||||
|     long value; | ||||
|      | ||||
|     snprintf(cfgfile, 400, "%s/state/last_played", config.varlibdir); | ||||
|     FILE *fp = fopen(cfgfile, "r"); | ||||
|     if (fp == NULL) { | ||||
|         printf("Error opening %s\n", cfgfile); | ||||
|         return 0; | ||||
|     } | ||||
|     while ((read = getline(&line, &n, fp)) > 0) { | ||||
|         value = strtol(line, &data, 10); | ||||
|         if (strlen(data) > 2) | ||||
|             data = data + 2; | ||||
|         strtok(data, "\n"); | ||||
|         list_push(&last_played, data, value); | ||||
|     } | ||||
|     fclose(fp); | ||||
|     return last_played.length;; | ||||
| } | ||||
|  | ||||
| bool testdir(char *name, char *dirname) { | ||||
|     DIR* dir = opendir(dirname); | ||||
|     if (dir) { | ||||
| @@ -499,6 +524,7 @@ int main(int argc, char **argv) { | ||||
|     list_init(&mpd_tags); | ||||
|     list_init(&mympd_tags); | ||||
|     list_init(&last_played); | ||||
|     printf("Reading last played songs: %d\n", read_last_played()); | ||||
|      | ||||
|     if (config.ssl == true) | ||||
|         mg_set_protocol_http_websocket(nc_http); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 jcorporation
					jcorporation