Skip to content

Commit 902a1bf

Browse files
authored
Merge pull request StreetVoice#24 from StreetVoice/feature/add-aliyun-transcoder-for-django-19
Feature/add aliyun transcoder for django 19
2 parents 98450c2 + fbad5e8 commit 902a1bf

File tree

11 files changed

+331
-81
lines changed

11 files changed

+331
-81
lines changed

.gitignore

+7-6
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
.DS_Store
2-
/dist
3-
*.swp
4-
*.pyc
51
*.egg-info
2+
*.pyc
3+
*.swp
4+
.cache
65
.coverage
7-
.tox
6+
.DS_Store
87
.eggs
9-
.cache
8+
.tox
9+
/dist
10+
/wheelhouse

dj_elastictranscoder/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = '0.9.6'
1+
__version__ = '1.0.4'

dj_elastictranscoder/admin.py

+3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
from django.contrib import admin
2+
23
from .models import EncodeJob
34

5+
46
class EncodeJobAdmin(admin.ModelAdmin):
57
list_display = ('id', 'state', 'message')
68
list_filters = ('state',)
9+
710
admin.site.register(EncodeJob, EncodeJobAdmin)

dj_elastictranscoder/models.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
from django.db import models
22
from django.contrib.contenttypes.models import ContentType
3+
34
import django
4-
if django.get_version() >= '1.8':
5+
if django.VERSION >= (1, 8):
56
from django.contrib.contenttypes.fields import GenericForeignKey
67
else:
78
from django.contrib.contenttypes.generic import GenericForeignKey

dj_elastictranscoder/signals.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from django.dispatch import Signal
22

3-
transcode_onprogress = Signal(providing_args=["job", "message"])
4-
transcode_onerror = Signal(providing_args=["job", "message"])
5-
transcode_oncomplete = Signal(providing_args=["job", "message"])
3+
4+
transcode_onprogress = Signal(providing_args=['job', 'job_response'])
5+
transcode_oncomplete = Signal(providing_args=['job', 'job_response'])
6+
transcode_onerror = Signal(providing_args=['job', 'job_response'])

dj_elastictranscoder/transcoder.py

+146-30
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,173 @@
1-
from boto3.session import Session
2-
3-
from django.conf import settings
41
from django.contrib.contenttypes.models import ContentType
52

63
from .models import EncodeJob
4+
from .utils import get_setting_or_raise
75

86

97
class Transcoder(object):
108

11-
def __init__(self, pipeline_id, region=None, access_key_id=None, secret_access_key=None):
12-
self.pipeline_id = pipeline_id
9+
def start_job(self, obj, transcode_kwargs, message=''):
10+
raise NotImplementedError()
1311

14-
if not region:
15-
region = getattr(settings, 'AWS_REGION', None)
16-
self.aws_region = region
1712

13+
class AWSTranscoder(Transcoder):
14+
15+
def __init__(self, access_key_id=None, secret_access_key=None, pipeline_id=None, region=None):
1816
if not access_key_id:
19-
access_key_id = getattr(settings, 'AWS_ACCESS_KEY_ID', None)
20-
self.aws_access_key_id = access_key_id
17+
access_key_id = get_setting_or_raise('AWS_ACCESS_KEY_ID')
18+
self.access_key_id = access_key_id
2119

2220
if not secret_access_key:
23-
secret_access_key = getattr(settings, 'AWS_SECRET_ACCESS_KEY', None)
24-
self.aws_secret_access_key = secret_access_key
21+
secret_access_key = get_setting_or_raise('AWS_SECRET_ACCESS_KEY')
22+
self.secret_access_key = secret_access_key
2523

26-
if self.aws_access_key_id is None:
27-
assert False, 'Please provide AWS_ACCESS_KEY_ID'
24+
if not pipeline_id:
25+
pipeline_id = get_setting_or_raise('AWS_TRANSCODER_PIPELINE_ID')
26+
self.pipeline_id = pipeline_id
2827

29-
if self.aws_secret_access_key is None:
30-
assert False, 'Please provide AWS_SECRET_ACCESS_KEY'
28+
if not region:
29+
region = get_setting_or_raise('AWS_REGION')
30+
self.region = region
3131

