diff --git a/manager/admin.py b/manager/admin.py index 3f18eb2..4b37be1 100644 --- a/manager/admin.py +++ b/manager/admin.py @@ -1,9 +1,10 @@ from django.contrib import admin -from manager.models import Playlist, Track, Artist, PlaylistEntry +from manager.models import Playlist, Track, Artist, PlaylistEntry, PlaylistSession admin.site.register(Playlist) admin.site.register(Track) admin.site.register(Artist) admin.site.register(PlaylistEntry) +admin.site.register(PlaylistSession) # Register your models here. diff --git a/manager/fields.py b/manager/fields.py new file mode 100644 index 0000000..638b3ee --- /dev/null +++ b/manager/fields.py @@ -0,0 +1,40 @@ +from django.db import models +from django.core.serializers.json import DjangoJSONEncoder +import json + +class JSONField(models.TextField): + + """ + JSONField is a generic textfield that neatly serializes/unserializes + JSON objects seamlessly. + Django snippet #1478 + + example: + class Page(models.Model): + data = JSONField(blank=True, null=True) + + + page = Page.objects.get(pk=5) + page.data = {'title': 'test', 'type': 3} + page.save() + """ + + __metaclass__ = models.SubfieldBase + + def to_python(self, value): + if value == "": + return None + + try: + if isinstance(value, basestring): + return json.loads(value) + except ValueError: + pass + return value + + def get_db_prep_save(self, value, *args, **kwargs): + if value == "": + return None + if isinstance(value, dict): + value = json.dumps(value, cls=DjangoJSONEncoder) + return super(JSONField, self).get_db_prep_save(value, *args, **kwargs) diff --git a/manager/models.py b/manager/models.py index 0659b2d..b7777b7 100644 --- a/manager/models.py +++ b/manager/models.py @@ -1,18 +1,24 @@ from django.db import models -import pprint -import sys -import os -import subprocess +# import pprint +# import sys +# import os +# import subprocess +import unicodedata import requests import json -def import_playlists(userid = 674215921): - user_playlists=json.loads(requests.get("https://api.deezer.com/user/" + str(userid) + "/playlists").text)['data'] +from fields import JSONField + + +def import_playlists(userid=674215921): + user_playlists = json.loads(requests.get( + "https://api.deezer.com/user/" + str(userid) + "/playlists").text)['data'] for playlist in user_playlists: - json_result=requests.get("https://api.deezer.com/playlist/" + str(playlist['id'])) - playlist_tracks=json.loads(json_result.text)['tracks']['data'] - if not Playlist.objects.filter(DeezerId= int(playlist['id'])).exists(): + json_result = requests.get( + "https://api.deezer.com/playlist/" + str(playlist['id'])) + playlist_tracks = json.loads(json_result.text)['tracks']['data'] + if not Playlist.objects.filter(DeezerId=int(playlist['id'])).exists(): pl = Playlist() pl.title = playlist['title'] pl.DeezerId = playlist['id'] @@ -23,7 +29,7 @@ def import_playlists(userid = 674215921): pl.save() for track in playlist_tracks: - if not Artist.objects.filter(DeezerId= int(track['artist']['id'])).exists(): + if not Artist.objects.filter(DeezerId=int(track['artist']['id'])).exists(): art = Artist() art.name = track['artist']['name'] art.DeezerId = track['artist']['id'] @@ -31,17 +37,19 @@ def import_playlists(userid = 674215921): # art.picture = track['artist']['picture'] art.save() - if not Track.objects.filter(DeezerId= int(track['id'])).exists(): + if not Track.objects.filter(DeezerId=int(track['id'])).exists(): tr = Track() tr.title = track['title'] tr.DeezerId = track['id'] tr.link = track['link'] tr.duration = track['duration'] - tr.ArtistId = Artist.objects.filter(DeezerId=int(track['artist']['id'])).first() + tr.ArtistId = Artist.objects.filter( + DeezerId=int(track['artist']['id'])).first() tr.save() tr_id = Track.objects.filter(DeezerId=int(track['id'])).first() - pl_id = Playlist.objects.filter(DeezerId=int(playlist['id'])).first() + pl_id = Playlist.objects.filter( + DeezerId=int(playlist['id'])).first() if not PlaylistEntry.objects.filter(TrackId=tr_id, PlaylistId=pl_id).exists(): pl_ent = PlaylistEntry() @@ -51,6 +59,8 @@ def import_playlists(userid = 674215921): pl_ent.save() # Create your models here. + + class Playlist(models.Model): title = models.CharField(max_length=100) DeezerId = models.IntegerField(unique=True) @@ -68,6 +78,16 @@ def getMinutes(self): def __str__(self): # __unicode__ on Python 2 return self.title + def to_dict(self): + dico = { + "DeezerId": self.DeezerId, + "description": self.description, + "link": self.link, + "picture": self.picture, + "duration": self.duration + } + return dico + class Artist(models.Model): name = models.CharField(max_length=100) @@ -78,6 +98,17 @@ class Artist(models.Model): def __str__(self): # __unicode__ on Python 2 return self.name + def to_dict(self): + dico = { + "name": self.name[:16], + # "name": remove_accents(self.name[:16]), + "DeezerId": self.DeezerId, + "link": self.link, + "picture": self.picture, + } + return dico + + class Track(models.Model): title = models.CharField(max_length=100) DeezerId = models.IntegerField(unique=True) @@ -91,9 +122,24 @@ def getMinutes(self): else: return 'unknown' + def getmSec(self): + return "%d " % (self.duration * 1000) + def __str__(self): # __unicode__ on Python 2 return self.title + def to_dict(self): + dico = { + "title": remove_accents(self.title[:25]), + "DeezerId": self.DeezerId, + "link": self.link, + "duration": self.duration, + "minutes": self.getMinutes(), + "artist": self.ArtistId.to_dict(), + "vote": 0 + } + return dico + class PlaylistEntry(models.Model): PlaylistId = models.ForeignKey(Playlist) @@ -103,3 +149,23 @@ def __str__(self): # __unicode__ on Python 2 string = self.PlaylistId.title + ' - ' + str(elf.TrackId.title) return string + def to_dict(self): + dico = {} + return dico + + +class PlaylistSession(models.Model): + Session = JSONField(blank=True, null=True) + + def __str__(self): # __unicode__ on Python 2 + # string = self.PlaylistId.title + ' - ' + str(elf.TrackId.title) + return str(self.id) + + +def remove_accents(input_str): + nkfd_form = unicodedata.normalize('NFKD', input_str) + only_ascii = nkfd_form.encode('ASCII', 'ignore') + return only_ascii + + + diff --git a/manager/templates/manager/index.html b/manager/templates/manager/index.html new file mode 100644 index 0000000..af25a8a --- /dev/null +++ b/manager/templates/manager/index.html @@ -0,0 +1,33 @@ +{% extends 'base.html' %} +{% block menu%} + {% include "player/menu.html" %} +{% endblock %} +{% block content%} +
+ +
+
+
+
+ +
+ +
+

