1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- import json
- import logging
- import dateutil
- from django.views.decorators.csrf import csrf_exempt
- from django.views.generic.list import ListView
- from rest_framework import status
- from rest_framework.decorators import api_view
- from rest_framework.response import Response
- from scrobbles.models import Scrobble
- from scrobbles.serializers import ScrobbleSerializer
- from videos.models import Series, Video
- logger = logging.getLogger(__name__)
- TRUTHY_VALUES = [
- 'true',
- '1',
- 't',
- 'y',
- 'yes',
- 'yeah',
- 'yup',
- 'certainly',
- 'uh-huh',
- ]
- class RecentScrobbleList(ListView):
- model = Scrobble
- @csrf_exempt
- @api_view(['GET', 'POST'])
- def scrobble_list(request):
- """List all Scrobbles, or create a new Scrobble"""
- if request.method == 'GET':
- scrobble = Scrobble.objects.all()
- serializer = ScrobbleSerializer(scrobble, many=True)
- return Response(serializer.data)
- elif request.method == 'POST':
- data_dict = json.loads(request.data["_content"])
- media_type = data_dict["ItemType"]
- # Check if it's a TV Episode
- video_dict = {
- "title": data_dict["Name"],
- "imdb_id": data_dict["Provider_imdb"],
- "video_type": Video.VideoType.MOVIE,
- }
- if media_type == 'Episode':
- series_name = data_dict["SeriesName"]
- series = Series.objects.get_or_create(name=series_name)
- video_dict['video_type'] = Video.VideoType.TV_EPISODE
- video_dict["tv_series_id"] = series.id
- video_dict["episode_num"] = data_dict["EpisodeNumber"]
- video_dict["season_num"] = data_dict["SeasonNumber"]
- video_dict["tvdb_id"] = data_dict["Provider_tvdb"]
- video_dict["tvrage_id"] = data_dict["Provider_tvrage"]
- video, _created = Video.objects.get_or_create(**video_dict)
- video.year = data_dict["Year"]
- video.overview = data_dict["Overview"]
- video.tagline = data_dict["Tagline"]
- video.run_time_ticks = data_dict["RunTimeTicks"]
- video.run_time = data_dict["RunTime"]
- video.save()
- # Now we run off a scrobble
- scrobble_dict = {
- 'video_id': video.id,
- 'user_id': request.user.id,
- }
- scrobble, scrobble_created = Scrobble.objects.get_or_create(
- **scrobble_dict
- )
- if scrobble_created:
- scrobble.source = data_dict['ClientName']
- scrobble.source_id = data_dict['MediaSourceId']
- # Update a found scrobble with new position and timestamp
- scrobble.playback_position_ticks = data_dict["PlaybackPositionTicks"]
- scrobble.playback_position = data_dict["PlaybackPosition"]
- scrobble.timestamp = dateutil.parser.parse(data_dict["UtcTimestamp"])
- scrobble.is_paused = data_dict["IsPaused"] in TRUTHY_VALUES
- scrobble.played_to_completion = (
- data_dict["PlayedToCompletion"] in TRUTHY_VALUES
- )
- scrobble.save()
- logger.info(f"You are {scrobble.percent_played}% through {video}")
- return Response(video_dict, status=status.HTTP_201_CREATED)
- # return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|