32-
if self.aws_region is None:
33-
assert False, 'Please provide AWS_REGION'
32+
from boto3.session import Session
3433

3534
boto_session = Session(
36-
aws_access_key_id=self.aws_access_key_id,
37-
aws_secret_access_key=self.aws_secret_access_key,
38-
region_name=self.aws_region,
35+
aws_access_key_id=self.access_key_id,
36+
aws_secret_access_key=self.secret_access_key,
37+
region_name=self.region,
3938
)
4039
self.client = boto_session.client('elastictranscoder')
4140

42-
def encode(self, input_name, outputs, **kwargs):
43-
self.message = self.client.create_job(
44-
PipelineId=self.pipeline_id,
45-
Input=input_name,
46-
Outputs=outputs,
47-
**kwargs
48-
)
41+
def start_job(self, obj, transcode_kwargs, message=''):
42+
"""
43+
https://boto3.readthedocs.io/en/latest/reference/services/elastictranscoder.html#ElasticTranscoder.Client.create_job
44+
"""
45+
46+
if 'PipelineId' not in transcode_kwargs:
47+
transcode_kwargs['PipelineId'] = self.pipeline_id
48+
49+
ret = self.client.create_job(**transcode_kwargs)
4950

50-
def create_job_for_object(self, obj):
5151
content_type = ContentType.objects.get_for_model(obj)
52+
job = EncodeJob()
53+
job.id = ret['Job']['Id']
54+
job.content_type = content_type
55+
job.object_id = obj.pk
56+
job.message = message
57+
job.save()
58+
59+
60+
class QiniuTranscoder(Transcoder):
61+
62+
def __init__(
63+
self,
64+
access_key=None,
65+
secret_key=None,
66+
pipeline_id=None,
67+
bucket_name=None,
68+
notify_url=None,
69+
):
70+
if not access_key:
71+
access_key = get_setting_or_raise('QINIU_ACCESS_KEY')
72+
self.access_key = access_key
73+
74+
if not secret_key:
75+
secret_key = get_setting_or_raise('QINIU_SECRET_KEY')
76+
self.secret_key = secret_key
77+
78+
if not pipeline_id:
79+
pipeline_id = get_setting_or_raise('QINIU_TRANSCODE_PIPELINE_ID')
80+
self.pipeline_id = pipeline_id
81+
82+
if not bucket_name:
83+
bucket_name = get_setting_or_raise('QINIU_TRANSCODE_BUCKET_NAME')
84+
self.bucket_name = bucket_name
85+
86+
if not notify_url:
87+
notify_url = get_setting_or_raise('QINIU_TRANSCODE_NOTIFY_URL')
88+
self.notify_url = notify_url
89+
90+
from qiniu import Auth
91+
92+
self.client = Auth(self.access_key, self.secret_key)
93+
94+
def start_job(self, obj, transcode_kwargs, message=''):
95+
"""
96+
https://developer.qiniu.com/dora/manual/1248/audio-and-video-transcoding-avthumb
97+
"""
98+
99+
from qiniu import PersistentFop
52100