Sélection d'une playlist

+
+ +
+ +
+ + + {% include "manager/select.html" %} + +
+
+
+
+
+ + +{% endblock %} diff --git a/manager/templates/manager/menu.html b/manager/templates/manager/menu.html new file mode 100644 index 0000000..9579230 --- /dev/null +++ b/manager/templates/manager/menu.html @@ -0,0 +1,6 @@ + +
  • Home
  • +
  • Selection
  • +
  • Update
  • +
  • Admin
  • +
  • Contact
  • \ No newline at end of file diff --git a/manager/templates/manager/select.html b/manager/templates/manager/select.html new file mode 100644 index 0000000..c0fae33 --- /dev/null +++ b/manager/templates/manager/select.html @@ -0,0 +1,14 @@ + +
    + {% csrf_token %} +
    + + +
    + +
    + diff --git a/manager/templates/manager/track_list.html b/manager/templates/manager/track_list.html new file mode 100644 index 0000000..926cfa9 --- /dev/null +++ b/manager/templates/manager/track_list.html @@ -0,0 +1,42 @@ + + (L'id de la playlist est : {{ playlist.DeezerId }}) + + + +
    + Liste des morceaux : + +
    + + + + + + + + + + {% for tr in track_list %} + {% if tr.TrackId == current_track%} + + {% else %} + + {% endif %} + + + + + {% endfor %} + + + +
    Title Artist Duration
    {{tr.TrackId.title}} {{tr.TrackId.ArtistId.name}} {{tr.TrackId.getMinutes}}
    + + + + + + + + + diff --git a/manager/urls.py b/manager/urls.py index 2a744e3..f2c8f5e 100644 --- a/manager/urls.py +++ b/manager/urls.py @@ -4,4 +4,7 @@ urlpatterns = patterns('', url(r'^$', views.index, name='index'), + url(r'^createSession/', views.createSession, name='newSession'), + url(r'^getSession/', views.getSession, name='getSession'), + url(r'^next/', views.nextTrack, name='next'), ) \ No newline at end of file diff --git a/manager/views.py b/manager/views.py index 2951140..58bb6f5 100644 --- a/manager/views.py +++ b/manager/views.py @@ -1,6 +1,109 @@ -from django.shortcuts import render +from django.shortcuts import render, get_object_or_404 from django.http import HttpResponse +from models import Playlist, Track, PlaylistEntry, import_playlists, PlaylistSession + +import json + +from random import randrange # Create your views here. + + def index(request): - return HttpResponse("Hello, world. You're at the manager page.") \ No newline at end of file + # return HttpResponse("Hello, world. You're at the manager page.") + playlists = Playlist.objects.all() + return render(request, 'manager/index.html', {'playlists' : playlists}) + + +def createSession(request): + ''' + Create a new playlist session (json format) from + a playlist id in a post request and + save it in th db + ''' + + data = {"playlist": None, + "current_track": None, + "tracks": None} + + if 'choice' in request.POST: + playlist_id = request.POST['choice'] + playlist = get_object_or_404(Playlist, DeezerId=int(playlist_id)) + + dplaylist = playlist.to_dict() + + track_list = PlaylistEntry.objects.all().filter(PlaylistId=playlist.id) + ldtracks = [] + + for entry in track_list: + ldtracks.append(entry.TrackId.to_dict()) + + + current_track = track_list[0] + dcurrent_track = current_track.to_dict() + + data = {"playlist": dplaylist, + "current_track": dcurrent_track, + "tracks": ldtracks} + + jspData = json.dumps(data, sort_keys=True, indent=4) + new_session = PlaylistSession() + new_session.Session = jspData + new_session.save() + + if 'callback' in request.GET: + jspData = request.GET['callback']+'(' + jsData + ');' + + return HttpResponse(jspData, content_type='application/json') + + +def getSession(request): + if 'session_id' in request.POST: + sess = get_object_or_404(PlaylistSession, id = request.POST['session_id']) + + elif 'session_id' in request.GET: + sess = get_object_or_404(PlaylistSession, id = request.GET['session_id']) + + else: + sess = PlaylistSession.objects.all()[0] + + jspData = json.dumps(sess.Session, sort_keys=True, indent=4) + + return HttpResponse(jspData, content_type='application/json') + +def nextTrack(request): + if 'session_id' in request.POST: + sess = get_object_or_404(PlaylistSession, id = request.POST['session_id']) + + elif 'session_id' in request.GET: + sess = get_object_or_404(PlaylistSession, id = request.GET['session_id']) + + else: + sess = PlaylistSession.objects.all()[0] + + # >>> sorted(student_objects, key=lambda student: student.age) # sort by age + # [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)] + track_list = sess.Session["tracks"] + + maxVote = 0 + # nextTrack = sess.Session["current_track"]["DeezerId"] + # nextTrack = track_list[0]["DeezerId"] + nextTrack = track_list[randrange(len(track_list))]["DeezerId"] + + for track in track_list: + if track['vote'] > maxVote: + nextTrack = track["DeezerId"] + + print nextTrack + + current_track = get_object_or_404(Track, DeezerId = nextTrack) + dcurrent_track = current_track.to_dict() + + sess.Session["current_track"] = dcurrent_track + + sess.save() + + jspData = json.dumps(sess.Session, sort_keys=True, indent=4) + + return HttpResponse(jspData, content_type='application/json') +