최지우

비디오 관련 api 수정 및 비디오 저장 프로세스 예시

# Generated by Django 3.1.2 on 2020-11-04 11:24
# Generated by Django 3.1.2 on 2020-11-13 10:30
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
......@@ -35,27 +34,24 @@ class Migration(migrations.Migration):
],
),
migrations.CreateModel(
name='Video',
name='Lock',
fields=[
('vid_id', models.IntegerField(primary_key=True, serialize=False)),
('created', models.DateTimeField(default=django.utils.timezone.now)),
('s3_link', models.CharField(max_length=255)),
('id', models.IntegerField(primary_key=True, serialize=False)),
('state', models.BooleanField(default=True)),
],
),
migrations.CreateModel(
name='Record',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('id', models.IntegerField(primary_key=True, serialize=False)),
('recording', models.BooleanField(default=True)),
('door', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.door')),
],
),
migrations.CreateModel(
name='Lock',
name='Video',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('state', models.BooleanField(default=True)),
('door', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='api.door')),
('vid_name', models.CharField(max_length=255, primary_key=True, serialize=False)),
('created', models.DateTimeField(default=django.utils.timezone.now)),
],
),
]
......
# Generated by Django 3.1.2 on 2020-11-10 10:44
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('api', '0001_initial'),
]
operations = [
migrations.RemoveField(
model_name='lock',
name='door',
),
migrations.RemoveField(
model_name='record',
name='door',
),
migrations.AlterField(
model_name='lock',
name='id',
field=models.IntegerField(primary_key=True, serialize=False),
),
migrations.AlterField(
model_name='record',
name='id',
field=models.IntegerField(primary_key=True, serialize=False),
),
]
......@@ -11,9 +11,8 @@ class Device(models.Model) :
created = models.DateTimeField(default = timezone.now)
class Video(models.Model) :
vid_id = models.IntegerField(primary_key = True)
vid_name = models.CharField(max_length = 255, primary_key = True)
created = models.DateTimeField(default = timezone.now)
s3_link = models.CharField(max_length = 255)
class Lock(models.Model) :
id = models.IntegerField(primary_key = True)
......
import os
import boto3
import botocore
import time
import datetime
from django.core import serializers
from api.models import Video, Record
from api.serializers import VideoSerializer, RecordSerializer
'''
import picamera
from boto3.session import Session
from src.settings import AWS_REGION, S3_ACCESS_URL, S3_ACCESS_KEY_ID, S3_SECRET_ACCESS_KEY, S3_STORAGE_BUCKET_NAME
'''
def record() :
path = '/home/pi/recorded' # 저장할 경로
state = True
while state :
target = Record.objects.get(id = 1)
serializer = RecordSerializer(target, many = False)
state = serializer.data['recording']
with picamera.Picamera() as camera :
camera.resolution = [320,240]
now = datetime.datetime.now()
vid_name = now.strftime('%Y%m%d-%H%M%S')
vid_path = path + '/' + vid_name + '.h264'
camera.start_recording(output = vid_path)
camera.wait_recording(10)
camera.stop_recording()
s3 = boto3.client('s3', region_name = 'ap-northeast-2')
s3.upload_file(Filename = vid_path, Bucket = S3_STORAGE_BUCKET_NAME, Key = vid_name)
uploadVideo = {}
uploadVideo['vid_name'] = vid_name
uploadVideo['created'] = now
serializer = VideoSerializer(data = uploadVideo)
serializer.save()
os.remove(vid_path)
\ No newline at end of file
import boto3
import botocore
import threading
from django.http import HttpResponse
from django.core import serializers
from django.core.exceptions import FieldDoesNotExist, ObjectDoesNotExist
from django.shortcuts import render
from api.videorecord import record
from api.models import Video, Device, History, Lock, Record, Door
from api.serializers import VideoSerializer, DeviceSerializer, HistorySerializer, RecordSerializer
......@@ -17,16 +20,13 @@ from src.settings import AWS_REGION
from src.settings import S3_ACCESS_URL
from src.settings import S3_ACCESS_KEY_ID, S3_SECRET_ACCESS_KEY, S3_STORAGE_BUCKET_NAME
"""
import time
from datetime import datetime, timedelta
# Create your views here.
# 비디오 목록 조회
class VideoList(APIView) :
def get(self, request, format = None) :
'''
request_id = request.GET.get('last_id') # requst의 last_id 받아옴
queryset = Video.objects.filter(vid_id__range = (request_id, request_id + 10)) # 쿼리셋 필터로 vid_id의 범위가 last_id ~ las_id + 10인 객체 찾기
'''
queryset = Video.objects.all()
serializer = VideoSerializer(queryset, many = True)
res = {
......@@ -35,16 +35,16 @@ class VideoList(APIView) :
return Response(res, status = status.HTTP_200_OK)
# 비디오 수동 삭제
def delete(self, request, vid_id, format = None) : # request URI에 vid_id가 포함되어있음 : api/video/{vid_id}
def delete(self, request, vid_name, format = None) : # request URI에 vid_name가 포함되어있음 : api/video/{vid_name}
try :
request_id = vid_id
request_id = vid_name
if request_id == 'None' :
raise FieldDoesNotExist
session = boto3.session.Session(aws_access_key_id = S3_ACCESS_KEY_ID, aws_secret_access_key = S3_SECRET_ACCESS_KEY, region_name = AWS_REGION)
s3 = session.client('s3')
target = Video.objects.get(vid_id = request_id)
s3.delete_object(Bucket = S3_STORAGE_BUCKET_NAME, Key = str(target.vid_id))
target = Video.objects.get(vid_name = request_id)
s3.delete_object(Bucket = S3_STORAGE_BUCKET_NAME, Key = str(target.vid_name))
target.delete()
return Response(status = status.HTTP_200_OK)
except FieldDoesNotExist as error :
......@@ -55,9 +55,9 @@ class VideoList(APIView) :
# 비디오 확인(다운로드)
class VideoDownload(APIView) :
def get(self, request, vid_id, format = None) : # 요청한 URI에 vid_id가 포함되어있음 ex) api/video/1
def get(self, request, vid_name, format = None) : # 요청한 URI에 vid_name가 포함되어있음
try :
request_id = vid_id
request_id = vid_name
if request_id == 'None' :
raise FieldDoesNotExist
download_url = S3_ACCESS_URL + str(request_id) # S3 다운로드 링크 변환
......@@ -86,7 +86,7 @@ class CheckDate(APIView) :
session = boto3.session.Session(aws_access_key_id = S3_ACCESS_KEY_ID, aws_secret_access_key = S3_SECRET_ACCESS_KEY, region_name = AWS_REGION)
s3 = session.client('s3')
for delvid in quaryset :
s3.delete_object(Bucket = S3_STORAGE_BUCKET_NAME, Key = str(delvid.vid_id))
s3.delete_object(Bucket = S3_STORAGE_BUCKET_NAME, Key = str(delvid.vid_name))
quaryset.delete()
return Response(status = status.HTTP_200_OK)
......@@ -110,6 +110,10 @@ class Recording(APIView) :
try :
target = Record.objects.filter(id = 1)
target.update(recording = request.data['recording'])
if request.data['recording'] :
threading.Thread(target=record).start()
return Response(status = status.HTTP_200_OK)
except FieldDoesNotExist as error :
return Response({
......
......@@ -21,7 +21,7 @@ from api import views
urlpatterns = [
path('admin/', admin.site.urls),
path('api/video', views.VideoList.as_view()),
path('api/video/<int:vid_id>', views.VideoDownload.as_view()),
path('api/video/<str:vid_name>', views.VideoDownload.as_view()),
path('auto/checkDate', views.CheckDate.as_view()),
path('api/setting', views.Recording.as_view()),
]
......