Blame gdata/media/gdata-media-group.c

Packit 4b6dd7
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
Packit 4b6dd7
/*
Packit 4b6dd7
 * GData Client
Packit 4b6dd7
 * Copyright (C) Philip Withnall 2009–2010 <philip@tecnocode.co.uk>
Packit 4b6dd7
 *
Packit 4b6dd7
 * GData Client is free software; you can redistribute it and/or
Packit 4b6dd7
 * modify it under the terms of the GNU Lesser General Public
Packit 4b6dd7
 * License as published by the Free Software Foundation; either
Packit 4b6dd7
 * version 2.1 of the License, or (at your option) any later version.
Packit 4b6dd7
 *
Packit 4b6dd7
 * GData Client is distributed in the hope that it will be useful,
Packit 4b6dd7
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 4b6dd7
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 4b6dd7
 * Lesser General Public License for more details.
Packit 4b6dd7
 *
Packit 4b6dd7
 * You should have received a copy of the GNU Lesser General Public
Packit 4b6dd7
 * License along with GData Client.  If not, see <http://www.gnu.org/licenses/>.
Packit 4b6dd7
 */
Packit 4b6dd7
Packit 4b6dd7
/*
Packit 4b6dd7
 * SECTION:gdata-media-group
Packit 4b6dd7
 * @short_description: Media RSS group element
Packit 4b6dd7
 * @stability: Stable
Packit 4b6dd7
 * @include: gdata/media/gdata-media-group.h
Packit 4b6dd7
 *
Packit 4b6dd7
 * #GDataMediaGroup represents a "group" element from the
Packit 4b6dd7
 * <ulink type="http" url="http://video.search.yahoo.com/mrss">Media RSS specification</ulink>.
Packit 4b6dd7
 *
Packit 4b6dd7
 * It is private API, since implementing classes are likely to proxy the properties and functions
Packit 4b6dd7
 * of #GDataMediaGroup as appropriate; most entry types which implement #GDataMediaGroup have no use
Packit 4b6dd7
 * for most of its properties, and it would be unnecessary and confusing to expose #GDataMediaGroup itself.
Packit 4b6dd7
 *
Packit 4b6dd7
 * For this reason, properties have not been implemented on #GDataMediaGroup (yet).
Packit 4b6dd7
 */
