Cet article est publié sous licence CC BY-NC-SA
Nous avons pu voir, dans un précédent article, qu’il était possible de gérer les fichiers sons d’une application Rails en utilisant Soundcloud, et son API.
Un autre type de fichier peut également être géré via un site tiers : les vidéos. Plutôt que de stocker celles-ci sur votre serveur, il est possible de le faire directement sur Youtube, ce qui vous fera économiser de la place, de la bande passante, et vous permettra d’utiliser certaines fonctionnalités sans avoir à les redévelopper par vous-même.
Une gem est disponible afin de faciliter l’utilisation de Youtube. Cette dernière permet de connecter un utilisateur à son compte Youtube, d’uploader des vidéos, de faire des recherches ou encore d’ajouter un commentaire par exemple.
Afin de pouvoir utiliser cette gem, il y a quelques pré-requis : avoir un compte Google et une developer key. Ensuite, il suffit d’ajouter la ligne suivante à votre Gemfile :
gem 'youtube_it'
Enfin, il faut ajouter un require de cette gem dans votre application avant de pouvoir l’utiliser (dans le controller où sera utilisé la gem pour l’upload par exemple) :
require 'youtube_it'
Maintenant, à vous de jouer, il ne reste plus qu’à l’utiliser.
Il existe différentes façon de récupérer le compte client d’un utilisateur. Cependant, dans tous les cas il vous faudra une developer key qu’il est possible de récupérer auprès de Google.
Le premier mode de connexion, qui est pour moi le plus simple à mettre en place, consiste à demander à l’utilisateur de votre application ses informations de connexion (son nom d’utilisateur et son mot de passe) Youtube. Ensuite, afin d’établir la connexion, il suffit d’utiliser la méthode suivante :
client = YouTubeIt::Client.new(username: "youtube_username", password: "youtube_password", dev_key: "app_developer_key")
Dans ce cas, vous pourrez ensuite utiliser le compte client pour uploader des vidéos, effectuer des recherches ou encore utilisez les fonctions “sociales” (“like”, commentaires…) par exemple. Afin de pouvoir réutiliser ce compte sans redemander sans cesse les informations de connexion de l’utilisateur, stockez le ou bien stockez les informations de connexion (en variable de session par exemple).
La deuxième méthode consiste à utiliser OAuth2. Dans ce cas, la procédure s’apparente à celle que nous avons déjà vu pour intégrer les réseaux sociaux dans son application Ruby on Rails.
Il vous faut enregistrer votre application auprès Youtube pour obtenir un client_id et un client_secret. La developer key sera également nécessaire, tout comme les access_token et refresh_token, qui sont récupérables via un appel à l’api. Plus d’informations sont disponibles sur le wiki traitant que OAuth2 et Youtube.
Une fois ces informations récupérées, il suffit d’utiliser la méthode suivante :
client = YouTubeIt::OAuth2Client.new(client_access_token: "access_token", client_refresh_token: "refresh_token", client_id: "client_id", client_secret: "client_secret", dev_key: "developer_key", expires_at: "expiration time")
Attention, le access_token n’est valable que pendant une heure. Pensez donc à rafraîchir ce dernier via la commande :
client.refresh_access_token!
Il est préférable d’utiliser cette méthode si vous souhaitez utiliser le compte utilisateur Youtube pour effectuer plusieurs opérations.
Une autre méthode consiste à utiliser uniquement la developer key afin de vous connecter à un compte Youtube mais dans ce cas, ce n’est pas un compte client qui est récupéré mais un compte générique qui réduit les possibilités d’usage (impossible de récupérer les vidéos du compte par exemple puisque c’est un compte générique. Pour vous connecter, utilisez la méthode suivante :
client = YouTubeIt::Client.new(:dev_key => "developer_key")
Hormis avec le dernier cas de figure, il est possible de récupérer les informations du compte de l’utilisateur grâce à la méthode profile ou encore les vidéos favorites avec favorites :
client.profile # retourne des informatins telles que le nom, le prénom, la date de dernière connexion
client.favorites # retourne les vidéos notées comme "favorites" de l'utilisateur courant
Une fois connecté à un compte Youtube (avec n’importe laquelle des méthodes citées ci-dessus), il est possible d’effectuer une recherche des vidéos comme si vous êtiez sur le site.
Afin de construire les requêtes, différents paramètres peuvent être passés à la méthode videos_by :
# "query" permet d'effectuer une recherche par mot clé
client.videos_by(query: "ruby on rails")
# "user" permet d'effectuer une recherche par utilisateur, dans le cas suivant toutes les vidéos d'un utilisateur seront retounées
client.videos_by(user: "alxsalaun")
# "categories" permet d'affectuer une recherche par catégories
client.videos_by(categories: [:news, :sports])
# "tags" permet d'affectuer une recherche par tags
client.videos_by(tags: ['soccer', 'football'])
Cette méthode, avec tous ces paramètres, retourne une collection de vidéos. Cependant, il est possible de rechercher une vidéo précise grâce à la méthode video_by et à différents paramètres : un id, une url…
client.video_by("z0lf0o9cNdg") # id d'une vidéo
client.video_by("http://www.youtube.com/watch?v=z0lf0o9cNdg") # url d'une vidéo
Grâce à ces méthodes vous pouvez donc, depuis votre site, effectuer une recherche de vidéo comme si vous êtiez sur Youtube. Il vous sera possible d’afficher ces vidéos si vous le souhaitez par la suite.
Cela a pour avantage de vous éviter de développer un moteur de recherche sur votre site, tout du moins en ce qui concerne les vidéos.
En plus de la recherche, il est possible, une fois connecté avec un compte utilisateur, d’uploader des vidéos sur Youtube.
Là encore, il y a 2 solutions, soit utiliser la méthode video_upload, soit upload_token.
Avec cette solution, il vous faut passer en paramètre : le fichier, le titre de la vidéo, une description ainsi que les éventuelles catégories. Il est également possible d’ajouter des mots clés (paramètre keywords), la notion de vidéo privée (paramètre private) ou encore le fait de savoir si les commentaires seront acceptés ou non (paramètre comment) par exemple.
client.video_upload(File.open("ma_video.avi"), title: "Ma vidéo", description: "Description de ma vidéo", category: "Sports")
Il est donc possible de créer un formulaire sur dans votre application qui aura pour but de permettre à l’utilisateur de saisir ces informations et d’uploader un fichier. Ensuite, ces informations seront passées en paramètre à la méthode video_upload et le tour est joué.
Dans ce second cas, un formulaire va être généré grâce à la gem. En effet, il faut dans un premier temps se connecter avec un compte client Youtube comme nous avons pu le faire plus haut dans cet article. Une fois que l’on a récupéré un compte utilisateur, il faut appeler la méthode upload_token pour récupérer l’url de soumission du formulaire ainsi qu’un token.
Dans l’exemple suivant, un premier formulaire va servir à récupérér les informations de la vidéo (titre, description, catégories…) puis on utilisera les informations retournées pour créer le formulaire d’upload du fichier.
parameters = { :title => params[:title],
:description => params[:description],
:category => params[:category],
:keywords => params[:keywords] }
@upload_form = client.upload_token(parameters, return_url) # return_url est l'url qui sera appelé après l'upload du fichier sur Youtube
Ensuite, dans une vue, vous allez pouvoir créer un formulaire :
<%= form_tag @upload_form[:url], :multipart => true do %>
<%= hidden_field_tag :token, @upload_info[:token] %>
<%= label_tag :video_file %>
<%= file_field_tag :video_file %>
<%= submit_tag "Uploader" %>
<% end %>
Ce formulaire va donc être soumis et le fichier va être uploadé sur Youtube puis l’utilisateur sera redirigé vers l’url passée en paramètre lors de l’appel ) la fonction upload_token.
Un paramètre :status est retourné, si il vaut “200” alors l’upload est terminé, dans tout autre cas cela signifie qu’une erreur s’est produite et il est possible de la récupérer.
Vous pouvez donc maintenant uploader, directement depuis de votre application, des vidéos sur Youtube. Il ne vous reste plus qu’à les lire.
Maintenant que nous avons vu comment effectuer une recherche ou encore uploadé des vidéos, il est nécessaire d’afficher le lecteur afin que les utilisateurs puissent lire les vidéos depuis votre site ou application.
Le lecteur HTML5 est accessible via la méthode embed_html5 :
video = client.video_by("z0lf0o9cNdg") # id d'une vidéo
video.embed_html5
Il est possible de passer des paramètres à cette méthode afin de personnaliser l’affichage de la vidéo comme par exemple une classe et un id css mais aussi des dimensions.
video = client.video_by("z0lf0o9cNdg") # id d'une vidéo
video.embed_html5({ class: 'video-player', id: 'my-video', width: '425', height: '350' })
Une autre méthode est disponible pour afficher la vidéo, cette fois dans un format plus grand (1280 pixels de largeur par défaut). Il est possible de changer cette largeur en passant celle-ci en paramètre sous forme d’un entier :
video = client.video_by("z0lf0o9cNdg") # id d'une vidéo
video.embed_html_with_width
# avec une largeur donnée
video.embed_html_with_width(1160)
Attention, dans chacun des cas d’utilisation, il est nécessaire d’appliquer la méthode html_safe sur le contenu retourné par les différentes méthodes utilisées pour afficher le lecteur.
En conclusion, cette gem vous permet d’utiliser les principales fonctionnalités de Youtube sans avoir à stocker les vidéos sur votre site. De plus, cela vous permet d’utiliser certains outils tels que la recherche, la gestion des commentaires sans avoir à le développer vous-même.
D’autres fonctionnalités que celles vues précédemment sont disponibles, la liste ci-dessus n’est pas exhaustive. Chacun peut utiliser ce qui lui convient pour son application en fonction des besoins.
Les contenus médias (images ou sons) peuvent donc être facilement gérer via une plateforme externe, dans notre cas nous avons testé Soundcloud et Youtube mais d’autres applications tierces sont également disponibles, vimeo par exemple.
L’équipe Synbioz.
Libres d’être ensemble.
Nos conseils et ressources pour vos développements produit.