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))
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
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
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() }