From 1c1ffcb32068fb3b25e042da86adffadba5eae35 Mon Sep 17 00:00:00 2001 From: Kenta Iwami Date: Fri, 10 Nov 2017 00:22:30 +0900 Subject: [PATCH 1/9] =?UTF-8?q?bae64=E3=82=92=E5=8F=97=E3=81=91=E5=8F=96?= =?UTF-8?q?=E3=82=8B=E3=81=9F=E3=82=81=E3=81=AEserializer=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/emil/serializer.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/server/emil/serializer.py b/server/emil/serializer.py index df36ce0..58d383d 100644 --- a/server/emil/serializer.py +++ b/server/emil/serializer.py @@ -8,14 +8,14 @@ class Meta: fields = ('random_id', 'available_smileage', 'used_smileage') -# class SoundSerializer(serializers.Serializer): -# content_type = serializers.CharField(allow_blank=False, allow_null=False, required=True) -# filename = serializers.CharField(allow_blank=False, allow_null=False, required=True) -# file_data = serializers.CharField(allow_blank=False, allow_null=False, required=True) +class SoundDetailSerializer(serializers.Serializer): + content_type = serializers.CharField(allow_blank=False, allow_null=False, required=True) + filename = serializers.CharField(allow_blank=False, allow_null=False, required=True) + file_data = serializers.CharField(allow_blank=False, allow_null=False, required=True) -# class PostCafSerializer(serializers.Serializer): -# sound = serializers.CharField(allow_blank=False, allow_null=False, required=True) +class SoundSerializer(serializers.Serializer): + sound = serializers.CharField(allow_blank=False, allow_null=False, required=True) class LaughsSerializer(serializers.Serializer): From c77299cd969ab3a6467e1b19f39b067795e0a2f8 Mon Sep 17 00:00:00 2001 From: Kenta Iwami Date: Fri, 10 Nov 2017 00:44:19 +0900 Subject: [PATCH 2/9] =?UTF-8?q?base64=E5=8F=97=E3=81=91=E5=8F=96=E3=82=8A?= =?UTF-8?q?=E3=81=AE=E3=82=A8=E3=83=A9=E3=83=BC=E5=87=A6=E7=90=86=E3=82=92?= =?UTF-8?q?=E8=A8=98=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/emil/urls.py | 2 +- server/emil/views.py | 45 ++++++++++++++++++++++++-------------------- 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/server/emil/urls.py b/server/emil/urls.py index 99e6c60..f36361c 100644 --- a/server/emil/urls.py +++ b/server/emil/urls.py @@ -4,7 +4,7 @@ router = routers.DefaultRouter() router.register(r'users/(?P[0-9])', UsersViewSet, 'users') -# router.register(r'post_caf', PostCafViewSet, 'post_caf') router.register(r'laughs/(?P[0-9])/(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2})', LaughsViewSet, 'laughs') router.register(r'laughs/detail/(?P[0-9])/(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2})', LaughsDetailViewSet, 'laughs-detail') router.register(r'laugh', LaughViewSet, 'laugh') +router.register(r'sound', SoundViewSet, 'sound') diff --git a/server/emil/views.py b/server/emil/views.py index fc51d23..51bbe21 100644 --- a/server/emil/views.py +++ b/server/emil/views.py @@ -1,3 +1,5 @@ +import json + from django.core.exceptions import ObjectDoesNotExist from rest_framework import viewsets from rest_framework.exceptions import ValidationError @@ -25,26 +27,6 @@ def get_queryset(self): return User.objects.get(id=self.kwargs.get('user_id')) -# class PostCafViewSet(viewsets.ViewSet): -# -# @staticmethod -# def create(request): -# if request.method == 'POST': -# serializer = PostCafSerializer(data=request.data) -# -# if serializer.is_valid(): -# serializer = SoundSerializer(data=json.loads(request.data['sound'])) -# -# if serializer.is_valid(): -# return Response({'result': 'OK'}) -# else: -# return Response(serializer.errors) -# else: -# return Response(serializer.errors) -# else: -# return Response('Not Allow GET method') - - class LaughsViewSet(viewsets.ModelViewSet): http_method_names = ['get'] serializer_class = LaughsSerializer @@ -183,3 +165,26 @@ def create(self, request, *args, **kwargs): def get_queryset(self): return User.objects.get(random_id=self.request.data['user_id']) + + +class SoundViewSet(viewsets.ModelViewSet): + http_method_names = ['post'] + serializer_class = SoundSerializer + + def create(self, request, *args, **kwargs): + if request.method == 'POST': + sound_serializer = SoundSerializer(data=request.data) + + if not sound_serializer.is_valid(): + return Response(sound_serializer.errors) + + try: + sound_detail_serializer = SoundDetailSerializer(data=json.loads(request.data['sound'])) + except ValueError: + raise ValidationError('JSON parse error', 400) + + if not sound_detail_serializer.is_valid(): + return Response(sound_detail_serializer.errors) + + + return Response(json.loads(request.data['sound'])) From 1ffd2e01436d1f92737c95136c57c8e6868fbd86 Mon Sep 17 00:00:00 2001 From: Kenta Iwami Date: Fri, 10 Nov 2017 02:43:04 +0900 Subject: [PATCH 3/9] =?UTF-8?q?sample=E3=81=AEmp4=E3=82=92=E8=A8=AD?= =?UTF-8?q?=E7=BD=AE=E3=81=97=E3=81=A6=E3=81=BF=E3=81=A6=E3=80=81=E3=82=A8?= =?UTF-8?q?=E3=83=B3=E3=82=B3=E3=83=BC=E3=83=89=E3=83=BB=E3=83=87=E3=82=B3?= =?UTF-8?q?=E3=83=BC=E3=83=89=E3=82=92=E3=83=86=E3=82=B9=E3=83=88=E3=81=97?= =?UTF-8?q?=E3=81=A6=E5=8B=95=E3=81=8F=E3=81=93=E3=81=A8=E3=82=92=E7=A2=BA?= =?UTF-8?q?=E8=AA=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/.gitignore | 4 +++- server/emil/views.py | 13 ++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/server/.gitignore b/server/.gitignore index 2424334..eecf321 100644 --- a/server/.gitignore +++ b/server/.gitignore @@ -157,4 +157,6 @@ venv.bak/ server/settings.py .idea/ -db.sqlite3 \ No newline at end of file +db.sqlite3 + +*.mp4 \ No newline at end of file diff --git a/server/emil/views.py b/server/emil/views.py index 51bbe21..081926c 100644 --- a/server/emil/views.py +++ b/server/emil/views.py @@ -1,5 +1,5 @@ import json - +import base64 from django.core.exceptions import ObjectDoesNotExist from rest_framework import viewsets from rest_framework.exceptions import ValidationError @@ -186,5 +186,16 @@ def create(self, request, *args, **kwargs): if not sound_detail_serializer.is_valid(): return Response(sound_detail_serializer.errors) + # TODO 実際に受け取ったbase64をデコードして保存してみる + f = open('tmp/sample.mp4', 'rb') + encoded = base64.b64encode(f.read()) + f.close() + + f = open('tmp/sample_copy.mp4', 'wb') + f.write(base64.b64decode(encoded)) + f.close() return Response(json.loads(request.data['sound'])) + + def get_queryset(self): + pass From 13ce58a62d00ff7b535aa441b23c1106961ba7c0 Mon Sep 17 00:00:00 2001 From: Kenta Iwami Date: Fri, 10 Nov 2017 12:07:01 +0900 Subject: [PATCH 4/9] =?UTF-8?q?=E3=83=87=E3=82=B3=E3=83=BC=E3=83=89?= =?UTF-8?q?=E3=81=97=E3=81=9F=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E3=81=8C?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E3=81=95=E3=82=8C=E3=82=8B=E3=81=93=E3=81=A8?= =?UTF-8?q?=E3=82=92=E7=A2=BA=E8=AA=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/emil/views.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/server/emil/views.py b/server/emil/views.py index 081926c..c69a639 100644 --- a/server/emil/views.py +++ b/server/emil/views.py @@ -187,15 +187,17 @@ def create(self, request, *args, **kwargs): return Response(sound_detail_serializer.errors) # TODO 実際に受け取ったbase64をデコードして保存してみる - f = open('tmp/sample.mp4', 'rb') - encoded = base64.b64encode(f.read()) - f.close() + # f = open('tmp/sample.mp4', 'rb') + # encoded = base64.b64encode(f.read()) + # f.close() + + json_data = json.loads(request.data['sound']) - f = open('tmp/sample_copy.mp4', 'wb') - f.write(base64.b64decode(encoded)) + f = open('tmp/'+json_data['filename'], 'wb') + f.write(base64.b64decode(json_data['file_data'])) f.close() - return Response(json.loads(request.data['sound'])) + return Response('OK') def get_queryset(self): pass From 996955784ad98a9d1440d2b3ccb29726fdb99be3 Mon Sep 17 00:00:00 2001 From: Kenta Iwami Date: Fri, 10 Nov 2017 13:19:30 +0900 Subject: [PATCH 5/9] =?UTF-8?q?=E3=82=BF=E3=82=A4=E3=83=A0=E3=82=B9?= =?UTF-8?q?=E3=82=BF=E3=83=B3=E3=83=97=E4=BB=98=E3=81=8D=E3=81=AEmp4?= =?UTF-8?q?=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E3=82=92=E7=94=9F=E6=88=90?= =?UTF-8?q?=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/.gitignore | 2 +- server/emil/serializer.py | 9 ++------- server/emil/views.py | 35 +++++++++++++++++++---------------- 3 files changed, 22 insertions(+), 24 deletions(-) diff --git a/server/.gitignore b/server/.gitignore index eecf321..340c0d5 100644 --- a/server/.gitignore +++ b/server/.gitignore @@ -159,4 +159,4 @@ server/settings.py .idea/ db.sqlite3 -*.mp4 \ No newline at end of file +tmp/ \ No newline at end of file diff --git a/server/emil/serializer.py b/server/emil/serializer.py index 58d383d..ab0daa6 100644 --- a/server/emil/serializer.py +++ b/server/emil/serializer.py @@ -8,14 +8,9 @@ class Meta: fields = ('random_id', 'available_smileage', 'used_smileage') -class SoundDetailSerializer(serializers.Serializer): - content_type = serializers.CharField(allow_blank=False, allow_null=False, required=True) - filename = serializers.CharField(allow_blank=False, allow_null=False, required=True) - file_data = serializers.CharField(allow_blank=False, allow_null=False, required=True) - - class SoundSerializer(serializers.Serializer): - sound = serializers.CharField(allow_blank=False, allow_null=False, required=True) + user_id = serializers.CharField(allow_null=False, allow_blank=False, required=True, max_length=10) + file_data = serializers.CharField(allow_blank=False, allow_null=False, required=True) class LaughsSerializer(serializers.Serializer): diff --git a/server/emil/views.py b/server/emil/views.py index c69a639..efb5ae2 100644 --- a/server/emil/views.py +++ b/server/emil/views.py @@ -16,12 +16,12 @@ def list(self, request, **kwargs): try: user = self.get_queryset() except ObjectDoesNotExist: - raise ValidationError(404) + raise ValidationError(404) return Response({ 'available': user.available_smileage, 'used': user.used_smileage - }) + }) def get_queryset(self): return User.objects.get(id=self.kwargs.get('user_id')) @@ -73,7 +73,8 @@ def list(self, request, **kwargs): if serializer.is_valid(): - weekday = datetime.strptime(kwargs.get('year') + '/' + kwargs.get('month') + '/' + kwargs.get('day'), '%Y/%m/%d').weekday() + weekday = datetime.strptime(kwargs.get('year') + '/' + kwargs.get('month') + '/' + kwargs.get('day'), + '%Y/%m/%d').weekday() # 指定された日付が日曜日かをチェック if weekday != 6: @@ -124,7 +125,8 @@ def list(self, request, **kwargs): # print(start, end, laughs.filter(created_at__range=(start, end)).count()) # 1コマに笑った回数を記録 - day_laughs_by_one_class.append(laughs.filter(created_at__range=(start+timedelta(hours=9), end+timedelta(hours=9))).count()) + day_laughs_by_one_class.append( + laughs.filter(created_at__range=(start + timedelta(hours=9), end + timedelta(hours=9))).count()) start = start + timedelta(days=1) end = end + timedelta(days=1) @@ -178,26 +180,27 @@ def create(self, request, *args, **kwargs): if not sound_serializer.is_valid(): return Response(sound_serializer.errors) - try: - sound_detail_serializer = SoundDetailSerializer(data=json.loads(request.data['sound'])) - except ValueError: - raise ValidationError('JSON parse error', 400) - - if not sound_detail_serializer.is_valid(): - return Response(sound_detail_serializer.errors) + json_data = dict(request.data) # TODO 実際に受け取ったbase64をデコードして保存してみる # f = open('tmp/sample.mp4', 'rb') # encoded = base64.b64encode(f.read()) # f.close() - json_data = json.loads(request.data['sound']) + now = datetime.now() + now_str = now.strftime('%Y-%m-%d %H:%M:%S') + + filename = 'tmp/' + json_data['user_id'][0] + '_' + now_str + '.mp4' + + try: + f = open(filename, 'wb') + except ValidationError: + raise ValidationError(404) - f = open('tmp/'+json_data['filename'], 'wb') - f.write(base64.b64decode(json_data['file_data'])) + f.write(base64.b64decode(json_data['file_data'][0])) f.close() - return Response('OK') + return Response(filename) def get_queryset(self): - pass + return User.objects.get(id=self.request.data['user_id']) From 72f2b6335654774ffbd3b68ed5b56ba9eee6a987 Mon Sep 17 00:00:00 2001 From: Kenta Iwami Date: Sat, 11 Nov 2017 01:23:35 +0900 Subject: [PATCH 6/9] =?UTF-8?q?post=E3=81=95=E3=82=8C=E3=81=9Fbase64?= =?UTF-8?q?=E6=96=87=E5=AD=97=E5=88=97(caf)=E3=82=92=E3=83=87=E3=82=B3?= =?UTF-8?q?=E3=83=BC=E3=83=89=E3=81=97=E3=81=A6=E4=BF=9D=E5=AD=98=E3=81=99?= =?UTF-8?q?=E3=82=8B=E5=87=A6=E7=90=86=E3=82=92=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/emil/views.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/server/emil/views.py b/server/emil/views.py index efb5ae2..69b7e30 100644 --- a/server/emil/views.py +++ b/server/emil/views.py @@ -183,21 +183,23 @@ def create(self, request, *args, **kwargs): json_data = dict(request.data) # TODO 実際に受け取ったbase64をデコードして保存してみる - # f = open('tmp/sample.mp4', 'rb') + # f = open('tmp/recording1.caf', 'rb') # encoded = base64.b64encode(f.read()) # f.close() + # パッティングして規定に合わせる + encoded = json_data['file_data'][0] + missing_padding = len(encoded) % 4 + if missing_padding != 0: + encoded += b'=' * (4 - len(encoded) % 4) + now = datetime.now() now_str = now.strftime('%Y-%m-%d %H:%M:%S') - filename = 'tmp/' + json_data['user_id'][0] + '_' + now_str + '.mp4' - - try: - f = open(filename, 'wb') - except ValidationError: - raise ValidationError(404) + filename = 'tmp/' + json_data['user_id'][0] + '_' + now_str + '.caf' - f.write(base64.b64decode(json_data['file_data'][0])) + f = open(filename, 'wb') + f.write(base64.b64decode(encoded)) f.close() return Response(filename) From 751037ada8078bf044401a68ba118acc6bb25709 Mon Sep 17 00:00:00 2001 From: Kenta Iwami Date: Sat, 11 Nov 2017 01:34:06 +0900 Subject: [PATCH 7/9] add filename_base(before extension) --- server/emil/views.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/server/emil/views.py b/server/emil/views.py index 69b7e30..26bafa4 100644 --- a/server/emil/views.py +++ b/server/emil/views.py @@ -196,13 +196,14 @@ def create(self, request, *args, **kwargs): now = datetime.now() now_str = now.strftime('%Y-%m-%d %H:%M:%S') - filename = 'tmp/' + json_data['user_id'][0] + '_' + now_str + '.caf' + filename_base = 'tmp/' + json_data['user_id'][0] + '_' + now_str + filename_caf = filename_base + '.caf' - f = open(filename, 'wb') + f = open(filename_caf, 'wb') f.write(base64.b64decode(encoded)) f.close() - return Response(filename) + return Response(filename_caf) def get_queryset(self): return User.objects.get(id=self.request.data['user_id']) From 7b43ca1ad99a8cda4c69524ebf11b04afe834e52 Mon Sep 17 00:00:00 2001 From: Kenta Iwami Date: Sat, 11 Nov 2017 10:42:27 +0900 Subject: [PATCH 8/9] =?UTF-8?q?=E5=A4=89=E6=95=B0=E3=81=AE=E5=89=8A?= =?UTF-8?q?=E9=99=A4=E3=80=81[0]=E3=82=92=E6=8C=87=E5=AE=9A=E3=81=97?= =?UTF-8?q?=E3=81=A61=E6=96=87=E5=AD=97=E6=8A=BD=E5=87=BA=E3=81=A0?= =?UTF-8?q?=E3=81=91=E3=81=97=E3=81=A6=E3=81=84=E3=81=9F=E3=81=AE=E3=82=92?= =?UTF-8?q?=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/emil/views.py | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/server/emil/views.py b/server/emil/views.py index 26bafa4..65445ea 100644 --- a/server/emil/views.py +++ b/server/emil/views.py @@ -1,4 +1,4 @@ -import json +import os import base64 from django.core.exceptions import ObjectDoesNotExist from rest_framework import viewsets @@ -8,6 +8,7 @@ from .serializer import * + class UsersViewSet(viewsets.ModelViewSet): http_method_names = ['get'] serializer_class = UserSerializer @@ -183,25 +184,32 @@ def create(self, request, *args, **kwargs): json_data = dict(request.data) # TODO 実際に受け取ったbase64をデコードして保存してみる + + # print(type(json_data['file_data'])) # f = open('tmp/recording1.caf', 'rb') # encoded = base64.b64encode(f.read()) # f.close() - # パッティングして規定に合わせる - encoded = json_data['file_data'][0] + encoded = json_data['file_data'] + + # 規定に合わせるために=で埋め合わせ missing_padding = len(encoded) % 4 if missing_padding != 0: - encoded += b'=' * (4 - len(encoded) % 4) + encoded += '=' * (4 - len(encoded) % 4) now = datetime.now() now_str = now.strftime('%Y-%m-%d %H:%M:%S') - filename_base = 'tmp/' + json_data['user_id'][0] + '_' + now_str - filename_caf = filename_base + '.caf' + filename_caf = 'tmp/' + json_data['user_id'][0] + '_' + now_str + '.caf' f = open(filename_caf, 'wb') - f.write(base64.b64decode(encoded)) - f.close() + + try: + f.write(base64.b64decode(encoded)) + f.close() + except ValueError: + os.remove(filename_caf) + raise ValueError(500) return Response(filename_caf) From 904158e03951d9267f5a09520cce3eda364cf3f8 Mon Sep 17 00:00:00 2001 From: Kenta Iwami Date: Sat, 11 Nov 2017 12:08:27 +0900 Subject: [PATCH 9/9] code fix --- server/emil/views.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/server/emil/views.py b/server/emil/views.py index 65445ea..10c96e7 100644 --- a/server/emil/views.py +++ b/server/emil/views.py @@ -8,7 +8,6 @@ from .serializer import * - class UsersViewSet(viewsets.ModelViewSet): http_method_names = ['get'] serializer_class = UserSerializer @@ -182,14 +181,6 @@ def create(self, request, *args, **kwargs): return Response(sound_serializer.errors) json_data = dict(request.data) - - # TODO 実際に受け取ったbase64をデコードして保存してみる - - # print(type(json_data['file_data'])) - # f = open('tmp/recording1.caf', 'rb') - # encoded = base64.b64encode(f.read()) - # f.close() - encoded = json_data['file_data'] # 規定に合わせるために=で埋め合わせ