Packit 4b6dd7
Packit 4b6dd7
#include <glib.h>
Packit 4b6dd7
#include <libxml/parser.h>
Packit 4b6dd7
#include <string.h>
Packit 4b6dd7
Packit 4b6dd7
#include "gdata-media-group.h"
Packit 4b6dd7
#include "gdata-parsable.h"
Packit 4b6dd7
#include "gdata-parser.h"
Packit 4b6dd7
#include "gdata-private.h"
Packit 4b6dd7
#include "media/gdata-media-category.h"
Packit 4b6dd7
#include "media/gdata-media-credit.h"
Packit 4b6dd7
#include "media/gdata-media-thumbnail.h"
Packit 4b6dd7
Packit 4b6dd7
static void gdata_media_group_dispose (GObject *object);
Packit 4b6dd7
static void gdata_media_group_finalize (GObject *object);
Packit 4b6dd7
static gboolean parse_xml (GDataParsable *parsable, xmlDoc *doc, xmlNode *node, gpointer user_data, GError **error);
Packit 4b6dd7
static void get_xml (GDataParsable *parsable, GString *xml_string);
Packit 4b6dd7
static void get_namespaces (GDataParsable *parsable, GHashTable *namespaces);
Packit 4b6dd7
Packit 4b6dd7
struct _GDataMediaGroupPrivate {
Packit 4b6dd7
	gchar **keywords;
Packit 4b6dd7
	gchar *player_uri;
Packit 4b6dd7
	GHashTable *restricted_countries;
Packit 4b6dd7
	gchar *simple_rating;
Packit 4b6dd7
	gchar *mpaa_rating;
Packit 4b6dd7
	gchar *v_chip_rating;
Packit 4b6dd7
	GList *thumbnails; /* GDataMediaThumbnail */
Packit 4b6dd7
	gchar *title;
Packit 4b6dd7
	GDataMediaCategory *category;
Packit 4b6dd7
	GList *contents; /* GDataMediaContent */
Packit 4b6dd7
	GDataMediaCredit *credit;
Packit 4b6dd7
	gchar *description;
Packit 4b6dd7
};
Packit 4b6dd7
Packit 4b6dd7
G_DEFINE_TYPE (GDataMediaGroup, gdata_media_group, GDATA_TYPE_PARSABLE)
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
gdata_media_group_class_init (GDataMediaGroupClass *klass)
Packit 4b6dd7
{
Packit 4b6dd7
	GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
Packit 4b6dd7
	GDataParsableClass *parsable_class = GDATA_PARSABLE_CLASS (klass);
Packit 4b6dd7
Packit 4b6dd7
	g_type_class_add_private (klass, sizeof (GDataMediaGroupPrivate));
Packit 4b6dd7
Packit 4b6dd7
	gobject_class->dispose = gdata_media_group_dispose;
Packit 4b6dd7
	gobject_class->finalize = gdata_media_group_finalize;
Packit 4b6dd7
Packit 4b6dd7
	parsable_class->parse_xml = parse_xml;
Packit 4b6dd7
	parsable_class->get_xml = get_xml;
Packit 4b6dd7
	parsable_class->get_namespaces = get_namespaces;
Packit 4b6dd7
	parsable_class->element_name = "group";
Packit 4b6dd7
	parsable_class->element_namespace = "media";
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
gdata_media_group_init (GDataMediaGroup *self)
Packit 4b6dd7
{
Packit 4b6dd7
	self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GDATA_TYPE_MEDIA_GROUP, GDataMediaGroupPrivate);
Packit 4b6dd7
	self->priv->restricted_countries = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
gdata_media_group_dispose (GObject *object)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataMediaGroupPrivate *priv = GDATA_MEDIA_GROUP (object)->priv;
Packit 4b6dd7
Packit 4b6dd7
	if (priv->category != NULL)
Packit 4b6dd7
		g_object_unref (priv->category);
Packit 4b6dd7
	priv->category = NULL;
Packit 4b6dd7
Packit 4b6dd7
	if (priv->credit != NULL)
Packit 4b6dd7
		g_object_unref (priv->credit);
Packit 4b6dd7
	priv->credit = NULL;
Packit 4b6dd7
Packit 4b6dd7
	if (priv->contents != NULL) {
Packit 4b6dd7
		g_list_foreach (priv->contents, (GFunc) g_object_unref, NULL);
Packit 4b6dd7
		g_list_free (priv->contents);
Packit 4b6dd7
	}
Packit 4b6dd7
	priv->contents = NULL;
Packit 4b6dd7
Packit 4b6dd7
	if (priv->thumbnails != NULL) {
Packit 4b6dd7
		g_list_foreach (priv->thumbnails, (GFunc) g_object_unref, NULL);
Packit 4b6dd7
		g_list_free (priv->thumbnails);
Packit 4b6dd7
	}
Packit 4b6dd7
	priv->thumbnails = NULL;
Packit 4b6dd7
Packit 4b6dd7
	/* Chain up to the parent class */
Packit 4b6dd7
	G_OBJECT_CLASS (gdata_media_group_parent_class)->dispose (object);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
gdata_media_group_finalize (GObject *object)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataMediaGroupPrivate *priv = GDATA_MEDIA_GROUP (object)->priv;
Packit 4b6dd7
Packit 4b6dd7
	g_strfreev (priv->keywords);
Packit 4b6dd7
	g_free (priv->player_uri);
Packit 4b6dd7
	g_free (priv->v_chip_rating);
Packit 4b6dd7
	g_free (priv->mpaa_rating);
Packit 4b6dd7
	g_free (priv->simple_rating);
Packit 4b6dd7
	g_hash_table_destroy (priv->restricted_countries);
Packit 4b6dd7
	g_free (priv->title);
Packit 4b6dd7
	g_free (priv->description);
Packit 4b6dd7
Packit 4b6dd7
	/* Chain up to the parent class */
Packit 4b6dd7
	G_OBJECT_CLASS (gdata_media_group_parent_class)->finalize (object);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static gboolean
Packit 4b6dd7
parse_xml (GDataParsable *parsable, xmlDoc *doc, xmlNode *node, gpointer user_data, GError **error)
Packit 4b6dd7
{
Packit 4b6dd7
	gboolean success;
Packit 4b6dd7
	GDataMediaGroup *self = GDATA_MEDIA_GROUP (parsable);
Packit 4b6dd7
Packit 4b6dd7
	if (gdata_parser_is_namespace (node, "http://search.yahoo.com/mrss/") == TRUE) {
Packit 4b6dd7
		if (gdata_parser_string_from_element (node, "title", P_NONE, &(self->priv->title), &success, error) == TRUE ||
Packit 4b6dd7
		    gdata_parser_string_from_element (node, "description", P_NONE, &(self->priv->description), &success, error) == TRUE ||
Packit 4b6dd7
		    gdata_parser_object_from_element_setter (node, "category", P_REQUIRED, GDATA_TYPE_MEDIA_CATEGORY,
Packit 4b6dd7
		                                             gdata_media_group_set_category, self, &success, error) == TRUE ||
Packit 4b6dd7
		    gdata_parser_object_from_element_setter (node, "content", P_REQUIRED, GDATA_TYPE_MEDIA_CONTENT,
Packit 4b6dd7
		                                             _gdata_media_group_add_content, self, &success, error) == TRUE ||
Packit 4b6dd7
		    gdata_parser_object_from_element_setter (node, "thumbnail", P_REQUIRED, GDATA_TYPE_MEDIA_THUMBNAIL,
Packit 4b6dd7
		                                             _gdata_media_group_add_thumbnail, self, &success, error) == TRUE ||
Packit 4b6dd7
		    gdata_parser_object_from_element (node, "credit", P_REQUIRED | P_NO_DUPES, GDATA_TYPE_MEDIA_CREDIT,
Packit 4b6dd7
		                                      &(self->priv->credit), &success, error) == TRUE) {
Packit 4b6dd7
			return success;
Packit 4b6dd7
		} else if (xmlStrcmp (node->name, (xmlChar*) "keywords") == 0) {
Packit 4b6dd7
			/* media:keywords */
Packit 4b6dd7
			guint i;
Packit 4b6dd7
			xmlChar *text = xmlNodeListGetString (node->doc, node->children, TRUE);
Packit 4b6dd7
Packit 4b6dd7
			g_strfreev (self->priv->keywords);
Packit 4b6dd7
			if (text == NULL) {
Packit 4b6dd7
				self->priv->keywords = NULL;
Packit 4b6dd7
				return TRUE;
Packit 4b6dd7
			}
Packit 4b6dd7
Packit 4b6dd7
			self->priv->keywords = g_strsplit ((gchar*) text, ",", -1);
Packit 4b6dd7
			xmlFree (text);
Packit 4b6dd7
Packit 4b6dd7
			for (i = 0; self->priv->keywords[i] != NULL; i++) {
Packit 4b6dd7
				gchar *comma, *start = self->priv->keywords[i];
Packit 4b6dd7
				gchar *end = start + strlen (start);
Packit 4b6dd7
Packit 4b6dd7
				/* Strip any whitespace from the ends of the keyword */
Packit 4b6dd7
				g_strstrip (start);
Packit 4b6dd7
Packit 4b6dd7
				/* Unescape any %2Cs in the keyword to commas in-place */
Packit 4b6dd7
				while ((comma = g_strstr_len (start, -1, "%2C")) != NULL) {
Packit 4b6dd7
					/* Unescape the comma */
Packit 4b6dd7
					*comma = ',';
Packit 4b6dd7
Packit 4b6dd7
					/* Move forwards, skipping the comma */
Packit 4b6dd7
					comma++;
Packit 4b6dd7
					end -= 2;
Packit 4b6dd7
Packit 4b6dd7
					/* Shift the remainder of the string downwards */
Packit 4b6dd7
					g_memmove (comma, comma + 2, end - comma);
Packit 4b6dd7
					*end = '\0';
Packit 4b6dd7
				}
Packit 4b6dd7
			}
Packit 4b6dd7
		} else if (xmlStrcmp (node->name, (xmlChar*) "player") == 0) {
Packit 4b6dd7
			/* media:player */
Packit 4b6dd7
			xmlChar *player_uri = xmlGetProp (node, (xmlChar*) "url");
Packit 4b6dd7
			g_free (self->priv->player_uri);
Packit 4b6dd7
			self->priv->player_uri = (gchar*) player_uri;
Packit 4b6dd7
		} else if (xmlStrcmp (node->name, (xmlChar*) "rating") == 0) {
Packit 4b6dd7
			/* media:rating */
Packit 4b6dd7
			xmlChar *scheme;
Packit 4b6dd7
Packit 4b6dd7
			/* The possible schemes are defined here:
Packit 4b6dd7
			 *  • http://video.search.yahoo.com/mrss
Packit 4b6dd7
			 *  • http://code.google.com/apis/youtube/2.0/reference.html#youtube_data_api_tag_media:rating
Packit 4b6dd7
			 */
Packit 4b6dd7
			scheme = xmlGetProp (node, (xmlChar*) "scheme");
Packit 4b6dd7
Packit 4b6dd7
			if (scheme == NULL || xmlStrcmp (scheme, (xmlChar*) "urn:simple") == 0) {
Packit 4b6dd7
				/* Options: adult, nonadult */
Packit 4b6dd7
				gdata_parser_string_from_element (node, "rating", P_REQUIRED | P_NON_EMPTY, &(self->priv->simple_rating),
Packit 4b6dd7
				                                  &success, error);
Packit 4b6dd7
			} else if (xmlStrcmp (scheme, (xmlChar*) "urn:mpaa") == 0) {
Packit 4b6dd7
				/* Options: g, pg, pg-13, r, nc-17 */
Packit 4b6dd7
				gdata_parser_string_from_element (node, "rating", P_REQUIRED | P_NON_EMPTY, &(self->priv->mpaa_rating),
Packit 4b6dd7
				                                  &success, error);
Packit 4b6dd7
			} else if (xmlStrcmp (scheme, (xmlChar*) "urn:v-chip") == 0) {
Packit 4b6dd7
				/* Options: tv-y, tv-y7, tv-y7-fv, tv-g, tv-pg, tv-14, tv-ma */
Packit 4b6dd7
				gdata_parser_string_from_element (node, "rating", P_REQUIRED | P_NON_EMPTY, &(self->priv->v_chip_rating),
Packit 4b6dd7
				                                  &success, error);
Packit 4b6dd7
			} else if (xmlStrcmp (scheme, (xmlChar*) "http://gdata.youtube.com/schemas/2007#mediarating") == 0) {
Packit 4b6dd7
				/* No content, but we do get a list of countries. There's nothing like overloading the semantics of XML elements
Packit 4b6dd7
				 * to brighten up one's day. */
Packit 4b6dd7
				xmlChar *countries;
Packit 4b6dd7
Packit 4b6dd7
				countries = xmlGetProp (node, (xmlChar*) "country");
Packit 4b6dd7
Packit 4b6dd7
				if (countries != NULL) {
Packit 4b6dd7
					gchar **country_list, **country;
Packit 4b6dd7
Packit 4b6dd7
					/* It's either a comma-separated list of countries, or the value "all" */
Packit 4b6dd7
					country_list = g_strsplit ((const gchar*) countries, ",", -1);
Packit 4b6dd7
					xmlFree (countries);
Packit 4b6dd7
Packit 4b6dd7
					/* Add all the listed countries to the restricted countries table */
Packit 4b6dd7
					for (country = country_list; *country != NULL; country++) {
Packit 4b6dd7
						g_hash_table_insert (self->priv->restricted_countries, *country, GUINT_TO_POINTER (TRUE));
Packit 4b6dd7
					}
Packit 4b6dd7
Packit 4b6dd7
					g_free (country_list);
Packit 4b6dd7
				} else {
Packit 4b6dd7
					/* Assume it's restricted in all countries */
Packit 4b6dd7
					g_hash_table_insert (self->priv->restricted_countries, g_strdup ("all"), GUINT_TO_POINTER (TRUE));
Packit 4b6dd7
				}
Packit 4b6dd7
Packit 4b6dd7
				success = TRUE;
Packit 4b6dd7
			} else {
Packit 4b6dd7
				/* Error */
Packit 4b6dd7
				gdata_parser_error_unknown_property_value (node, "scheme", (gchar*) scheme, error);
Packit 4b6dd7
				success = FALSE;
Packit 4b6dd7
			}
Packit 4b6dd7
Packit 4b6dd7
			xmlFree (scheme);
Packit 4b6dd7
Packit 4b6dd7
			return success;
Packit 4b6dd7
		} else if (xmlStrcmp (node->name, (xmlChar*) "restriction") == 0) {
Packit 4b6dd7
			/* media:restriction */
Packit 4b6dd7
			xmlChar *type, *countries, *relationship;
Packit 4b6dd7
			gchar **country_list, **country;
Packit 4b6dd7
			gboolean relationship_bool;
Packit 4b6dd7
Packit 4b6dd7
			/* Check the type property is "country" */
Packit 4b6dd7
			type = xmlGetProp (node, (xmlChar*) "type");
Packit 4b6dd7
			if (xmlStrcmp (type, (xmlChar*) "country") != 0) {
Packit 4b6dd7
				gdata_parser_error_unknown_property_value (node, "type", (gchar*) type, error);
Packit 4b6dd7
				xmlFree (type);
Packit 4b6dd7
				return FALSE;
Packit 4b6dd7
			}
Packit 4b6dd7
			xmlFree (type);
Packit 4b6dd7
Packit 4b6dd7
			relationship = xmlGetProp (node, (xmlChar*) "relationship");
Packit 4b6dd7
			if (xmlStrcmp (relationship, (xmlChar*) "allow") == 0) {
Packit 4b6dd7
				relationship_bool = FALSE; /* it's *not* a restricted country */
Packit 4b6dd7
			} else if (xmlStrcmp (relationship, (xmlChar*) "deny") == 0) {
Packit 4b6dd7
				relationship_bool = TRUE; /* it *is* a restricted country */
Packit 4b6dd7
			} else {
Packit 4b6dd7
				gdata_parser_error_unknown_property_value (node, "relationship", (gchar*) relationship, error);
Packit 4b6dd7
				xmlFree (relationship);
Packit 4b6dd7
				return FALSE;
Packit 4b6dd7
			}
Packit 4b6dd7
			xmlFree (relationship);
Packit 4b6dd7
Packit 4b6dd7
			countries = xmlNodeListGetString (doc, node->children, TRUE);
Packit 4b6dd7
			country_list = g_strsplit ((const gchar*) countries, " ", -1);
Packit 4b6dd7
			xmlFree (countries);
Packit 4b6dd7
Packit 4b6dd7
			/* Add "all" to the table, since it's an exception table */
Packit 4b6dd7
			g_hash_table_insert (self->priv->restricted_countries, g_strdup ("all"), GUINT_TO_POINTER (!relationship_bool));
Packit 4b6dd7
Packit 4b6dd7
			/* Add all the listed countries to the restricted countries table */
Packit 4b6dd7
			for (country = country_list; *country != NULL; country++)
Packit 4b6dd7
				g_hash_table_insert (self->priv->restricted_countries, *country, GUINT_TO_POINTER (relationship_bool));
Packit 4b6dd7
			g_free (country_list);
Packit 4b6dd7
		} else {
Packit 4b6dd7
			return GDATA_PARSABLE_CLASS (gdata_media_group_parent_class)->parse_xml (parsable, doc, node, user_data, error);
Packit 4b6dd7
		}
Packit 4b6dd7
	} else {
Packit 4b6dd7
		return GDATA_PARSABLE_CLASS (gdata_media_group_parent_class)->parse_xml (parsable, doc, node, user_data, error);
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	return TRUE;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
get_xml (GDataParsable *parsable, GString *xml_string)
Packit 4b6dd7
{
Packit 4b6dd7
	GDataMediaGroupPrivate *priv = GDATA_MEDIA_GROUP (parsable)->priv;
Packit 4b6dd7
Packit 4b6dd7
	/* Media category */
Packit 4b6dd7
	if (priv->category != NULL)
Packit 4b6dd7
		_gdata_parsable_get_xml (GDATA_PARSABLE (priv->category), xml_string, FALSE);
Packit 4b6dd7
Packit 4b6dd7
	if (priv->title != NULL)
Packit 4b6dd7
		gdata_parser_string_append_escaped (xml_string, "<media:title type='plain'>", priv->title, "</media:title>");
Packit 4b6dd7
Packit 4b6dd7
	if (priv->description != NULL)
Packit 4b6dd7
		gdata_parser_string_append_escaped (xml_string, "<media:description type='plain'>", priv->description, "</media:description>");
Packit 4b6dd7
Packit 4b6dd7
	if (priv->keywords != NULL) {
Packit 4b6dd7
		guint i;
Packit 4b6dd7
Packit 4b6dd7
		g_string_append (xml_string, "<media:keywords>");
Packit 4b6dd7
Packit 4b6dd7
		/* Add each keyword to the text content, comma-separated from the previous one */
Packit 4b6dd7
		for (i = 0; priv->keywords[i] != NULL; i++) {
Packit 4b6dd7
			const gchar *comma, *start = priv->keywords[i];
Packit 4b6dd7
Packit 4b6dd7
			/* Delimit the previous keyword */
Packit 4b6dd7
			if (i != 0)
Packit 4b6dd7
				g_string_append_c (xml_string, ',');
Packit 4b6dd7
Packit 4b6dd7
			/* Escape any commas in the keyword to %2C */
Packit 4b6dd7
			while ((comma = g_utf8_strchr (start, -1, ',')) != NULL) {
Packit 4b6dd7
				/* Copy the span */
Packit 4b6dd7
				gchar *span = g_strndup (start, comma - start);
Packit 4b6dd7
				gdata_parser_string_append_escaped (xml_string, NULL, span, NULL);
Packit 4b6dd7
				g_free (span);
Packit 4b6dd7
Packit 4b6dd7
				/* Add an escaped comma */
Packit 4b6dd7
				g_string_append (xml_string, "%2C");
Packit 4b6dd7
Packit 4b6dd7
				/* Move forwards, skipping the comma */
Packit 4b6dd7
				start = comma + 1;
Packit 4b6dd7
			}
Packit 4b6dd7
Packit 4b6dd7
			/* Append the rest of the string (the entire string if there were no commas) */
Packit 4b6dd7
			gdata_parser_string_append_escaped (xml_string, NULL, start, NULL);
Packit 4b6dd7
		}
Packit 4b6dd7
Packit 4b6dd7
		g_string_append (xml_string, "</media:keywords>");
Packit 4b6dd7
	}
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static void
Packit 4b6dd7
get_namespaces (GDataParsable *parsable, GHashTable *namespaces)
Packit 4b6dd7
{
Packit 4b6dd7
	g_hash_table_insert (namespaces, (gchar*) "media", (gchar*) "http://search.yahoo.com/mrss/");
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_media_group_get_title:
Packit 4b6dd7
 * @self: a #GDataMediaGroup
Packit 4b6dd7
 *
Packit 4b6dd7
 * Gets the #GDataMediaGroup:title property.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: the group's title, or %NULL
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.4.0
Packit 4b6dd7
 */
Packit 4b6dd7
const gchar *
Packit 4b6dd7
gdata_media_group_get_title (GDataMediaGroup *self)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_MEDIA_GROUP (self), NULL);
Packit 4b6dd7
	return self->priv->title;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_media_group_set_title:
Packit 4b6dd7
 * @self: a #GDataMediaGroup
Packit 4b6dd7
 * @title: (allow-none): the group's new title, or %NULL
Packit 4b6dd7
 *
Packit 4b6dd7
 * Sets the #GDataMediaGroup:title property to @title.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Set @title to %NULL to unset the property.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.4.0
Packit 4b6dd7
 */
Packit 4b6dd7
void
Packit 4b6dd7
gdata_media_group_set_title (GDataMediaGroup *self, const gchar *title)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_if_fail (GDATA_IS_MEDIA_GROUP (self));
Packit 4b6dd7
	g_free (self->priv->title);
Packit 4b6dd7
	self->priv->title = g_strdup (title);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_media_group_get_description:
Packit 4b6dd7
 * @self: a #GDataMediaGroup
Packit 4b6dd7
 *
Packit 4b6dd7
 * Gets the #GDataMediaGroup:description property.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: the group's description, or %NULL
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.4.0
Packit 4b6dd7
 */
Packit 4b6dd7
const gchar *
Packit 4b6dd7
gdata_media_group_get_description (GDataMediaGroup *self)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_MEDIA_GROUP (self), NULL);
Packit 4b6dd7
	return self->priv->description;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_media_group_set_description:
Packit 4b6dd7
 * @self: a #GDataMediaGroup
Packit 4b6dd7
 * @description: (allow-none): the group's new description, or %NULL
Packit 4b6dd7
 *
Packit 4b6dd7
 * Sets the #GDataMediaGroup:description property to @description.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Set @description to %NULL to unset the property.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.4.0
Packit 4b6dd7
 */
Packit 4b6dd7
void
Packit 4b6dd7
gdata_media_group_set_description (GDataMediaGroup *self, const gchar *description)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_if_fail (GDATA_IS_MEDIA_GROUP (self));
Packit 4b6dd7
	g_free (self->priv->description);
Packit 4b6dd7
	self->priv->description = g_strdup (description);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_media_group_get_keywords:
Packit 4b6dd7
 * @self: a #GDataMediaGroup
Packit 4b6dd7
 *
Packit 4b6dd7
 * Gets the #GDataMediaGroup:keywords property.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: (array zero-terminated=1): a %NULL-terminated array of the group's keywords, or %NULL
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.4.0
Packit 4b6dd7
 */
Packit 4b6dd7
const gchar * const *
Packit 4b6dd7
gdata_media_group_get_keywords (GDataMediaGroup *self)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_MEDIA_GROUP (self), NULL);
Packit 4b6dd7
	return (const gchar * const *) self->priv->keywords;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_media_group_set_keywords:
Packit 4b6dd7
 * @self: a #GDataMediaGroup
Packit 4b6dd7
 * @keywords: (array zero-terminated=1) (allow-none): a %NULL-terminated array of the group's new keywords, or %NULL
Packit 4b6dd7
 *
Packit 4b6dd7
 * Sets the #GDataMediaGroup:keywords property to @keywords.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Set @keywords to %NULL to unset the property.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Since: 0.4.0
Packit 4b6dd7
 */
Packit 4b6dd7
void
Packit 4b6dd7
gdata_media_group_set_keywords (GDataMediaGroup *self, const gchar * const *keywords)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_if_fail (GDATA_IS_MEDIA_GROUP (self));
Packit 4b6dd7
	g_strfreev (self->priv->keywords);
Packit 4b6dd7
	self->priv->keywords = g_strdupv ((gchar**) keywords);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_media_group_get_category:
Packit 4b6dd7
 * @self: a #GDataMediaGroup
Packit 4b6dd7
 *
Packit 4b6dd7
 * Gets the #GDataMediaGroup:category property.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: a #GDataMediaCategory giving the group's category, or %NULL
Packit 4b6dd7
 */
Packit 4b6dd7
GDataMediaCategory *
Packit 4b6dd7
gdata_media_group_get_category (GDataMediaGroup *self)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_MEDIA_GROUP (self), NULL);
Packit 4b6dd7
	return self->priv->category;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_media_group_set_category:
Packit 4b6dd7
 * @self: a #GDataMediaGroup
Packit 4b6dd7
 * @category: (allow-none): a new #GDataMediaCategory, or %NULL
Packit 4b6dd7
 *
Packit 4b6dd7
 * Sets the #GDataMediaGroup:category property to @category, and increments its reference count.
Packit 4b6dd7
 */
Packit 4b6dd7
void
Packit 4b6dd7
gdata_media_group_set_category (GDataMediaGroup *self, GDataMediaCategory *category)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_if_fail (GDATA_IS_MEDIA_GROUP (self));
Packit 4b6dd7
	g_return_if_fail (category == NULL || GDATA_IS_MEDIA_CATEGORY (category));
Packit 4b6dd7
Packit 4b6dd7
	if (self->priv->category != NULL)
Packit 4b6dd7
		g_object_unref (self->priv->category);
Packit 4b6dd7
	self->priv->category = (category == NULL) ? NULL : g_object_ref (category);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
static gint
Packit 4b6dd7
content_compare_cb (const GDataMediaContent *content, const gchar *type)
Packit 4b6dd7
{
Packit 4b6dd7
	return strcmp (gdata_media_content_get_content_type ((GDataMediaContent*) content), type);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_media_group_look_up_content:
Packit 4b6dd7
 * @self: a #GDataMediaGroup
Packit 4b6dd7
 * @type: the MIME type of the content desired
Packit 4b6dd7
 *
Packit 4b6dd7
 * Looks up a #GDataMediaContent from the group with the given MIME type. The group's list of contents is
Packit 4b6dd7
 * a list of URIs to various formats of the group content itself, such as the SWF URI or RTSP stream for a video.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: (transfer none): a #GDataMediaContent matching @type, or %NULL
Packit 4b6dd7
 */
Packit 4b6dd7
GDataMediaContent *
Packit 4b6dd7
gdata_media_group_look_up_content (GDataMediaGroup *self, const gchar *type)
Packit 4b6dd7
{
Packit 4b6dd7
	GList *element;
Packit 4b6dd7
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_MEDIA_GROUP (self), NULL);
Packit 4b6dd7
	g_return_val_if_fail (type != NULL, NULL);
Packit 4b6dd7
Packit 4b6dd7
	/* TODO: If type is required, and is unique, the contents can be stored in a hash table rather than a linked list */
Packit 4b6dd7
	element = g_list_find_custom (self->priv->contents, type, (GCompareFunc) content_compare_cb);
Packit 4b6dd7
	if (element == NULL)
Packit 4b6dd7
		return NULL;
Packit 4b6dd7
	return GDATA_MEDIA_CONTENT (element->data);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_media_group_get_contents:
Packit 4b6dd7
 * @self: a #GDataMediaGroup
Packit 4b6dd7
 *
Packit 4b6dd7
 * Returns a list of #GDataMediaContents, giving the content enclosed by the group.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: (element-type GData.MediaContent) (transfer none): a #GList of #GDataMediaContents,  or %NULL
Packit 4b6dd7
 */
Packit 4b6dd7
GList *
Packit 4b6dd7
gdata_media_group_get_contents (GDataMediaGroup *self)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_MEDIA_GROUP (self), NULL);
Packit 4b6dd7
	return self->priv->contents;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
void
Packit 4b6dd7
_gdata_media_group_add_content (GDataMediaGroup *self, GDataMediaContent *content)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_if_fail (GDATA_IS_MEDIA_GROUP (self));
Packit 4b6dd7
	g_return_if_fail (GDATA_IS_MEDIA_CONTENT (content));
Packit 4b6dd7
	self->priv->contents = g_list_prepend (self->priv->contents, g_object_ref (content));
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_media_group_get_credit:
Packit 4b6dd7
 * @self: a #GDataMediaGroup
Packit 4b6dd7
 *
Packit 4b6dd7
 * Gets the #GDataMediaGroup:credit property.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: a #GDataMediaCredit giving information on whom to credit for the media group, or %NULL
Packit 4b6dd7
 */
Packit 4b6dd7
GDataMediaCredit *
Packit 4b6dd7
gdata_media_group_get_credit (GDataMediaGroup *self)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_MEDIA_GROUP (self), NULL);
Packit 4b6dd7
	return self->priv->credit;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
