int main (int argc, char **argv) { dlna_t *dlna; dlna_profile_t *p; dlna_org_flags_t flags; if (argc < 2) { printf ("usage: %s media_filename\n", argv[0]); return -1; } flags = (dlna_org_flags_t) (DLNA_ORG_FLAG_STREAMING_TRANSFER_MODE | DLNA_ORG_FLAG_BACKGROUND_TRANSFERT_MODE | DLNA_ORG_FLAG_CONNECTION_STALL | DLNA_ORG_FLAG_DLNA_V15); printf ("Using %s\n", LIBDLNA_IDENT); dlna = dlna_init (); dlna_set_verbosity (dlna, 1); dlna_register_all_media_profiles (dlna); p = dlna_guess_media_profile (dlna, argv[1]); if (p) { char *protocol_info; printf ("ID: %s\n", p->id); printf ("MIME: %s\n", p->mime); printf ("Label: %s\n", p->label); printf ("Class: %d\n", p->class_); printf ("UPnP Object Item: %s\n", dlna_profile_upnp_object_item (p)); protocol_info = dlna_write_protocol_info (DLNA_PROTOCOL_INFO_TYPE_HTTP, DLNA_ORG_PLAY_SPEED_NORMAL, DLNA_ORG_CONVERSION_NONE, DLNA_ORG_OPERATION_RANGE, flags, p); printf ("Protocol Info: %s\n", protocol_info); free (protocol_info); } else printf ("Unknown format\n"); dlna_uninit (dlna); return 0; }
static struct upnp_entry_t * upnp_entry_new(struct ushare_t *ut, const char *name, const char *fullpath, struct upnp_entry_t *parent, off_t size, int dir) { struct upnp_entry_t *entry = NULL; char *title = NULL, *x = NULL; char url_tmp[MAX_URL_SIZE] = { '\0' }; char *title_or_name = NULL; if (!name) { return NULL; } entry = (struct upnp_entry_t *) malloc (sizeof (struct upnp_entry_t)); #ifdef HAVE_DLNA entry->dlna_profile = NULL; entry->url = NULL; if (ut->dlna_enabled && fullpath && !dir) { dlna_profile_t *p = dlna_guess_media_profile (ut->dlna, fullpath); if (!p) { free (entry); return NULL; } entry->dlna_profile = p; } #endif /* HAVE_DLNA */ if (ut->xbox360) { if (ut->root_entry) { entry->id = ut->starting_id + ut->nr_entries++; } else { entry->id = 0; /* Creating the root node so don't use the usual IDs */ } } else { entry->id = ut->starting_id + ut->nr_entries++; } entry->fullpath = fullpath ? strdup (fullpath) : NULL; entry->parent = parent; entry->child_count = dir ? 0 : -1; entry->title = NULL; entry->childs = (struct upnp_entry_t **) malloc (sizeof (struct upnp_entry_t *)); *(entry->childs) = NULL; if (!dir) /* item */ { #ifdef HAVE_DLNA if (ut->dlna_enabled) { entry->mime_type = NULL; } else { #endif /* HAVE_DLNA */ struct mime_type_t *mime = getMimeType(getExtension (name)); if (!mime) { --ut->nr_entries; upnp_entry_free (ut, entry); log_error ("Invalid Mime type for %s, entry ignored", name); return NULL; } entry->mime_type = mime; #ifdef HAVE_DLNA } #endif /* HAVE_DLNA */ if (snprintf (url_tmp, MAX_URL_SIZE, "%d.%s", entry->id, getExtension (name)) >= MAX_URL_SIZE) log_error ("URL string too long for id %d, truncated!!", entry->id); /* Only malloc() what we really need */ entry->url = strdup (url_tmp); } else /* container */ { entry->mime_type = &Container_MIME_Type; entry->url = NULL; } /* Try Iconv'ing the name but if it fails the end device may still be able to handle it */ title = iconv_convert (name); if (title) title_or_name = title; else { if (ut->override_iconv_err) { title_or_name = strdup (name); log_error ("Entry invalid name id=%d [%s]\n", entry->id, name); } else { upnp_entry_free (ut, entry); log_error ("Freeing entry invalid name id=%d [%s]\n", entry->id, name); return NULL; } } if (!dir) { x = strrchr (title_or_name, '.'); if (x) /* avoid displaying file extension */ *x = '\0'; } x = convert_xml (title_or_name); if (x) { free (title_or_name); title_or_name = x; } entry->title = title_or_name; if (!strcmp (title_or_name, "")) /* DIDL dc:title can't be empty */ { free (title_or_name); entry->title = strdup (TITLE_UNKNOWN); } entry->size = size; entry->fd = -1; if (entry->id && entry->url) log_verbose ("Entry->URL (%d): %s\n", entry->id, entry->url); return entry; }