En este articulo vamos a observar lo fácil que es conectar nuestras aplicaciones en .NET con una cuenta de Youtube para subir, administrar y eliminar vídeos.

Inicialmente entraremos a la siguiente página http://developers.google.com/youtube/2.0/developers_guide_dotnet donde encontraremos toda la documentación que provee la API. Como lo explica la guía inicial, debemos descargar la librería cliente para obtener las DLLs necesarias.

Descargamos la última versión.

Google Data API 

Después de descargada e instalada procederemos a buscar las DLLS que necesitaremos para este ejemplo:

  • Google.GData.Client.dll
  • Google.GData.Extensions.dll
  • Google.GData.YouTube.dll

Estas se pueden encontrar en la ruta donde lo hayamos instalado (Carpeta Redist), en mi caso es la siguiente.

C:\Program Files (x86)\Google\Google Data API SDK\Redist

En nuestra aplicación debemos pegar estas DLLs en la carpeta Bin (ubicada en la raíz de nuestro proyecto web), si no existe debemos crearla.

Carpeta Bin

En la carpeta App_Code vamos a crear nuestra Clase administradora de nuestra cuenta de Youtube, la cual llamaré YoutubeManager.

Crear Clase

Nombre de la Clase

Las referencias que vamos a necesitar en nuestra Clase serían

  1. using Google.GData.Client;
  2. using Google.GData.Extensions;
  3. using Google.GData.Extensions.Location;
  4. using Google.GData.Extensions.MediaRss;
  5. using Google.GData.YouTube;
  6. using Google.YouTube;

Para administrar nuestra cuenta de Youtube es necesario obtener una clave de desarrollador y crear una aplicación, entrando a la página https://code.google.com/apis/youtube/dashboard.

Click en nuevo Producto y llenamos los campos. Guardamos y automáticamente obtendremos nuestra clave de desarrollador.

image

Mi recomendación es que el nombre del producto sea igual al del Canal en Youtube.

Mi canal Youtube

Nombre del Canal en Youtube

Continuando con nuestra Clase YoutubeManager, el constructor será como el siguiente. 

  1. private YouTubeRequest youtubeRequest;
  2. private string accountName;
  3.  
  4. public YoutubeManager()
  5. {
  6.    accountName = applicationName;
  7.    youtubeRequest = new YouTubeRequest(new YouTubeRequestSettings(applicationName, developerKey, userName, passWord));
  8. }

Donde

  • applicationName lo reemplazamos por el nombre del Canal.
  • developerKey lo reemplazamos por la clave de desarrollador.
  • userName lo reemplazamos por el email de la cuenta.
  • passWord lo reemplazamos por la clave de la cuenta.

Ahora ya tenemos todo lo necesario para administrar nuestros vídeos en Youtube, procederé a dar algunos ejemplos

  • Seleccionar un Video subido a Youtube por el ID
  1. publicVideo GetVideo(string videoId)
  2.     {
  3.         Feed<Video> feed = youtubeRequest.Get<Video>(new Uri(string.Format("http://gdata.youtube.com/feeds/api/users/{0}/uploads", accountName)));
  4.         return feed.Entries.FirstOrDefault((Video x) => x.VideoId == videoId);
  5.     }
  • Seleccionar un Video Público de Youtube por el ID 
  1. public Video GetPublicVideo(string videoId)
  2.     {
  3.         Feed<Video> feed = youtubeRequest.Get<Video>(new YouTubeQuery("http://gdata.youtube.com/feeds/api/videos")
  4.         {
  5.             Query = videoId,
  6.             SafeSearch = YouTubeQuery.SafeSearchValues.None
  7.         });
  8.         return feed.Entries.FirstOrDefault((Video x) => x.VideoId == videoId);
  9.     }
  •  Obtener la URL de la imagen previa del Video en Youtube 
  1. public string GetImageVideo(string videoId, string size)
  2.     {
  3.         //size 0 = Grande, 1 = Medio, 2 = Pequeo
  4.         return string.Format("http://img.youtube.com/vi/{0}/{1}.jpg", videoId, size);
  5.     }
  •  Obtener ID de un Video en Youtube mediante la URL 
  1. public string GetIdByUrl(string url)
  2.     {
  3.         System.Text.RegularExpressions.Match match = System.Text.RegularExpressions.Regex.Match(url, "v=[a-zA-Z0-9_-]*&{0}");
  4.         if (match.Success)
  5.         {
  6.             return match.Value.Replace("v=", "");
  7.         }
  8.         return url;
  9.     }
  •  Obtener URL del Video en Youtube 
  1. publicstring GetWatchVideoUrl(string videoId)
  2. {
  3.     returnstring.Format("http://www.youtube.com/watch?v={0}", videoId);
  4. }
  •  Obtener URL del Video en Youtube en Pantalla completa y con reproducción automática 
  1. public string GetAutoPlayVideoUrl(string videoId)
  2. {
  3.     return string.Format("http://www.youtube.com/v/{0}&autoplay=1", videoId);
  4. }
  •  Eliminar un Video de Youtube 
  1. public void DeleteVideo(string videoId)
  2. {
  3.     Video video = GetVideo(videoId);
  4.     if (video != null)
  5.     {
  6.         youtubeRequest.Delete<Video>(video);
  7.     }
  8. }

 

  • Actualizar la privacidad de un Video