void
Packit 4b6dd7
_gdata_media_group_set_credit (GDataMediaGroup *self, GDataMediaCredit *credit)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_if_fail (GDATA_IS_MEDIA_GROUP (self));
Packit 4b6dd7
	g_return_if_fail (credit == NULL ||GDATA_IS_MEDIA_CREDIT (credit));
Packit 4b6dd7
Packit 4b6dd7
	if (self->priv->credit != NULL)
Packit 4b6dd7
		g_object_unref (self->priv->credit);
Packit 4b6dd7
	self->priv->credit = g_object_ref (credit);
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_media_group_get_media_group:
Packit 4b6dd7
 * @self: a #GDataMediaGroup
Packit 4b6dd7
 *
Packit 4b6dd7
 * Gets the #GDataMediaGroup:player-uri property.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: a URI where the media group is playable in a web browser, or %NULL
Packit 4b6dd7
 */
Packit 4b6dd7
const gchar *
Packit 4b6dd7
gdata_media_group_get_player_uri (GDataMediaGroup *self)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_MEDIA_GROUP (self), NULL);
Packit 4b6dd7
	return self->priv->player_uri;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_media_group_is_restricted_in_country:
Packit 4b6dd7
 * @self: a #GDataMediaGroup
Packit 4b6dd7
 * @country: an ISO 3166 two-letter country code to check
