Foros del Web » Programando para Internet » Python »

[SOLUCIONADO] Subir video a youtube desde django admin

Estas en el tema de Subir video a youtube desde django admin en el foro de Python en Foros del Web. Hola como andan, estoy tratando de subir un video asociado a una noticia usando el administrador de django, en el modelo tengo un input file ...
  #1 (permalink)  
Antiguo 30/01/2013, 07:53
 
Fecha de Ingreso: enero-2013
Ubicación: Montevideo
Mensajes: 28
Antigüedad: 11 años, 2 meses
Puntos: 1
Pregunta Subir video a youtube desde django admin

Hola como andan, estoy tratando de subir un video asociado a una noticia usando el administrador de django, en el modelo tengo un input file en video, cuando hago el save de noticia llamo a una funcion subidor(archivo, titulo, descr)
el tema que a la hora de hacer el

video_nuevo = yt_service.InsertVideoEntry(video_datos, video_archivo)
en este caso estaria subiendo el video a mi servidor y luego subir ese video a yt.

no llega a ejecutar.. o al menos no tegno respuesta de eso.

Como seria subir basado en navegador (directo a yt sin pasar por mi server) desde el django admin? porque como muestro el formulario usando el admin con el token que me da youtube?

Gracias
  #2 (permalink)  
Antiguo 30/01/2013, 11:31
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Subir video a youtube desde django admin

Mi humilde recomendación seria:

1.- Usar el API de youtube para subir el vídeo.
2.- Guardar el ID del vídeo. Y usa el API para generar la URL si es posible.
  #3 (permalink)  
Antiguo 30/01/2013, 11:46
 
Fecha de Ingreso: enero-2013
Ubicación: Montevideo
Mensajes: 28
Antigüedad: 11 años, 2 meses
Puntos: 1
Respuesta: Subir video a youtube desde django admin

estoy usando la API de youtube y tengo este codigo:

Código python:
Ver original
  1. def subidor(archivo, titulo, descripcion):
  2.     print "1"
  3.     yt_service = gdata.youtube.service.YouTubeService()
  4.     yt_service.email = 'xxx'
  5.     yt_service.password = 'xxx'
  6.     yt_service.developer_key = 'xxx
  7.     yt_service.client_id = 'xxx'
  8.     yt_service.source = 'xxx'
  9.     yt_service.ProgrammaticLogin()
  10.     print "2"
  11.     print yt_service
  12.    
  13.     yt_service = gdata.youtube.service.YouTubeService()
  14.     video_meta = gdata.media.Group(
  15.         title=gdata.media.Title(text=str(titulo)),
  16.         description=gdata.media.Description(description_type='plain',text=str(descripcion)),
  17.         keywords=gdata.media.Keywords(text='cuaderno de campo, script, uploader'),
  18.         category=[gdata.media.Category(text='Entertainment', scheme='http://gdata.youtube.com/schemas/2007/categories.cat', label='Ocio')],
  19.         player=None )  
  20.     print "3"  
  21.  
  22.     video_datos = gdata.youtube.YouTubeVideoEntry(media=video_meta)
  23.     print video_datos
  24.    
  25.     print "4"
  26.  
  27.     video_archivo = str(archivo).replace("uploaded_videos/", "")
  28.     print video_archivo
  29.     print "5"
  30.  
  31.     yt_service.InsertVideoEntry(video_datos, video_archivo)

esta ultima linea seria la que inserta el video, pero no hace nada..

La funcion subidor la estoy llamando desde el modelo, en el post_save de Noticia, con los 3 parametros correspondientes.

Esta funcion tiene que retornar algo? o solo sube el video a youtube? InsertVideoEntry()

Última edición por AlvaroG; 01/02/2013 a las 07:33 Razón: coloreado de código
  #4 (permalink)  
Antiguo 30/01/2013, 12:16
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Subir video a youtube desde django admin

InsertVideoEntry: Regresa un objeto YouTubeVideoEntry si es exitoso.

Te debería de retornar esa entrada si todo salio bien. Si el vídeo es pesado posiblemente la operación tarde mucho tiempo.
  #5 (permalink)  
Antiguo 30/01/2013, 12:25
 
