views.py 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import json
  2. import logging
  3. import dateutil
  4. from django.views.decorators.csrf import csrf_exempt
  5. from django.views.generic.list import ListView
  6. from rest_framework import status
  7. from rest_framework.decorators import api_view
  8. from rest_framework.response import Response
  9. from scrobbles.models import Scrobble
  10. from scrobbles.serializers import ScrobbleSerializer
  11. from videos.models import Series, Video
  12. logger = logging.getLogger(__name__)
  13. TRUTHY_VALUES = [
  14. 'true',
  15. '1',
  16. 't',
  17. 'y',
  18. 'yes',
  19. 'yeah',
  20. 'yup',
  21. 'certainly',
  22. 'uh-huh',
  23. ]
  24. class RecentScrobbleList(ListView):
  25. model = Scrobble
  26. @csrf_exempt
  27. @api_view(['GET', 'POST'])
  28. def scrobble_list(request):
  29. """List all Scrobbles, or create a new Scrobble"""
  30. if request.method == 'GET':
  31. scrobble = Scrobble.objects.all()
  32. serializer = ScrobbleSerializer(scrobble, many=True)
  33. return Response(serializer.data)
  34. elif request.method == 'POST':
  35. data_dict = json.loads(request.data["_content"])
  36. media_type = data_dict["ItemType"]
  37. # Check if it's a TV Episode
  38. video_dict = {
  39. "title": data_dict["Name"],
  40. "imdb_id": data_dict["Provider_imdb"],
  41. "video_type": Video.VideoType.MOVIE,
  42. }
  43. if media_type == 'Episode':
  44. series_name = data_dict["SeriesName"]
  45. series = Series.objects.get_or_create(name=series_name)
  46. video_dict['video_type'] = Video.VideoType.TV_EPISODE
  47. video_dict["tv_series_id"] = series.id
  48. video_dict["episode_num"] = data_dict["EpisodeNumber"]
  49. video_dict["season_num"] = data_dict["SeasonNumber"]
  50. video_dict["tvdb_id"] = data_dict["Provider_tvdb"]
  51. video_dict["tvrage_id"] = data_dict["Provider_tvrage"]
  52. video, _created = Video.objects.get_or_create(**video_dict)
  53. video.year = data_dict["Year"]
  54. video.overview = data_dict["Overview"]
  55. video.tagline = data_dict["Tagline"]
  56. video.run_time_ticks = data_dict["RunTimeTicks"]
  57. video.run_time = data_dict["RunTime"]
  58. video.save()
  59. # Now we run off a scrobble
  60. scrobble_dict = {
  61. 'video_id': video.id,
  62. 'user_id': request.user.id,
  63. }
  64. scrobble, scrobble_created = Scrobble.objects.get_or_create(
  65. **scrobble_dict
  66. )
  67. if scrobble_created:
  68. scrobble.source = data_dict['ClientName']
  69. scrobble.source_id = data_dict['MediaSourceId']
  70. # Update a found scrobble with new position and timestamp
  71. scrobble.playback_position_ticks = data_dict["PlaybackPositionTicks"]
  72. scrobble.playback_position = data_dict["PlaybackPosition"]
  73. scrobble.timestamp = dateutil.parser.parse(data_dict["UtcTimestamp"])
  74. scrobble.is_paused = data_dict["IsPaused"] in TRUTHY_VALUES
  75. scrobble.played_to_completion = (
  76. data_dict["PlayedToCompletion"] in TRUTHY_VALUES
  77. )
  78. scrobble.save()
  79. logger.info(f"You are {scrobble.percent_played}% through {video}")
  80. return Response(video_dict, status=status.HTTP_201_CREATED)
  81. # return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)