En Youtube los Vídeos pueden tener 3 tipos diferentes de privacidad. Públicos los puede ver cualquiera, Privados los puedes ver tú y hasta otras 50 personas que invites a ver el Vídeo y No listados los puede ver cualquiera que tenga el vínculo al Vídeo.

Para configurar el control de acceso 

  1. private static Video SetAcessControl(Video video, string type, string permission)
  2. {
  3.     var exts = video.YouTubeEntry.ExtensionElements
  4.                     .Where(x => x is XmlExtension)
  5.                     .Select(x => x as XmlExtension)
  6.                     .Where(x => x.Node.Attributes != null && x.Node.Attributes["action"] != null && x.Node.Attributes["action"].InnerText == type);
  7.     var ext = exts.FirstOrDefault();
  8.     if (ext != null) ext.Node.Attributes["permission"].InnerText = permission;
  9.     return video;
  10. }

Públicos 

  1. Video video = GetVideo(videoId);
  2. if (video != null)
  3. {
  4.     video.Private = false;
  5.     video = SetAcessControl(video, "list", "allowed");
  6.     video = SetAcessControl(video, "comment", "allowed");
  7.     video = SetAcessControl(video, "commentVote", "allowed");
  8.     video = SetAcessControl(video, "videoRespond", "allowed");
  9.     video = SetAcessControl(video, "rate", "allowed");
  10.     youtubeRequest.Update<Video>(video);
  11. }

Privados 

  1. Video video = GetVideo(videoId);
  2. if (video != null)
  3. {
  4.     video.Private = true;
  5.     video = SetAcessControl(video, "list", "allowed");
  6.     video = SetAcessControl(video, "comment", "allowed");
  7.     video = SetAcessControl(video, "commentVote", "allowed");
  8.     video = SetAcessControl(video, "videoRespond", "allowed");
  9.     video = SetAcessControl(video, "rate", "allowed");
  10.     youtubeRequest.Update<Video>(video);
  11. }

No Listados 

  1. Video video = GetVideo(videoId);
  2. if (video != null)
  3. {
  4.     video.Private = false;
  5.     video = SetAcessControl(video, "list", "denied");
  6.     video = SetAcessControl(video, "comment", "denied");
  7.     video = SetAcessControl(video, "commentVote", "denied");
  8.     video = SetAcessControl(video, "videoRespond", "denied");
  9.     video = SetAcessControl(video, "rate", "denied");
  10.     youtubeRequest.Update<Video>(video);
  11. }
  • Subir un Video a Youtube 
  1. public Video DirectUpload(string title, string description, string filePath, double latitude, double longitude, bool isprivate)
  2. {
  3.     Video video = newVideo();
  4.     video.Title = title;
  5.     video.Tags.Add(new MediaCategory("Entertainment", "http://gdata.youtube.com/schemas/2007/categories.cat"));
  6.     video.Description = description;
  7.     video.YouTubeEntry.Private = isprivate;
  8.     video.YouTubeEntry.Location = new GeoRssWhere(latitude, longitude);
  9.     video.YouTubeEntry.MediaSource = new MediaFileSource(filePath, "video/quicktime");
  10.     Video result;
  11.     try
  12.     {
  13.         result = youtubeRequest.Upload(video);
  14.     }
  15.     catch
  16.     {
  17.         result = null;
  18.     }
  19.     return result;
  20. }

Teniendo el Stream del archivo 

  1. public Video DirectUpload(string title, string description, string filePath, double latitude, double longitude, bool isprivate, System.IO.Stream data)
  2. {
  3.     Video video = newVideo();
  4.     video.Title = title;
  5.     video.Tags.Add(new MediaCategory("Entertainment", "http://gdata.youtube.com/schemas/2007/categories.cat"));
  6.     video.Description = description;
  7.     video.YouTubeEntry.Private = isprivate;
  8.     video.YouTubeEntry.Location = new GeoRssWhere(latitude, longitude);
  9.     video.YouTubeEntry.MediaSource = new MediaFileSource(data, filePath, "video/quicktime");
  10.     Video result;
  11.     try
  12.     {
  13.         result = youtubeRequest.Upload(video);
  14.     }
  15.     catch
  16.     {
  17.         result = null;
  18.     }
  19.     return result;
  20. }