Fecha de Ingreso: enero-2013
Ubicación: Montevideo
Mensajes: 28
Antigüedad: 11 años, 2 meses
Puntos: 1
Respuesta: Subir video a youtube desde django admin

gracias por responder, el video pesa 900 kb, uno de prueba.. es un mp4..
y no lo está subiendo...decis que el procedimiento que estoy haciendo es correcto?

El video se sube a mi server en media/uploaded_videos/ cuando creo la noticia, pero de ahi a youtube no está subiendo.. hay alguna forma de testear la conexion con los datos de acceso?

Última edición por josepbidegain; 30/01/2013 a las 13:40
  #6 (permalink)  
Antiguo 30/01/2013, 13:45
 
Fecha de Ingreso: enero-2013
Ubicación: Montevideo
Mensajes: 28
Antigüedad: 11 años, 2 meses
Puntos: 1
Respuesta: Subir video a youtube desde django admin

Afecta en algo que esté trabajando en un servidor de localhost?
  #7 (permalink)  
Antiguo 31/01/2013, 09:36
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Subir video a youtube desde django admin

razpeita te comenta que deberías obtener un objeto YouTubeVideoEntry si la subida es exitosa. ¿Qué estás recibiendo?
  #8 (permalink)  
Antiguo 31/01/2013, 10:19
 
Fecha de Ingreso: enero-2013
Ubicación: Montevideo
Mensajes: 28
Antigüedad: 11 años, 2 meses
Puntos: 1
Respuesta: Subir video a youtube desde django admin

el siguiente error:
YouTubeError at /admin/app/noticia/add/

{'status': 601, 'body': '`video_entry` must be a gdata.youtube.VideoEntry instance', 'reason': "Found <class 'app.gdata.youtube.YouTubeVideoEntry'>, not VideoEntry"}
  #9 (permalink)  
Antiguo 31/01/2013, 12:34
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Subir video a youtube desde django admin

Pues parece decir que te estás equivocando de clase a la hora de crear video_datos, la variable debe ser un VideoEntry, no un YouTubeVideoEntry
  #10 (permalink)  
Antiguo 31/01/2013, 13:07
 
Fecha de Ingreso: enero-2013
Ubicación: Montevideo
Mensajes: 28
Antigüedad: 11 años, 2 meses
Puntos: 1
Respuesta: Subir video a youtube desde django admin

Yo tengo la api gdata en un directorio dentro del proyecto, en gdata.youtube tengo la clase
class YouTubeVideoEntry(gdata.GDataEntry):
"""Represents a video on YouTube."""
_tag = gdata.GDataEntry._tag
_namespace = gdata.GDataEntry._namespace
_children = gdata.GDataEntry._children.copy()
_attributes = gdata.GDataEntry._attributes.copy()
_children['{%s}rating' % gdata.GDATA_NAMESPACE] = ('rating', Rating)
_children['{%s}comments' % gdata.GDATA_NAMESPACE] = ('comments', Comments)
_children['{%s}noembed' % YOUTUBE_NAMESPACE] = ('noembed', NoEmbed)
_children['{%s}statistics' % YOUTUBE_NAMESPACE] = ('statistics', Statistics)
_children['{%s}recorded' % YOUTUBE_NAMESPACE] = ('recorded', Recorded)
_children['{%s}racy' % YOUTUBE_NAMESPACE] = ('racy', Racy)
_children['{%s}group' % gdata.media.MEDIA_NAMESPACE] = ('media', Media.Group)
_children['{%s}where' % gdata.geo.GEORSS_NAMESPACE] = ('geo', Geo.Where)


por eso uso ese constructor y no el gdata.youtube.VideoEntry()

gracias por responder igual, alguien que haya hecho un upload video to youtube desde el administrador de django ???
  #11 (permalink)  
Antiguo 31/01/2013, 13:40
 
Fecha de Ingreso: enero-2013
Ubicación: Montevideo
Mensajes: 28
Antigüedad: 11 años, 2 meses
Puntos: 1
Respuesta: Subir video a youtube desde django admin

