2010-07-12 2 views
0

J'ai un scénario où les utilisateurs peuvent télécharger une image ou une vidéo (à partir de YouTube ou vimeo) en utilisant CCK via ImageField (Images) & Embedded Media Field (Vidéos)Stockage img externe dans Drupal comme il a été téléchargé par l'utilisateur

Mon site utilise les images ImageField pour créer des vignettes dans différentes vues avec des actions imagecache.

Youtube/vimeo fournit une capture d'image de la vidéo que je veux utiliser comme "repli" pour les images. Plutôt que de réécrire chaque vue pour fournir ce repli, et de garder tout cohérent, je me demandais la meilleure façon de télécharger et de stocker l'image de capture vidéo externe comme si l'utilisateur l'avait téléchargé comme une image avec la vidéo.

Je suis familier avec les règles & Actions et PHP, tout contour de base de ce que je devrais faire est grandement apprécié.

Répondre

1

Dans hook_nodeapi($op == 'presave', ...) vous pouvez vérifier si une image a été fournie et le télécharger depuis youtube. Une solution simple peut être d'utiliser drupal_http_request() pour télécharger le fichier puis file_save_data() pour l'écrire sur le disque. Mais cela va charger le contenu du fichier en mémoire, ce qui ne devrait pas être nécessaire. Je pense que Curl peut être utilisé pour télécharger directement un fichier HTTP sur le disque. Le téléchargement des fichiers lors de l'enregistrement des noeuds peut être un problème de performance (car il augmente le temps de réponse). Dans ce cas, vous pouvez le reporter à une implémentation de hook_cron. Vous pouvez utiliser le Job Queue pour facilement mettre en file d'attente le téléchargement d'image pour le prochain cron. Si l'exécution pendant le cron de Drupal est un problème, vous pouvez également essayer d'utiliser le module Drupal Queue pour gérer les téléchargements séparément.

+0

Merci mongolitho404, je pense que je vais courir avec ça. J'ai créé la fonction pour peupler le fid, juste faire des recherches sur la fonction du module. Les images provenant de youtube/vimeo sont petites (14ko par exemple), devrais-je vraiment m'inquiéter de la performance en appelant cette fonction immédiatement comme étant sauvegardée plutôt que comme tâche cron? Ne serait-il pas proche de la même performance que si cet utilisateur avait téléchargé sa propre image (3-6mb)? – askon

+1

À mon humble avis, le téléchargement de petits fichiers à partir d'un grand site Web comme YouTube ne devrait pas être une préoccupation. Faites fonctionner la chose en premier. Une fois que cela fonctionne, vous pouvez tester et voir si le téléchargement d'un fichier est une question de performance et si elle doit être résolue. –

+0

Merci encore mongolitho404, cela m'a vraiment aidé, je me suis ouvert au processus de création de modules et la fonction nodeapi n'est pas aussi effrayante que prévu. J'ai les vignettes de téléchargement et de stockage, en travaillant simplement sur la base de données insérer et mettre à jour :) – askon

1

Cela fait partie d'un module personnalisé. Je ne suis pas au courant d'un module qui gère cela.

Un tel module n'est pas facile à écrire. S'il doit fonctionner (chaque site doit fonctionner, n'est-ce pas?), Il contiendrait une sorte de mécanisme de file d'attente ou de spool, afin qu'il puisse traiter et télécharger la vidéo distante à son propre rythme. Il peut être nécessaire d'avoir une rue d'encodage, si vous voulez que la vidéo soit dans un format cohérent. Il faudrait beaucoup de hacks moche, car, après tout, Youtube ne permet pas de télécharger leurs vidéos et le rendra aussi difficile que possible.

+1

OTOH: vous pouvez jeter un oeil à Bluedroplet, il pourrait être une alternative très bien adaptée à vos exigences. http://bluedroplet.com/ – berkes

Questions connexes