GSSDP_REQUIRED=0.13.0
GUPNP_REQUIRED=0.19.0
GUPNP_AV_REQUIRED=0.11.4
-GUPNP_DLNA_REQUIRED=0.7.0
+GUPNP_DLNA_REQUIRED=0.9.4
GSTREAMER_REQUIRED=1.0
GSTPBU_REQUIRED=1.0
GIO_REQUIRED=2.26
PKG_CHECK_MODULES([RYGEL_MEDIA_ENGINE_GSTREAMER_DEPS],
[$RYGEL_COMMON_MODULES
gstreamer-pbutils-1.0 >= $GSTPBU_REQUIRED
- gupnp-dlna-1.1 >= $GUPNP_DLNA_REQUIRED
+ gstreamer-app-1.0 >= $GSTREAMER_APP_REQUIRED
+ gupnp-dlna-2.0 >= $GUPNP_DLNA_REQUIRED
gio-2.0 >= GIO_REQUIRED])
- RYGEL_MEDIA_ENGINE_GSTREAMER_DEPS_VALAFLAGS="$RYGEL_COMMON_MODULES_VALAFLAGS --pkg gstreamer-base-1.0 --pkg gstreamer-pbutils-1.0 --pkg gupnp-dlna-1.1"
+ RYGEL_MEDIA_ENGINE_GSTREAMER_DEPS_VALAFLAGS="$RYGEL_COMMON_MODULES_VALAFLAGS --pkg gstreamer-base-1.0 --pkg gstreamer-pbutils-1.0 --pkg gupnp-dlna-2.0"
AC_SUBST([RYGEL_MEDIA_ENGINE_GSTREAMER_DEPS_VALAFLAGS])
PKG_CHECK_MODULES([LIBRYGEL_RENDERER_GST_DEPS], [$RYGEL_COMMON_MODULES gstreamer-1.0 >= $GSTREAMER_REQUIRED])
[
PKG_CHECK_MODULES([RYGEL_PLUGIN_MEDIA_EXPORT_DEPS],
[$RYGEL_COMMON_MODULES gio-2.0 >= $GIO_REQUIRED
- gupnp-dlna-1.1 >= $GUPNP_DLNA_REQUIRED
+ gupnp-dlna-2.0 >= $GUPNP_DLNA_REQUIRED
+ gupnp-dlna-gst-2.0 >= $GUPNP_DLNA_REQUIRED
+ gstreamer-app-1.0 >= $GSTREAMER_APP_REQUIRED
gstreamer-tag-1.0 >= $GSTREAMER_TAG_REQUIRED
- gstreamer-app-1.0 >= $GSTREAMER_TAG_REQUIRED
gstreamer-pbutils-1.0 >= $GSTPBU_REQUIRED
sqlite3 >= $LIBSQLITE3_REQUIRED
uuid])
- RYGEL_PLUGIN_MEDIA_EXPORT_DEPS_VALAFLAGS="$RYGEL_COMMON_MODULES_VALAFLAGS --pkg gupnp-dlna-1.1 --pkg gstreamer-tag-1.0 --pkg gstreamer-app-1.0 --pkg sqlite3"
+ RYGEL_PLUGIN_MEDIA_EXPORT_DEPS_VALAFLAGS="$RYGEL_COMMON_MODULES_VALAFLAGS --pkg gupnp-dlna-2.0 --pkg gupnp-dlna-gst-2.0 --pkg gstreamer-tag-1.0 --pkg gstreamer-app-1.0 --pkg gstreamer-pbutils-1.0 --pkg sqlite3"
AC_SUBST([RYGEL_PLUGIN_MEDIA_EXPORT_DEPS_VALAFLAGS])
])
/*
* Copyright (C) 2008 Zeeshan Ali <zeenix@gmail.com>.
* Copyright (C) 2008 Nokia Corporation.
+ * Copyright (C) 2012 Intel Corporation.
*
* Author: Zeeshan Ali <zeenix@gmail.com>
+ * Jens Georg <jensg@openismus.com>
*
* This file is part of Rygel.
*
}
}
- public static MediaItem? create_from_info
- (MediaContainer parent,
- File file,
- GUPnPDLNA.Information dlna_info,
- FileInfo file_info) {
+ public static MediaItem? create_from_info (MediaContainer parent,
+ File file,
+ DiscovererInfo info,
+ GUPnPDLNA.Profile? profile,
+ FileInfo file_info) {
MediaItem item;
string id = MediaCache.get_id (file);
GLib.List<DiscovererAudioInfo> audio_streams;
GLib.List<DiscovererVideoInfo> video_streams;
audio_streams = (GLib.List<DiscovererAudioInfo>)
- dlna_info.info.get_audio_streams ();
+ info.get_audio_streams ();
video_streams = (GLib.List<DiscovererVideoInfo>)
- dlna_info.info.get_video_streams ();
+ info.get_video_streams ();
if (audio_streams == null && video_streams == null) {
debug ("%s had neither audio nor video/picture " +
item = new PhotoItem (id, parent, "");
return fill_photo_item (item as PhotoItem,
file,
- dlna_info,
+ info,
+ profile,
video_streams.data,
file_info);
} else if (video_streams != null) {
return fill_video_item (item as VideoItem,
file,
- dlna_info,
+ info,
+ profile,
video_streams.data,
audio_info,
file_info);
item = new MusicItem (id, parent, "");
return fill_music_item (item as MusicItem,
file,
- dlna_info,
+ info,
+ profile,
audio_streams.data,
file_info);
} else {
}
}
- private static void fill_audio_item (AudioItem item,
- GUPnPDLNA.Information dlna_info,
- DiscovererAudioInfo? audio_info) {
- if (dlna_info.info.get_duration () > 0) {
- item.duration = (long) (dlna_info.info.get_duration () / Gst.SECOND);
+ private static void fill_audio_item (AudioItem item,
+ DiscovererInfo info,
+ DiscovererAudioInfo? audio_info) {
+ if (info.get_duration () > 0) {
+ item.duration = (long) (info.get_duration () / Gst.SECOND);
} else {
item.duration = -1;
}
}
- private static MediaItem fill_video_item (VideoItem item,
- File file,
- GUPnPDLNA.Information dlna_info,
- DiscovererVideoInfo video_info,
- DiscovererAudioInfo? audio_info,
- FileInfo file_info) {
- fill_audio_item (item as AudioItem, dlna_info, audio_info);
- fill_media_item (item, file, dlna_info, file_info);
+ private static MediaItem fill_video_item (VideoItem item,
+ File file,
+ DiscovererInfo info,
+ GUPnPDLNA.Profile? profile,
+ DiscovererVideoInfo video_info,
+ DiscovererAudioInfo? audio_info,
+ FileInfo file_info) {
+ fill_audio_item (item as AudioItem, info, audio_info);
+ fill_media_item (item, file, info, profile, file_info);
item.width = (int) video_info.get_width ();
item.height = (int) video_info.get_height ();
return item;
}
- private static MediaItem fill_photo_item (PhotoItem item,
- File file,
- GUPnPDLNA.Information dlna_info,
- DiscovererVideoInfo video_info,
- FileInfo file_info) {
- fill_media_item (item, file, dlna_info, file_info);
+ private static MediaItem fill_photo_item (PhotoItem item,
+ File file,
+ DiscovererInfo info,
+ GUPnPDLNA.Profile? profile,
+ DiscovererVideoInfo video_info,
+ FileInfo file_info) {
+ fill_media_item (item, file, info, profile, file_info);
item.width = (int) video_info.get_width ();
item.height = (int) video_info.get_height ();
return item;
}
- private static MediaItem fill_music_item (MusicItem item,
- File file,
- GUPnPDLNA.Information dlna_info,
- DiscovererAudioInfo? audio_info,
- FileInfo file_info) {
- fill_audio_item (item as AudioItem, dlna_info, audio_info);
- fill_media_item (item, file, dlna_info, file_info);
+ private static MediaItem fill_music_item (MusicItem item,
+ File file,
+ DiscovererInfo info,
+ GUPnPDLNA.Profile? profile,
+ DiscovererAudioInfo? audio_info,
+ FileInfo file_info) {
+ fill_audio_item (item as AudioItem, info, audio_info);
+ fill_media_item (item, file, info, profile, file_info);
if (audio_info == null) {
return item;
}
string artist;
- dlna_info.info.get_tags ().get_string (Tags.ARTIST, out artist);
+ info.get_tags ().get_string (Tags.ARTIST, out artist);
item.artist = artist;
string album;
- dlna_info.info.get_tags ().get_string (Tags.ALBUM, out album);
+ info.get_tags ().get_string (Tags.ALBUM, out album);
item.album = album;
string genre;
- dlna_info.info.get_tags ().get_string (Tags.GENRE, out genre);
+ info.get_tags ().get_string (Tags.GENRE, out genre);
item.genre = genre;
uint tmp;
- dlna_info.info.get_tags ().get_uint (Tags.ALBUM_VOLUME_NUMBER,
- out tmp);
+ info.get_tags ().get_uint (Tags.ALBUM_VOLUME_NUMBER, out tmp);
item.disc = (int) tmp;
- dlna_info.info.get_tags() .get_uint (Tags.TRACK_NUMBER, out tmp);
+ info.get_tags() .get_uint (Tags.TRACK_NUMBER, out tmp);
item.track_number = (int) tmp;
if (audio_info.get_tags () == null) {
return item;
}
- private static void fill_media_item (MediaItem item,
- File file,
- GUPnPDLNA.Information dlna_info,
- FileInfo file_info) {
+ private static void fill_media_item (MediaItem item,
+ File file,
+ DiscovererInfo info,
+ GUPnPDLNA.Profile? profile,
+ FileInfo file_info) {
string title = null;
- if (dlna_info.info.get_tags () == null ||
- !dlna_info.info.get_tags ().get_string (Tags.TITLE, out title)) {
+ if (info.get_tags () == null ||
+ !info.get_tags ().get_string (Tags.TITLE, out title)) {
title = file_info.get_display_name ();
}
item.title = title;
- if (dlna_info.info.get_tags () != null) {
+ if (info.get_tags () != null) {
GLib.Date? date;
- if (dlna_info.info.get_tags ().get_date (Tags.DATE, out date) &&
+ if (info.get_tags ().get_date (Tags.DATE, out date) &&
date.valid ()) {
char[] datestr = new char[30];
date.strftime (datestr, "%F");
item.size = (int64) file_info.get_size ();
item.modified = (int64) mtime;
- if (dlna_info.name != null) {
- item.dlna_profile = dlna_info.name;
- item.mime_type = dlna_info.mime;
+ if (profile != null && profile.name != null) {
+ item.dlna_profile = profile.name;
+ item.mime_type = profile.mime;
} else {
item.mime_type = ContentType.get_mime_type
(file_info.get_content_type ());
using Gst.PbUtils;
using Gee;
using GUPnP;
+using GUPnPDLNA;
/**
* Metadata extractor based on Gstreamer. Just set the URI of the media on the
*/
public class Rygel.MediaExport.MetadataExtractor: GLib.Object {
/* Signals */
- public signal void extraction_done (File file,
- GUPnPDLNA.Information? dlna,
- FileInfo file_info);
+ public signal void extraction_done (File file,
+ DiscovererInfo? info,
+ GUPnPDLNA.Profile? profile,
+ FileInfo file_info);
/**
* Signalize that an error occured during metadata extraction
*/
public signal void error (File file, Error err);
- private GUPnPDLNA.Discoverer discoverer;
+ private Discoverer discoverer;
+ private ProfileGuesser guesser;
+
/**
* We export a GLib.File-based API but GstDiscoverer works with URIs, so
* we store uri->GLib.File mappings in this hashmap, so that we can get
* the GLib.File back from the URI in on_discovered().
*/
private HashMap<string, File> file_hash;
- private uint64 timeout = 10; /* seconds */
+ private uint timeout = 10; /* seconds */
private bool extract_metadata;
public void extract (File file, string content_type) {
if (this.extract_metadata && !content_type.has_prefix ("text/")) {
string uri = file.get_uri ();
- this.file_hash.set (uri, file);
var gst_timeout = (ClockTime) (this.timeout * Gst.SECOND);
- this.discoverer = new GUPnPDLNA.Discoverer (gst_timeout,
- true,
- true);
- this.discoverer.done.connect (on_done);
- this.discoverer.start ();
- this.discoverer.discover_uri (uri);
+ try {
+ this.discoverer = new Discoverer (gst_timeout);
+ this.file_hash.set (uri, file);
+ this.discoverer.discovered.connect (on_done);
+ this.discoverer.start ();
+ this.discoverer.discover_uri_async (uri);
+ this.guesser = new GUPnPDLNA.ProfileGuesser (true, true);
+ } catch (Error error) {
+ this.on_done (null, error);
+ }
} else {
- this.extract_basic_information (file);
+ this.extract_basic_information (file, null, null);
}
}
- private void on_done (GUPnPDLNA.Information dlna,
- GLib.Error err) {
+ private void on_done (DiscovererInfo? info, GLib.Error err) {
this.discoverer = null;
- var file = this.file_hash.get (dlna.info.get_uri ());
+ var file = this.file_hash.get (info.get_uri ());
if (file == null) {
warning ("File %s already handled, ignoring event",
- dlna.info.get_uri ());
+ info.get_uri ());
return;
}
- this.file_hash.unset (dlna.info.get_uri ());
+ this.file_hash.unset (info.get_uri ());
- if ((dlna.info.get_result () & DiscovererResult.TIMEOUT) != 0) {
+ if ((info.get_result () & DiscovererResult.TIMEOUT) != 0) {
debug ("Extraction timed out on %s", file.get_uri ());
// set dlna to null to extract basic file information
- dlna = null;
- } else if ((dlna.info.get_result () &
+ info = null;
+ this.extract_basic_information (file, info, null);
+
+ return;
+ } else if ((info.get_result () &
DiscovererResult.ERROR) != 0) {
this.error (file, err);
return;
}
- this.extract_basic_information (file, dlna);
+ var dlna_info = GUPnPDLNAGst.utils_information_from_discoverer_info (info);
+ var dlna = this.guesser.guess_profile_from_info (dlna_info);
+ this.extract_basic_information (file, info, dlna);
}
private void extract_basic_information
- (File file,
- GUPnPDLNA.Information? dlna = null) {
+ (File file,
+ DiscovererInfo? info,
+ GUPnPDLNA.Profile? dlna) {
try {
FileInfo file_info;
}
this.extraction_done (file,
+ info,
dlna,
file_info);
} catch (Error error) {
}
}
-
private void on_config_changed (Configuration config,
string section,
string key) {