def subidor(archivo, titulo, descripcion):
print "1"
yt_service = gdata.youtube.service.YouTubeService()
yt_service.email = 'xxx'
yt_service.password = 'xxx'
yt_service.developer_key = 'xxx'
yt_service.client_id = 'xxx'
yt_service.source = 'xxx'
yt_service.ProgrammaticLogin()
print "2"
video_meta = gdata.media.Group(
title=gdata.media.Title(text=str(titulo)),
description=gdata.media.Description(description_ty pe='plain',text=str(descripcion)),
keywords=gdata.media.Keywords(text='cuaderno de campo, script, uploader'),
category=[gdata.media.Category(text='Entertainment', scheme='http://gdata.youtube.com/schemas/2007/categories.cat', label='Ocio')],
player=None )

print "3"
video_entry = gdata.youtube.YouTubeVideoEntry(media=video_meta)
print "4"
response = yt_service.GetFormUploadToken(video_entry)

post_url = response[0]
youtube_token = response[1]
print {'post_url': post_url, 'youtube_token': youtube_token}
#return {'post_url': post_url, 'youtube_token': youtube_token}


#En este punto logro obtener un youtube_token y un post_url, quisiera saber como hago el proceso de subir el archivo a youtube con esas credenciales obtenidas de modo transparente al usuario, osea.. que ya se suba con eso.. nose como seguir.. con una ajax?

copia = '<form action="'+post_url+'" method="post" enctype="multipart/form-data"><input id="file" type="file" name="file" value="'+archivo+'"/><input type="hidden" name="token" value="'+youtube_token+'"/><input type="submit" value="go" /></form>'

return HTTPResponse(copia)
  #12 (permalink)  
Antiguo 01/02/2013, 07:39
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Subir video a youtube desde django admin

Cita:
Iniciado por josepbidegain Ver Mensaje
por eso uso ese constructor y no el gdata.youtube.VideoEntry()
Primero que nada, el mensaje es claro. ¿no le estarás pegando a la versión incorrecta de la API?

Segundo: declaras tu objeto YouTubeService, le agregas las propiedades, e inmediatamente lo eliminas y creas uno nuevo. ¿no estará allí el problema?
  #13 (permalink)  
Antiguo 01/02/2013, 08:16
 
Fecha de Ingreso: enero-2013
Ubicación: Montevideo
Mensajes: 28
Antigüedad: 11 años, 2 meses
Puntos: 1
Respuesta: Subir video a youtube desde django admin

Hola Alvaro, no entendi la parte que me decis que estoy eliminando el objeto YoutubeService.
Tenes un gtalk o algo para poder comunicarme mas agil? Si no te molesta,
Saludos
  #14 (permalink)  
Antiguo 01/02/2013, 12:06
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Subir video a youtube desde django admin

Digo que lo estás eliminando porque el objeto que creás en la línea 3 del código que pusiste la primera vez, lo estás sustituyendo por uno nuevo en la línea 13, haciendo que todas las propiedades que le pusiste antes se pierdan.
  #15 (permalink)  
Antiguo 01/02/2013, 12:48
 
Fecha de Ingreso: enero-2013
Ubicación: Montevideo
Mensajes: 28
Antigüedad: 11 años, 2 meses
Puntos: 1
Respuesta: Subir video a youtube desde django admin

si ahora que me decis me doy cuenta, pero ya cambie el codigo.. por el que esta mas abajo.. sabes que procedimiento seguir una vez obtenga el token y el post_url? como hago para cargar el video desde el admin..
  #16 (permalink)  
Antiguo 05/02/2013, 13:05
 
Fecha de Ingreso: enero-2013
Ubicación: Montevideo
Mensajes: 28
Antigüedad: 11 años, 2 meses
Puntos: 1
Respuesta: Subir video a youtube desde django admin

Hola, alguien ha usado esta app ?
https://github.com/rizumu/django-admin-uploads/tree/master/admin_uploads

No se bien como integrarla a mi proyecto..
  #17 (permalink)  
Antiguo 06/02/2013, 13:02
 
Fecha de Ingreso: enero-2013
Ubicación: Montevideo
Mensajes: 28
Antigüedad: 11 años, 2 meses
Puntos: 1
Respuesta: Subir video a youtube desde django admin

