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)) for word in request.POST.get('all', '').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') 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({ '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 })