Packit 4b6dd7
 *
Packit 4b6dd7
 * Checks whether viewing of the media is restricted in @country, either by its content rating, or by the request of the producer.
Packit 4b6dd7
 * The return value from this function is purely informational, and no obligation is assumed.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: %TRUE if the media is restricted in @country, %FALSE otherwise
Packit 4b6dd7
 */
Packit 4b6dd7
gboolean
Packit 4b6dd7
gdata_media_group_is_restricted_in_country (GDataMediaGroup *self, const gchar *country)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_MEDIA_GROUP (self), FALSE);
Packit 4b6dd7
	g_return_val_if_fail (country != NULL && *country != '\0', FALSE);
Packit 4b6dd7
Packit 4b6dd7
	if (GPOINTER_TO_UINT (g_hash_table_lookup (self->priv->restricted_countries, country)) == TRUE)
Packit 4b6dd7
		return TRUE;
Packit 4b6dd7
Packit 4b6dd7
	return GPOINTER_TO_UINT (g_hash_table_lookup (self->priv->restricted_countries, "all"));
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_media_group_get_media_rating:
Packit 4b6dd7
 * @self: a #GDataMediaGroup
Packit 4b6dd7
 * @rating_type: the type of rating to retrieve
Packit 4b6dd7
 *
Packit 4b6dd7
 * Returns the rating of the given type for the media, if one exists. For example, this could be a film rating awarded by the MPAA.
