mirror of
https://gitlab.science.ru.nl/technicie/MarietjeDjango.git
synced 2025-12-09 19:52:20 +01:00
192 lines
5.6 KiB
Python
192 lines
5.6 KiB
Python
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.db.models import Q
|
|
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
|
|
|
|
queries = [Q(deleted=False)]
|
|
queries.extend([Q(Q(artist__icontains=word) | Q(title__icontains=word) | Q(user__name__icontains=word)) for word in request.POST.get('all', '').split()])
|
|
queries.extend([Q(artist__icontains=word) for word in request.POST.get('artist', '').split()])
|
|
queries.extend([Q(title__icontains=word) for word in request.POST.get('title', '').split()])
|
|
queries.extend([Q(user__name__icontains=word) for word in request.POST.get('uploader', '').split()])
|
|
|
|
filter_query = queries.pop()
|
|
for query in queries:
|
|
filter_query &= query
|
|
|
|
songs_query = Song.objects.filter(filter_query).order_by('artist', 'title').select_related('user')
|
|
total = songs_query.count()
|
|
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, user=True) 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', '')
|
|
).order_by('artist', 'title')
|
|
|
|
total = songs_query.count()
|
|
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, user=request.user) 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
|
|
})
|