def clean(self, value): value = forms.URLField.clean(self, value) if not self.required and value in ['', None]: return value value = quote_unicode_url(value) content_thumb = ContentFile(urllib.urlopen(value).read()) try: Image.open(content_thumb) except IOError: raise forms.ValidationError('Not a valid image.') else: content_thumb.seek(0) return content_thumb
def video_save_thumbnail(video_pk, using='default'): try: video = Video.objects.using(using).get(pk=video_pk) except Video.DoesNotExist: logging.warn('video_save_thumbnail(%s, using=%r) could not find video', video_pk, using) return if not video.thumbnail_url: return thumbnail_url = quote_unicode_url(video.thumbnail_url) try: remote_file = urllib.urlopen(thumbnail_url) except httplib.InvalidURL: # This is always fast, so we don't need to worry as much about # race conditions. If the URL isn't valid, just erase it. video.thumbnail_url = '' video.has_thumbnail = False video.save() return if remote_file.getcode() != 200: logging.info("Code %i when getting %r, retrying", remote_file.getcode(), video.thumbnail_url) video_save_thumbnail.retry() try: content_thumb = ContentFile(remote_file.read()) except IOError: # Could be a temporary disruption - try again later if this was # a task. Otherwise reraise. if video_save_thumbnail.request.called_directly: raise video_save_thumbnail.retry() video.save_thumbnail_from_file(content_thumb)
def add_feed(request): add_form = forms.AddFeedForm(request.GET) if not add_form.is_valid(): return HttpResponseBadRequest(add_form['feed_url'].errors.as_text()) feed_url = add_form.cleaned_data['feed_url'] scraped_feed = add_form.cleaned_data['scraped_feed'] try: scraped_feed.load() except vidscraper.errors.CantIdentifyUrl: return HttpResponseBadRequest( '* It does not appear that %s is an RSS/Atom feed URL.' % (scraped_feed.url, )) except Exception: logging.error('unknown error loading scraped feed: %r', feed_url, exc_info=None) return HttpResponseBadRequest( '* There was an unknown error loading %s' % (feed_url, )) title = scraped_feed.title or '' for regexp in VIDEO_SERVICE_TITLES: match = regexp.match(title) if match: title = match.group(1) break defaults = { 'name': title, 'feed_url': feed_url, 'webpage': scraped_feed.webpage or '', 'description': scraped_feed.description or '', 'etag': scraped_feed.etag or '', 'when_submitted': datetime.datetime.now(), 'last_updated': datetime.datetime.now(), 'status': Feed.INACTIVE, 'user': request.user, 'auto_approve': bool(request.POST.get('auto_approve', False)) } video_count = scraped_feed.entry_count if request.method == 'POST': if 'cancel' in request.POST: return HttpResponseRedirect(reverse('localtv_admin_manage_page')) form = forms.SourceForm(request.POST, instance=Feed(**defaults)) if form.is_valid(): feed, created = Feed.objects.get_or_create( feed_url=defaults['feed_url'], site=SiteSettings.objects.get_current().site, defaults=defaults) if not created: for key, value in defaults.items(): setattr(feed, key, value) construct_instance(form, feed) thumbnail_url = scraped_feed.thumbnail_url if thumbnail_url: try: thumbnail_file = ContentFile( urllib2.urlopen( utils.quote_unicode_url(thumbnail_url)).read()) except IOError: # couldn't get the thumbnail pass else: try: feed.save_thumbnail_from_file(thumbnail_file, update=False) except CannotOpenImageUrl: # couldn't parse the thumbnail. Not sure why this # raises CannotOpenImageUrl, tbh. pass if feed.video_service(): user, created = User.objects.get_or_create( username=feed.name[:30], defaults={'email': ''}) if created: user.set_unusable_password() Profile.objects.create(user=user, website=defaults['webpage']) user.save() feed.auto_authors.add(user) feed.save() tasks.feed_update.delay(feed.pk, using=tasks.CELERY_USING, clear_rejected=True) return HttpResponseRedirect(reverse('localtv_admin_manage_page')) else: form = forms.SourceForm(instance=Feed(**defaults)) return render_to_response('localtv/admin/add_feed.html', { 'form': form, 'video_count': video_count }, context_instance=RequestContext(request))
def add_feed(request): add_form = forms.AddFeedForm(request.GET) if not add_form.is_valid(): return HttpResponseBadRequest( add_form['feed_url'].errors.as_text()) feed_url = add_form.cleaned_data['feed_url'] scraped_feed = add_form.cleaned_data['scraped_feed'] try: scraped_feed.load() except vidscraper.errors.CantIdentifyUrl: return HttpResponseBadRequest( '* It does not appear that %s is an RSS/Atom feed URL.' % ( scraped_feed.url,)) title = scraped_feed.title or '' for regexp in VIDEO_SERVICE_TITLES: match = regexp.match(title) if match: title = match.group(1) break defaults = { 'name': title, 'feed_url': feed_url, 'webpage': scraped_feed.webpage or '', 'description': scraped_feed.description or '', 'etag': scraped_feed.etag or '', 'when_submitted': datetime.datetime.now(), 'last_updated': datetime.datetime.now(), 'status': Feed.INACTIVE, 'user': request.user, 'auto_approve': bool(request.POST.get('auto_approve', False))} video_count = scraped_feed.entry_count if request.method == 'POST': if 'cancel' in request.POST: return HttpResponseRedirect(reverse('localtv_admin_manage_page')) form = forms.SourceForm(request.POST, instance=Feed(**defaults)) if form.is_valid(): feed, created = Feed.objects.get_or_create( feed_url=defaults['feed_url'], site=SiteLocation.objects.get_current().site, defaults=defaults) if not created: for key, value in defaults.items(): setattr(feed, key, value) for key, value in form.cleaned_data.items(): setattr(feed, key, value) thumbnail_url = scraped_feed.thumbnail_url if thumbnail_url: try: thumbnail_file = ContentFile( urllib2.urlopen( utils.quote_unicode_url(thumbnail_url)).read()) except IOError: # couldn't get the thumbnail pass else: feed.save_thumbnail_from_file(thumbnail_file) if feed.video_service(): user, created = User.objects.get_or_create( username=feed.name[:30], defaults={'email': ''}) if created: user.set_unusable_password() Profile.objects.create( user=user, website=defaults['webpage']) user.save() feed.auto_authors.add(user) feed.save() tasks.feed_update.delay( feed.pk, using=tasks.CELERY_USING) return HttpResponseRedirect(reverse('localtv_admin_manage_page')) else: form = forms.SourceForm(instance=Feed(**defaults)) return render_to_response('localtv/admin/add_feed.html', {'form': form, 'video_count': video_count}, context_instance=RequestContext(request))
def video_save_thumbnail(video_pk): try: video = Video.objects.get(pk=video_pk) except Video.DoesNotExist: logging.warn( 'video_save_thumbnail(%s) could not find video', video_pk) return if not video.thumbnail_url: return thumbnail_url = quote_unicode_url(video.thumbnail_url) try: remote_file = urllib.urlopen(thumbnail_url) except httplib.InvalidURL: # If the URL isn't valid, erase it. Video.objects.filter(pk=video.pk ).update(thumbnail_url='') return if remote_file.getcode() != 200: logging.info("Code %i when getting %r, retrying", remote_file.getcode(), video.thumbnail_url) video_save_thumbnail.retry() temp = NamedTemporaryFile() try: temp.write(remote_file.read()) except IOError: # Could be a temporary disruption - try again later if this was # a task. Otherwise reraise. if video_save_thumbnail.request.called_directly: raise video_save_thumbnail.retry() temp.seek(0) try: im = Image.open(temp) im.verify() except Exception: # If the file isn't valid, erase the url. Video.objects.filter(pk=video.pk ).update(thumbnail_url='') return f = video._meta.get_field('thumbnail') format = im.format if im.format in KEEP_FORMATS else DEFAULT_FORMAT args = (video.thumbnail_url, video.pk, datetime.datetime.now().isoformat()) filename = '.'.join((make_hash(*args, step=2), format.lower())) storage_path = f.generate_filename(video, filename) # We save the thumbnail file and then update the path on the instance # to avoid overwriting other changes that might have happened # simultaneously. final_path = default_storage.save(storage_path, File(temp)) Video.objects.filter(pk=video.pk ).update(thumbnail=final_path) remote_file.close() temp.close()