Packit 4b6dd7
 * The valid values for @rating_type are: simple, mpaa and
Packit 4b6dd7
 * v-chip.
Packit 4b6dd7
 *
Packit 4b6dd7
 * The rating values returned for each of these rating types are string as defined in the
Packit 4b6dd7
 * <ulink type="http" url="http://code.google.com/apis/youtube/2.0/reference.html#youtube_data_api_tag_media:rating">YouTube documentation</ulink> and
Packit 4b6dd7
 * <ulink type="http" url="http://video.search.yahoo.com/mrss">MRSS specification</ulink>.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: rating for the given rating type, or %NULL if the media has no rating for that type (or the type is invalid)
Packit 4b6dd7
 */
Packit 4b6dd7
const gchar *
Packit 4b6dd7
gdata_media_group_get_media_rating (GDataMediaGroup *self, const gchar *rating_type)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_MEDIA_GROUP (self), NULL);
Packit 4b6dd7
	g_return_val_if_fail (rating_type != NULL && *rating_type != '\0', NULL);
Packit 4b6dd7
Packit 4b6dd7
	if (strcmp (rating_type, "simple") == 0) {
Packit 4b6dd7
		return self->priv->simple_rating;
Packit 4b6dd7
	} else if (strcmp (rating_type, "mpaa") == 0) {
Packit 4b6dd7
		return self->priv->mpaa_rating;
Packit 4b6dd7
	} else if (strcmp (rating_type, "v-chip") == 0) {
Packit 4b6dd7
		return self->priv->v_chip_rating;
Packit 4b6dd7
	}
