gdata.youtube python ライブラリを使用して、YouTube に動画を投稿できる機能を備えた python/django を利用したアプリがあります。
私の参照は次のとおりです: https://developers.google.com/youtube/1.0/developers_guide_python
前の開発者は、ビデオをアップロードするための要件や認証を満たすなど、この非常に便利なページにある指示に従いました。しかし、うまくいきません。firebug を実行すると、500 INTERNAL SERVER ERROR が発生し、ビューで upload_prepare 関数にトレースされます。これはおそらく保存部分にあります。
def upload_prepare(request):
if request.POST:
form = UploadForm(request.user, request.POST)
if form.is_valid():
#error is in the next line
video = form.save()
彼はまた、Browserupload を介して YouTube ビデオを投稿する方法の指示に従いました。
私のコードは次のとおりです。
models.py
class Category(models.Model):
text = models.CharField(max_length=100)
label = models.CharField(max_length=100)
scheme = models.URLField()
def toGData(self):
return gdata.media.Category(
text=self.text,
label=self.label,
scheme=self.scheme)
class YoutubeUser(models.Model):
username = models.CharField(max_length=50)
...
#Initialize gdata.youtube.service.YouTubeService object
def yt_service(self):
try:
return selt._yt_service
except AttributeError:
#setting up developer key and client ID
yt_service = gdata.youtube.service.YouTubeService()
yt_service.developer_key = settings.SYNCR_YT_DEVKEY
yt_service.client_id = 'LOLtest'
#setting up a authentication token
if self.token:
yt_service.SetAuthSubToken(self.token)
self._yt_service = yt_service
return yt_service
#Setting up AuthSub authentication for web apps
def authsub_url(self, request):
#urls.py url
base = reverse('authlanding', args=(self.id,))
next = 'http://%s%s?next=%s' % (request.get_host(), base, urllib2.quote(request.build_absolute_uri()))
scope = 'http://gdata.youtube.com'
secure = False
session = True
return self.yt_service.GenerateAuthSubUrl(next, scope, secure, session)
#upgrade to a session token
def upgrade_to_session(self):
yt_service = self.yt_service
yt_service.SetAuthSubToken(self.token)
yt_service.UpgradeToSessionToken()
self.token = yt_service.current_token.get_token_string()
self.save()
これまでのところ、models.py のコード、forms.py のコード、エラーの原因となった保存関数はここにあります (上の upload_prepare ビューを見てください)。
フォーム.py
class UploadForm(forms.Form):
video_title = forms.CharField(max_length=100)
...
#https://developers.google.com/youtube/1.0/developers_guide_python#UploadingVideos
#Browser-based upload
def save(self):
mediagroup = gdata.media.Group(
title=gdata.media.Title(text=self.cleaned_data['video_title']),
description=gdata.media.Description(description_type="plain", text=self.cleaned_data['video_description']),
keywords=gdata.media.Keywords(text=self.cleaned_data['tags']),
#category already in GData format look in models.py
category=self.cleaned_data['category'].toGData(),
player=None,
)
video_entry = gdata.youtube.YouTubeVideoEntry(media=mediagroup)
response = self.yt_user.yt_service.GetFormUploadToken(video_entry)
post_url = response[0]
youtube_token = response[1]
video = Video.objects.create(
author=self.yt_user,
post_url=post_url,
youtube_token=youtube_token,
title=self.cleaned_data['video_title'],
description=self.cleaned_data['video_description'],
tag_list=self.cleaned_data['tags'],
)
self.video = video
return video
一方、データを渡すために html で使用されるフォームは、django フォーム、django カスタム タグ付け、および ajax を組み合わせたものです。
フォーム.py
class UploadForm(forms.Form):
video_title = forms.CharField(max_length=100)
video_description = forms.CharField(widget=forms.Textarea(attrs={'cols': 60,
'rows': 10}))
category = forms.ModelChoiceField(Category.objects, empty_label=None)
tags = TagField(
label=_('tags (comma separated)'),
required=True,
)
youtube_tags.py
def youtube_upload_form(context):
#UploadForm from above
upload_form = UploadForm(context['user'])
context['upload_form'] = upload_form
return context
register.inclusion_tag('syncr/youtube/upload.html',
takes_context=True)(youtube_upload_form)
add_post.html
<script>
function upload_video_to_youtube(url){
action = "%s?nexturl=%s" % (youtube_url, url)
var new_form = create_element('form', {'method': 'post', 'action': action, 'enctype':"multipart/form-data"});
$('#youtube_upload_form input').each(function(){
var obj = this.cloneNode(true);
new_form.appendChild(obj);
});
document.body.appendChild(new_form);
new_form.submit();
}
</script>
{% block body %}
...
<div id="rd2-radioOptionContent" class="hide radioOptionContent">
{% youtube_upload_form %}
</div>
{% endblock %}
私が投稿したコードを皆さんが完璧に理解してくれることを願っています。明確に読めば、リファレンスに投稿された指示のほとんどが従い (データを送信するために使用されるフォームはわずかに異なります)、500 内部サーバー エラーが発生したことを考えると、これらのコード行で問題を見つける必要があります。どんな答えでも大歓迎です。