Bueno gente, he logrado subir el video si me armo a mano el form en un archivo php y selecciono un archivo.. usando el token y el post_url obtenidos en el request a la API de youtube. El tema es que no se como hacer ese proceso automaticamente, con el request.post(post_url, files=files), eso me devuelve el form html pero no se como mandarlo automaticamente con el archivo recibido en la funcion subidor.!!!!
Alguno que se le ocurra algo? gracias


def subidor(archivo, titulo, descripcion):
yt_service = gdata.youtube.service.YouTubeService()
yt_service.email = 'xxx'
yt_service.password = 'xxx'
yt_service.developer_key = 'xxx'
yt_service.client_id = 'xxx'
yt_service.source = 'xxx'
yt_service.ProgrammaticLogin()

video_meta = gdata.media.Group(
title=gdata.media.Title(text=str(titulo)),
description=gdata.media.Description(description_ty pe='plain',text='str(descripcion)'),
keywords=gdata.media.Keywords(text='cuaderno de campo, script, uploader'),
category=[gdata.media.Category(text='Entertainment', scheme='http://gdata.youtube.com/schemas/2007/categories.cat', label='Ocio')],
player=None )


video_entry = gdata.youtube.YouTubeVideoEntry(media=video_meta)

response = yt_service.GetFormUploadToken(video_entry)

post_url = response[0]+'?nexturl=http://www.google.com'
youtube_token = response[1]


archivo = settings.MEDIA_ROOT+archivo

files = {'file': open(archivo, 'rb'), 'token': youtube_token}

r = requests.post(post_url, files=files)

ACA SE DEBERIA ENVIAR EL REQUEST NO???

return HTTPResponse(r)
  #18 (permalink)  
Antiguo 07/02/2013, 14:41
 
Fecha de Ingreso: enero-2013
Ubicación: Montevideo
Mensajes: 28
Antigüedad: 11 años, 2 meses
Puntos: 1
Respuesta: Subir video a youtube desde django admin

BUENO AL FIN !!!!
Despues de tantas idas y vueltas, casi resignado.. pude lograr hacer el upload.
Dejo el codigo por si alguien a futuro necesita implementarlo.

def subidor(archivo, titulo, descripcion):
yt_service = gdata.youtube.service.YouTubeService()
yt_service.email = 'xxx'
yt_service.password = 'xxx'
yt_service.developer_key = 'xxx'
yt_service.client_id = 'xxx'
yt_service.source = 'xxx'
yt_service.ProgrammaticLogin()

video_meta = gdata.media.Group(
title=gdata.media.Title(text=str(titulo)),
description=gdata.media.Description(description_ty pe='plain',text='str(descripcion)'),
keywords=gdata.media.Keywords(text='cuaderno de campo, script, uploader'),
category=[gdata.media.Category(text='Entertainment', scheme='http://gdata.youtube.com/schemas/2007/categories.cat', label='Ocio')],
player=None )


video_entry = gdata.youtube.YouTubeVideoEntry(media=video_meta)

response = yt_service.GetFormUploadToken(video_entry)

post_url = response[0]+'?nexturl=http://example.com'

youtube_token = response[1]
print {'post_url': post_url, 'youtube_token': youtube_token}

archivo = settings.MEDIA_ROOT+str(archivo)
files = {'file': open(archivo, 'rb')}
param = {'token': youtube_token}

requests.post(post_url, files=files, params=param)

Ahora tendre que ver como obtener el link del video subido para insertarlo en un iframe dentro del html por cada noticia que ingrese.

Saludos
  #19 (permalink)  
Antiguo 13/02/2013, 06:17
 
Fecha de Ingreso: enero-2013
Ubicación: Montevideo
Mensajes: 28
Antigüedad: 11 años, 2 meses
Puntos: 1
Respuesta: Subir video a youtube desde django admin

Bueno con esto cierro el post, dejando solucion como quedarme con el link del video subido.
r = requests.post(post_url, files=files, params=param)
if r:
uri = 'http://gdata.youtube.com/feeds/api/users/%s/uploads' % 'default' # All my uploads
feed = yt_service.GetYouTubeVideoFeed(uri)
link = 'https://www.youtube.com/watch?v=' + str(feed.entry[0].id).split('videos/')[1].split('<')[0]
return link

el elemento 0 del array es el ultimo video subido.. feed.entry[0]

Saludos y gracias por los aportes.

Etiquetas: django, youtube
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:25.