static const void *description_get(wizard_page_t *page, const char **doc) { htsbuf_queue_t q; if (!page->desc) { htsbuf_queue_init(&q, 0); for (; *doc; doc++) { if (*doc[0] == '\xff') { htsbuf_append_str(&q, tvh_gettext_lang(config.language_ui, *doc + 1)); } else { htsbuf_append_str(&q, *doc); } } page->desc = htsbuf_to_string(&q); htsbuf_queue_flush(&q); } return &page->desc; }
static htsmsg_t * avt_generate_props(upnp_local_service_t *uls, const char *myhost, int myport) { char *event; htsbuf_queue_t xml; char str[256]; const char *s; htsbuf_queue_init(&xml, 0); htsbuf_qprintf(&xml, "<Event xmlns=\"urn:schemas-upnp-org:metadata-1-0/RCS/\">" "<InstanceID val=\"0\">"); upnp_event_encode_str(&xml, "TransportState", current_playstate()); upnp_event_encode_str(&xml, "CurrentMediaCategory", current_mediaCategory()); // PlaybackStorageMedium if(upnp_current_playstatus == NULL) s = "NONE"; else s = "NETWORK"; upnp_event_encode_str(&xml, "PlaybackStorageMedium", s); upnp_event_encode_str(&xml, "CurrentPlayMode", current_playMode()); current_transportActions(str, sizeof(str)); upnp_event_encode_str(&xml, "CurrentTransportActions", str); upnp_event_encode_int(&xml, "NumberOfTracks", upnp_current_total_tracks); upnp_event_encode_int(&xml, "CurrentTrack", upnp_current_track); upnp_event_encode_str(&xml, "AVTransportURI", upnp_current_url ?: ""); upnp_event_encode_int(&xml, "TransportPlaySpeed", 1); // Metadata char *meta = build_didl(myhost, myport); upnp_event_encode_str(&xml, "AVTransportURIMetaData", meta); upnp_event_encode_str(&xml, "CurrentTrackMetaData", meta); free(meta); fmttime(str, sizeof(str), upnp_current_track_duration); upnp_event_encode_str(&xml, "CurrentTrackDuration", str); upnp_event_encode_str(&xml, "CurrentMediaDuration", str); upnp_event_encode_str(&xml, "PossibleRecordQualityModes", NULL); upnp_event_encode_str(&xml, "TransportStatus", "OK"); upnp_event_encode_str(&xml, "DRMState", "UNKNOWN"); upnp_event_encode_str(&xml, "RecordMediumWriteStatus", NULL); upnp_event_encode_str(&xml, "RecordStorageMedium", NULL); upnp_event_encode_str(&xml, "PossibleRecordStorageMedia", NULL); upnp_event_encode_str(&xml, "NextAVTransportURI", ""); upnp_event_encode_str(&xml, "NextAVTransportURIMetaData", NULL); upnp_event_encode_str(&xml, "CurrentRecordQualityMode", NULL); upnp_event_encode_str(&xml, "PossiblePlaybackStorageMedia", "NETWORK"); htsbuf_qprintf(&xml, "</InstanceID></Event>"); event = htsbuf_to_string(&xml); htsmsg_t *r = htsmsg_create_map(); htsmsg_add_str(r, "LastChange", event); free(event); return r; }
static char * build_didl(const char *myhost, int myport) { htsbuf_queue_t hq; htsbuf_queue_init(&hq, 0); htsbuf_qprintf(&hq, "<DIDL-Lite xmlns=\"urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/\" " "xmlns:dc=\"http://purl.org/dc/elements/1.1/\" " "xmlns:dlna=\"urn:schemas-dlna-org:metadata-1-0\" " "xmlns:pv=\"http://www.pv.com/pvns/\" " "xmlns:upnp=\"urn:schemas-upnp-org:metadata-1-0/upnp/\">" "<item id=\"101\" parentID=\"100\" restricted=\"0\">" "<upnp:class xmlns:upnp=\"urn:schemas-upnp-org:metadata-1-0/upnp/\">object.item.audioItem.musicTrack</upnp:class>"); if(upnp_current_title) { htsbuf_qprintf(&hq, "<dc:title xmlns:dc=\"http://purl.org/dc/elements/1.1/\">"); htsbuf_append_and_escape_xml(&hq, upnp_current_title); htsbuf_qprintf(&hq, "</dc:title>"); } if(upnp_current_artist) { htsbuf_qprintf(&hq, "<upnp:artist xmlns:upnp=\"urn:schemas-upnp-org:metadata-1-0/upnp/\">"); htsbuf_append_and_escape_xml(&hq, upnp_current_artist); htsbuf_qprintf(&hq, "</upnp:artist>"); } if(upnp_current_album) { htsbuf_qprintf(&hq, "<upnp:album xmlns:upnp=\"urn:schemas-upnp-org:metadata-1-0/upnp/\">"); htsbuf_append_and_escape_xml(&hq, upnp_current_album); htsbuf_qprintf(&hq, "</upnp:album>"); } if(upnp_current_album_art) { char url[URL_MAX]; const char *arturl; if(strncmp(upnp_current_album_art, "http://", strlen("http://"))) { snprintf(url, sizeof(url), "http://%s:%d/api/image/%s", myhost, myport, upnp_current_album_art); arturl = url; } else { arturl = upnp_current_album_art; } htsbuf_qprintf(&hq, "<upnp:albumArtURI xmlns:upnp=\"urn:schemas-upnp-org:metadata-1-0/upnp/\">"); htsbuf_append_and_escape_xml(&hq, arturl); htsbuf_qprintf(&hq, "</upnp:albumArtURI>"); } htsbuf_qprintf(&hq, "</item></DIDL-Lite>"); return htsbuf_to_string(&hq); }