mirror of
https://gitlab.science.ru.nl/technicie/MarietjeDjango.git
synced 2025-12-09 21:52:21 +01:00
Initial commit.
This commit is contained in:
183
marietje/api/views.py
Normal file
183
marietje/api/views.py
Normal file
@ -0,0 +1,183 @@
|
||||
import time
|
||||
from mutagen.mp3 import MP3
|
||||
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
|
||||
from django.http import JsonResponse, HttpResponseForbidden
|
||||
from django.shortcuts import get_object_or_404
|
||||
from django.views.decorators.http import require_http_methods
|
||||
|
||||
from marietje.utils import song_to_dict, playlist_song_to_dict, send_to_bertha
|
||||
|
||||
from songs.models import Song
|
||||
from queues.models import PlaylistSong
|
||||
from .forms import UploadForm
|
||||
|
||||
|
||||
@login_required
|
||||
def songs(request):
|
||||
try:
|
||||
pagesize = int(request.POST.get('pagesize'))
|
||||
except:
|
||||
pagesize = 10
|
||||
|
||||
if pagesize is None or pagesize < 10 or pagesize > 100:
|
||||
pagesize = 10
|
||||
|
||||
try:
|
||||
page = int(request.POST.get('page'))
|
||||
except:
|
||||
page = 1
|
||||
|
||||
songs_query = Song.objects.filter(
|
||||
deleted=False,
|
||||
artist__icontains=request.POST.get('artist', ''),
|
||||
title__icontains=request.POST.get('title', ''),
|
||||
user__name__icontains=request.POST.get('uploader', ''))
|
||||
total = len(songs_query)
|
||||
paginator = Paginator(songs_query, pagesize)
|
||||
|
||||
try:
|
||||
songs = paginator.page(page)
|
||||
except PageNotAnInteger:
|
||||
songs = paginator.page(1)
|
||||
except EmptyPage:
|
||||
songs = paginator.page(paginator.num_pages)
|
||||
|
||||
songs_dict = [song_to_dict(song) for song in songs.object_list]
|
||||
|
||||
return JsonResponse({
|
||||
'total': total,
|
||||
'per_page': pagesize,
|
||||
'current_page': page,
|
||||
'last_page': paginator.num_pages,
|
||||
'data': songs_dict
|
||||
})
|
||||
|
||||
|
||||
@login_required
|
||||
def managesongs(request):
|
||||
try:
|
||||
pagesize = int(request.POST.get('pagesize'))
|
||||
except:
|
||||
pagesize = 10
|
||||
|
||||
if pagesize is None or pagesize < 10 or pagesize > 100:
|
||||
pagesize = 10
|
||||
|
||||
try:
|
||||
page = int(request.POST.get('page'))
|
||||
except:
|
||||
page = 1
|
||||
|
||||
songs_query = Song.objects.filter(
|
||||
user=request.user, deleted=False,
|
||||
artist__icontains=request.POST.get('artist', ''),
|
||||
title__icontains=request.POST.get('title', ''))
|
||||
|
||||
total = len(songs_query)
|
||||
paginator = Paginator(songs_query, pagesize)
|
||||
|
||||
try:
|
||||
songs = paginator.page(page)
|
||||
except PageNotAnInteger:
|
||||
songs = paginator.page(1)
|
||||
except EmptyPage:
|
||||
songs = paginator.page(paginator.num_pages)
|
||||
|
||||
songs_dict = [song_to_dict(song) for song in songs.object_list]
|
||||
|
||||
return JsonResponse({
|
||||
'total': total,
|
||||
'per_page': pagesize,
|
||||
'current_page': page,
|
||||
'last_page': paginator.num_pages,
|
||||
'data': songs_dict
|
||||
})
|
||||
|
||||
|
||||
@login_required
|
||||
def queue(request):
|
||||
queue = request.user.queue
|
||||
return JsonResponse({
|
||||
'current_song': playlist_song_to_dict(queue.current_song()),
|
||||
'queue': [playlist_song_to_dict(playlist_song) for playlist_song in queue.queue()],
|
||||
'started_at': 0 if queue.started_at is None else int(time.mktime(queue.started_at.timetuple())),
|
||||
'current_time': int(time.time())
|
||||
})
|
||||
|
||||
|
||||
@login_required
|
||||
def skip(request):
|
||||
playlist_song = request.user.queue.current_song()
|
||||
if playlist_song.user != request.user and not request.user.has_perm('queues.can_skip'):
|
||||
return HttpResponseForbidden()
|
||||
|
||||
playlist_song.state = 2
|
||||
playlist_song.save()
|
||||
|
||||
return JsonResponse({})
|
||||
|
||||
|
||||
@require_http_methods(["POST"])
|
||||
@login_required
|
||||
def move_up(request):
|
||||
if not request.user.has_perm('queues.can_move'):
|
||||
return HttpResponseForbidden()
|
||||
playlist_song = get_object_or_404(PlaylistSong, id=request.POST.get('id'))
|
||||
playlist_song.move_up()
|
||||
return JsonResponse({})
|
||||
|
||||
|
||||
@require_http_methods(["POST"])
|
||||
@login_required
|
||||
def move_down(request):
|
||||
playlist_song = get_object_or_404(PlaylistSong, id=request.POST.get('id'))
|
||||
if playlist_song.user != request.user and not request.user.has_perm('queues.can_move'):
|
||||
return HttpResponseForbidden()
|
||||
playlist_song.move_up()
|
||||
return JsonResponse({})
|
||||
|
||||
|
||||
@require_http_methods(["POST"])
|
||||
@login_required
|
||||
def cancel(request):
|
||||
playlist_song = get_object_or_404(PlaylistSong, id=request.POST.get('id'))
|
||||
if playlist_song.user != request.user and not request.user.has_perm('queues.can_cancel'):
|
||||
return HttpResponseForbidden()
|
||||
playlist_song.state = 3
|
||||
playlist_song.save()
|
||||
return JsonResponse({})
|
||||
|
||||
|
||||
@require_http_methods(["POST"])
|
||||
@login_required
|
||||
def request(request):
|
||||
queue = request.user.queue
|
||||
song = get_object_or_404(Song, id=request.POST.get('id'), deleted=False)
|
||||
queue.request(song, request.user)
|
||||
|
||||
return JsonResponse({
|
||||
'success': True
|
||||
})
|
||||
|
||||
|
||||
@require_http_methods(["POST"])
|
||||
@login_required
|
||||
def upload(request):
|
||||
form = UploadForm(request.POST, request.FILES)
|
||||
if not form.is_valid():
|
||||
return JsonResponse({
|
||||
'success': False, 'errorMessage': 'File not uploaded correctly.'
|
||||
})
|
||||
|
||||
file = request.FILES['file']
|
||||
|
||||
duration = MP3(file).info.length
|
||||
hash = send_to_bertha(file)
|
||||
song = Song(user=request.user, artist=request.POST.get('artist'), title=request.POST.get('title'), hash=hash, duration=duration)
|
||||
song.save()
|
||||
|
||||
return JsonResponse({
|
||||
'success': True
|
||||
})
|
||||
Reference in New Issue
Block a user