Пример #1
0
 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
Пример #2
0
 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
Пример #3
0
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)
Пример #4
0
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))
Пример #5
0
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))
Пример #6
0
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()