101+
if 'force' not in transcode_kwargs:
102+
transcode_kwargs['force'] = 1
103+
104+
pfop = PersistentFop(self.client, self.bucket_name, self.pipeline_id, self.notify_url)
105+
ret, info = pfop.execute(**transcode_kwargs)
106+
107+
content_type = ContentType.objects.get_for_model(obj)
108+
job = EncodeJob()
109+
job.id = ret['persistentId']
110+
job.content_type = content_type
111+
job.object_id = obj.pk
112+
job.message = message
113+
job.save()
114+
115+
116+
class AliyunTranscoder(Transcoder):
117+
118+
def __init__(
119+
self,
120+
access_key_id=None,
121+
access_key_secret=None,
122+
pipeline_id=None,
123+
region=None,
124+
notify_url=None
125+
):
126+
if not access_key_id:
127+
access_key_id = get_setting_or_raise('ALIYUN_TRANSCODE_ACCESS_KEY_ID')
128+
self.access_key_id = access_key_id
129+
130+
if not access_key_secret:
131+
access_key_secret = get_setting_or_raise('ALIYUN_TRANSCODE_ACCESS_KEY_SECRET')
132+
self.access_key_secret = access_key_secret
133+
134+
if not pipeline_id:
135+
pipeline_id = get_setting_or_raise('ALIYUN_TRANSCODE_PIPELINE_ID')
136+
self.pipeline_id = pipeline_id
137+
138+
if not region:
139+
region = get_setting_or_raise('ALIYUN_TRANSCODE_REGION')
140+
self.region = region
141+
142+
if not notify_url:
143+
notify_url = get_setting_or_raise('ALIYUN_TRANSCODE_NOTIFY_URL')
144+
self.notify_url = notify_url
145+
146+
from aliyunsdkcore import client
147+
148+
self.client = client.AcsClient(self.access_key_id, self.access_key_secret, self.region)
149+
150+
def start_job(self, obj, transcode_kwargs, message=''):
151+
"""
152+
https://help.aliyun.com/document_detail/57347.html?spm=5176.doc56767.6.724.AJ8z3E
153+
"""
154+
155+
import json
156+
from aliyunsdkmts.request.v20140618 import SubmitJobsRequest
157+
158+
request = SubmitJobsRequest.SubmitJobsRequest()
159+
request.set_accept_format('json')
160+
request.set_Input(json.dumps(transcode_kwargs.get('input_file')))
161+
request.set_OutputBucket(transcode_kwargs.get('bucket'))
162+
request.set_OutputLocation(transcode_kwargs.get('oss_location'))
163+
request.set_Outputs(json.dumps(transcode_kwargs.get('outputs')))
164+
request.set_PipelineId(self.pipeline_id)
165+
response = json.loads(self.client.do_action_with_exception(request).decode('utf-8'))
166+
167+
content_type = ContentType.objects.get_for_model(obj)
53168
job = EncodeJob()
54-
job.id = self.message['Job']['Id']
169+
job.id = response['JobResultList']['JobResult'][0]['Job']['JobId']
55170
job.content_type = content_type
56171
job.object_id = obj.pk
172+
job.message = message
57173
job.save()

dj_elastictranscoder/urls.py

+27-8
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,27 @@
1-
try:
2-
from django.conf.urls import url, patterns
3-
except ImportError:
4-
from django.conf.urls.defaults import url, patterns # Support for Django < 1.4
5-
6-
urlpatterns = patterns('dj_elastictranscoder.views',
7-
url(r'^endpoint/$', 'endpoint'),
8-
)
1+
import django
2+
3+
4+
if django.VERSION >= (1, 9):
5+
from django.conf.urls import url
6+
from dj_elastictranscoder import views
7+
8+
urlpatterns = [
9+
url(r'^endpoint/$', views.aws_endpoint),
10+
url(r'^aws_endpoint/$', views.aws_endpoint, name='aws_endpoint'),
11+
url(r'^qiniu_endpoint/$', views.qiniu_endpoint, name='qiniu_endpoint'),
12+
url(r'^aliyun_endpoint', views.aliyun_endpoint, name='aliyun_endpoint'),
13+
]
14+
15+
else:
16+
try:
17+
from django.conf.urls import url, patterns
18+
except ImportError:
19+
from django.conf.urls.defaults import url, patterns # Support for Django < 1.4
20+
21+
urlpatterns = patterns(
22+
'dj_elastictranscoder.views',
23+
url(r'^endpoint/$', 'aws_endpoint'),
24+
url(r'^aws_endpoint/$', 'aws_endpoint', name='aws_endpoint'),
25+
url(r'^qiniu_endpoint/$', 'qiniu_endpoint', name='qiniu_endpoint'),
26+
url(r'^aliyun_endpoint', 'aliyun_endpoint', name='aliyun_endpoint'),
27+
)

dj_elastictranscoder/utils.py

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from django.conf import settings
2+
from django.core.exceptions import ImproperlyConfigured
3+
4+
5+
def get_setting_or_raise(setting_name):
6+
try:
7+
value = getattr(settings, setting_name)
8+
except AttributeError:
9+
raise ImproperlyConfigured('Please provide {0}'.format(setting_name))
10+
return value

0 commit comments

Comments
 (0)