Example #1
0
def as_dict(obj):
    if isinstance(obj, UserVideo):
        return {'url': obj.video.url,
                'id': obj.video.id,
                'liked': obj.liked,
                'likes': UserVideo.like_count(obj.video),
                'saved': obj.saved,
                'saves': UserVideo.save_count(obj.video),
                'position': obj.position}

    elif isinstance(obj, User):
        return {'name': ' '.join([obj.first_name, obj.last_name]),
                'username': obj.username,
                'picture': obj.picture(),
                'email': obj.email,
                'notifications': obj.notifications(),
                'preferences': obj.preferences(),
                'queued': obj.saved_videos().count(),
                'saved': obj.videos.count(),
                'watched': obj.watched_videos().count(),
                'liked': obj.liked_videos().count()}

    elif isinstance(obj, Source):
        return {'name': obj.name,
                'url': obj.url,
                'favicon': obj.favicon}

    elif isinstance(obj, Thumbnail):
        return {'url': obj.url,
                'width': obj.width,
                'height': obj.height}

    elif isinstance(obj, Video):
        try:
            thumbnail = as_dict(obj.get_thumbnail())
        except Thumbnail.DoesNotExist:
            thumbnail = None

        try:
            source = obj.source
            if source is not None:
                source = as_dict(source)
        except Source.DoesNotExist:
            source = None

        return {'id': obj.id,
                'url': obj.url,
                'title': obj.title,
                'description': obj.description,
                'thumbnail': thumbnail,
                'source': source,
                'saves': UserVideo.save_count(obj),
                'likes': UserVideo.like_count(obj),
                'state': default_app.backend.get_status(obj.task_id)}

    raise Exception('Unknown type:%s' % type(obj))
Example #2
0
def like_by_url(request):
    if not request.user.is_authenticated():
        raise Unauthorized()

    querydict = request.GET if request.method == 'GET' else request.POST
    try:
        normalized_url = url_fix(querydict['url'])
    except KeyError:
        raise BadRequest('Parameter:url missing')
    except MalformedURLException:
        raise BadRequest('Malformed URL:%s' % url)

    try:
        video = Video.objects.get(url=normalized_url)

        try:
            UserVideo.objects.get(user=request.user, video=video, liked_timestamp__isnull=False)
        except UserVideo.DoesNotExist:
            push_like_to_fb.delay(video, request.user)

        user_video = request.user.like_video(video)
        task_id = video.task_id

    except Video.DoesNotExist:
        video = Video(url=normalized_url)
        video.save()

        user_video = UserVideo(user=request.user,
                               video=video,
                               host=request.META.get('HTTP_REFERER'),
                               liked=True,
                               liked_timestamp=datetime.utcnow())
        user_video.save()

        # Fetch video metadata in background
        task = fetch.delay(request.user.id,
                           normalized_url,
                           user_video.host,
                           callback=push_like_to_fb.subtask((request.user, )))

        task_id = task.task_id

    info = as_dict(user_video)
    info['task_id'] = task_id
    info['first'] = request.user.notifications()['firstlike']
    return info
Example #3
0
def add(request):
    if not request.user.is_authenticated():
        raise Unauthorized()

    querydict = request.GET if request.method == 'GET' else request.POST
    try:
        normalized_url = url_fix(querydict['url'])
    except KeyError:
        raise BadRequest('Parameter:url missing')
    except MalformedURLException:
        raise BadRequest('Malformed URL:%s' % url)

    try:
        user_video = UserVideo.objects.get(user=request.user, video__url=normalized_url)

        if user_video.saved:
            raise BadRequest('Video:%s already saved with id:%s' % (user_video.video.url, user_video.video.id))

    except UserVideo.DoesNotExist:
        try:
            video = Video.objects.get(url=normalized_url)
        except Video.DoesNotExist:
            video = Video(url=normalized_url)
            video.save()

        user_video = UserVideo(user=request.user, video=video)

    user_video.saved = True
    user_video.saved_timestamp = datetime.utcnow()
    user_video.host = request.META.get('HTTP_REFERER')
    user_video.save()

    # Fetch video metadata in background
    task = fetch.delay(request.user.id, normalized_url, user_video.host)

    info = as_dict(user_video)
    info.update({'first': request.user.saved_videos().count() == 1,
                 'unwatched': request.user.unwatched_videos().count(),
                 'task_id': task.task_id})

    return info
Example #4
0
def info(request):
    querydict = request.GET if request.method == 'GET' else request.POST

    # Either as GET/POST parameter or REST-style url component
    urls = querydict.get('urls')
    if urls is not None:
      urls = [{ 'url': url } for url in split(r',\s*', urls)]

    # JSON payload in request body
    elif 'videos' in querydict:
      try:
        urls = loads(querydict['videos'])
      except:
        raise BadRequest('No JSON object could be decoded')

    else:
      raise BadRequest('Must supply url list or video array')

    requested, response = dict(), dict()

    try:
      for item in urls:
        try:
          normalized_url = url_fix(item['url'])
          requested[normalized_url] = item

        except MalformedURLException:
          item['success'] = False
          item['error'] = 'Malformed URL'
          response[item['url']] = item

    except (TypeError, KeyError):
      raise BadRequest('Input incorrectly formatted')

    authenticated = request.user.is_authenticated()

    if authenticated:
      for user_video in UserVideo.objects.filter(user=request.user):
        url = user_video.video.url

        try:
          response[url] = requested[url]
        except KeyError:
          continue

        response[url]['normalized'] = url
        response[url]['success'] = True
        response[url]['saved'] = user_video.saved
        response[url]['saves'] = UserVideo.save_count(user_video.video)
        response[url]['liked'] = user_video.liked
        response[url]['likes'] = UserVideo.like_count(user_video.video)

    for url in set(requested.keys()) - set(response.keys()):
      response[url] = requested[url]
      response[url]['normalized'] = url
      response[url]['success'] = True
      response[url]['saved'] = response[url]['liked'] = False

      try:
        video = Video.objects.get(url=url)
        response[url]['saves'] = UserVideo.save_count(video)
        response[url]['likes'] = UserVideo.like_count(video)
      except Video.DoesNotExist:
        response[url]['saves'] = response[url]['likes'] = 0

    return { 'authenticated': authenticated, 'videos': response.values() }