Packit 4b6dd7
Packit 4b6dd7
	return NULL;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
/**
Packit 4b6dd7
 * gdata_media_group_get_thumbnails:
Packit 4b6dd7
 * @self: a #GDataMediaGroup
Packit 4b6dd7
 *
Packit 4b6dd7
 * Gets a list of the thumbnails available for the group.
Packit 4b6dd7
 *
Packit 4b6dd7
 * Return value: (element-type GData.MediaThumbnail) (transfer none): a #GList of #GDataMediaThumbnails, or %NULL
Packit 4b6dd7
 */
Packit 4b6dd7
GList *
Packit 4b6dd7
gdata_media_group_get_thumbnails (GDataMediaGroup *self)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_val_if_fail (GDATA_IS_MEDIA_GROUP (self), NULL);
Packit 4b6dd7
	return self->priv->thumbnails;
Packit 4b6dd7
}
Packit 4b6dd7
Packit 4b6dd7
void
Packit 4b6dd7
_gdata_media_group_add_thumbnail (GDataMediaGroup *self, GDataMediaThumbnail *thumbnail)
Packit 4b6dd7
{
Packit 4b6dd7
	g_return_if_fail (GDATA_IS_MEDIA_GROUP (self));
Packit 4b6dd7
	g_return_if_fail (GDATA_IS_MEDIA_THUMBNAIL (thumbnail));
Packit 4b6dd7
	self->priv->thumbnails = g_list_prepend (self->priv->thumbnails, g_object_ref (thumbnail));
Packit 4b6dd7
}