def trigger_img_persistent_fop(img_src, access_key=settings.QINIU_ACCESS_KEY, secret_key=settings.QINIU_SECRET_KEY, bucket=settings.QINIU_BUCKET_NAME): ''' 触发图片静态持久性操作 ''' try: if settings.QINIU_BUCKET_DOMAIN in img_src: key = '/'.join(img_src.split("//")[1].split("/") [1:]) #去掉 http://7xsx9g.com1.z0.glb.clouddn.com/ q = Auth(access_key, secret_key) large_saveas_key = urlsafe_base64_encode(bucket + ":" + key + "-large") medium_saveas_key = urlsafe_base64_encode(bucket + ":" + key + "-medium") large_ops = "imageView2/2/w/970/h/970/q/100|saveas/" + large_saveas_key #设置七牛的静态持久化,参数需要跟七牛账号那里设置的一致 medium_ops = "imageView2/2/w/580/h/350/q/50|saveas/" + medium_saveas_key #具体看这个文章 http://blog.csdn.net/netdxy/article/details/50223733 ops = [large_ops, medium_ops] pfop = PersistentFop(q, bucket) ret, info = pfop.execute(key, ops, 1) if info.exception is None: print key + " persistent fop to success" else: print key + " persistent fop to failed" except Exception, e: print str(e) print key + " persistent fop to failed"
def transcode_h264(self, bucket_name, key): file_tail = ['ori.mp4', '.mp4'] for type in file_tail: des_filename = key.replace(type, 'h264.mp4') if des_filename is not None: break op = op_save( 'avthumb/mp4/ab/32k/aq/10/ar/44100/acodec/libfaac/r/25/vb/260k/vcodec/libx264/s/640x360/autoscale/1/stripmeta/0', bucket_name, des_filename) ops = [] ops.append(op) self.pfop = PersistentFop(self.q, bucket_name, 'videoconverth264') ret, info = self.pfop.execute(key, ops, 1) if 200 == info.status_code: return 0 else: return info.text_body[10:-2]
def test_pfop(self): q = Auth(access_key, secret_key) pfop = PersistentFop(q, 'testres', 'sdktest') op = op_save('avthumb/m3u8/segtime/10/vcodec/libx264/s/320x240', 'pythonsdk', 'pfoptest') ret, info = pfop.execute('sintel_trailer.mp4', op, 1) print(info) assert ret['persistentId'] is not None
def bangumi_cover_transcoding(key, sizi): q = Auth(access_key, secret_key) #要转码的文件所在的空间和文件名。 bucket = 'cover-cache' #转码是使用的队列名称。 #pipeline = 'mpsdemo' #要进行转码的转码操作。 if sizi == 'min': fops = 'imageView2/2/w/450/h/600/format/jpg/q/75|imageslim' newkey = 'bangumi/cover/' + key else: fops = 'imageView2/2/w/120/h/160/format/jpg/q/75|imageslim' newkey = 'bangumi/cover/min/' + key #可以对转码后的文件进行使用saveas参数自定义命名,当然也可以不指定文件会默认命名并保存在当前空间 saveas_key = urlsafe_base64_encode('video-cover:' + newkey) fops = fops + '|saveas/' + saveas_key pfop = PersistentFop(q, bucket) #, pipeline ops = [] ops.append(fops) ret, info = pfop.execute(key, ops, 1) print(info)
def waterMark(): ''' 已上传的图片打水印 :return: ''' #1、指定 空间绑定的域名、 水印图片地址、 空间名称、 空间水印原图Key、 私有处理队列 domain = "test.zhaojianfeng.cn" wmImg = "https://olhvkds73.qnssl.com/logo.png" bucket = "test-bucket" key = "a0.jpg" pipeline = "image-pipeline" encodeWmImg = urlsafe_base64_encode(wmImg) #2、创建Auth对象、 指定fops 操作、 saveas接口及签名 auth = Auth(access_key=accessKey, secret_key=secretKey) fops = "watermark/1/image/" + encodeWmImg + "/gravity/SouthWest" saveKey = urlsafe_base64_encode(bucket + ":" + "p111_a0.jpg") fops = fops + "|saveas/" + saveKey signTarget = domain + "/" + key + "?" + fops sign = urlsafe_base64_encode(signTarget) fops = fops + "/sign/" + sign #3、执行持久化操作 pfop = PersistentFop(auth=auth, bucket=bucket, pipeline=pipeline) ops = [] ops.append(fops) ret, info = pfop.execute(key, ops) #4、查看执行结果 print(info) assert ret['persistentId'] is not None
def transcoder(q, bucket_name, pipeline, key, trns_model): #sufix = os.path.splitext(key_name)[1][1:] #assert(sufix == 'rmvb' or ...) key_path = os.path.split(key)[0] key_name = os.path.split(key)[1] key_name = os.path.splitext(key_name)[0] fops = '' if trns_model == 0: fops = 'avthumb/m3u8/segtime/10/ab/32k/ar/44100/acodec/libfaac/r/15/vb/200k/vcodec/libx264/s/424x240/autoscale/1/stripmeta/0/noDomain/1' saveas_key = urlsafe_base64_encode(saved_bucket_name + ':' + key_path + '/' + key_name + '_240p.m3u8') fops = fops + '|saveas/' + saveas_key elif trns_model == 1: fops = 'avthumb/m3u8/segtime/10/ab/64k/ar/44100/acodec/libfaac/r/18/vb/500k/vcodec/libx264/s/848x480/autoscale/1/stripmeta/0/noDomain/1' saveas_key = urlsafe_base64_encode(saved_bucket_name + ':' + key_path + '/' + key_name + '_480p.m3u8') fops = fops + '|saveas/' + saveas_key elif trns_model == 2: fops = 'avthumb/m3u8/segtime/10/ab/96k/ar/44100/acodec/libfaac/r/24/vb/1000k/vcodec/libx264/s/1280x720/autoscale/1/stripmeta/0/noDomain/1' saveas_key = urlsafe_base64_encode(saved_bucket_name + ':' + key_path + '/' + key_name + '_720p.m3u8') fops = fops + '|saveas/' + saveas_key else: print('ERROR: unexpected transcoding model!') #print(key_path + key_name + ' Transcoding to: ' + saved_bucket_name + ':' + key_path + '/' + key_name + '_xxx.m3u8') pfop = PersistentFop(q, bucket_name, pipeline) ops = [] ops.append(fops) ret, info = pfop.execute(key, ops, 1) print(info) assert ret['persistentId'] is not None
def trigger_img_persistent_fop( img_src, access_key=settings.QINIU_ACCESS_KEY, secret_key=settings.QINIU_SECRET_KEY, bucket=settings.QINIU_BUCKET_NAME, ): """ 触发图片静态持久性操作 """ try: if settings.QINIU_BUCKET_DOMAIN in img_src: key = "/".join(img_src.split("//")[1].split("/")[1:]) # 去掉 http://7xsx9g.com1.z0.glb.clouddn.com/ q = Auth(access_key, secret_key) large_saveas_key = urlsafe_base64_encode(bucket + ":" + key + "-large") medium_saveas_key = urlsafe_base64_encode(bucket + ":" + key + "-medium") large_ops = "imageView2/2/w/970/h/970/q/100|saveas/" + large_saveas_key # 设置七牛的静态持久化,参数需要跟七牛账号那里设置的一致 medium_ops = ( "imageView2/2/w/580/h/350/q/50|saveas/" + medium_saveas_key ) # 具体看这个文章 http://blog.csdn.net/netdxy/article/details/50223733 ops = [large_ops, medium_ops] pfop = PersistentFop(q, bucket) ret, info = pfop.execute(key, ops, 1) if info.exception is None: print key + " persistent fop to success" else: print key + " persistent fop to failed" except Exception, e: print str(e) print key + " persistent fop to failed"
def water_mark(self, key): saveas_key = urlsafe_base64_encode('{}:{}'.format(self.bucket_name, key)) fops = self.fops + '|saveas/' + saveas_key pfop = PersistentFop(self.q, self.bucket_name, self.pipeline) ops = list() ops.append(fops) pfop.execute(key, ops, 1)
def roundPic(self, bn, key): """ 触发持久化 :param bn: 空间名称 :param key: 文件名称 :return: """ #创建授权对象 auth = Auth(self.AK, self.SK) #指定 私有队列 pipeline = "image-pipeline" #指定数据处理操作 fops = "roundPic/radius/!50p" #定义另存的文件名称 new_key = "round_" + key #另存的编码 saveAs = urlsafe_base64_encode(bn + ":" + new_key) #管道拼接 fops = fops + "|saveas/" + saveAs #创建数据处理对象 pfop pfop = PersistentFop(auth=auth, bucket=bn, pipeline=pipeline) ops = [] ops.append(fops) #执行数据处理 execute r, i = pfop.execute(key, ops, 1) #查看处理信息 print(i)
def video_transcoding(key, pxtype): if pxtype == '360p': video_sizi = '640x360' video_kbps = '250k' video_mp3kbps = '128k' if pxtype == '480p': video_sizi = '852x480' video_kbps = '550k' video_mp3kbps = '192k' if pxtype == '720p': video_sizi = '1280x720' video_kbps = '850k' video_mp3kbps = '230k' if pxtype == '1080p': video_sizi = '1920x1080' video_kbps = '1000k' video_mp3kbps = '320k' if pxtype == '2k': video_sizi = '2560x1440' video_kbps = '3200k' video_mp3kbps = '320k' if pxtype == '4k': video_sizi = '3840x2160' video_kbps = '4000k' video_mp3kbps = '320k' q = Auth(access_key, secret_key) #要转码的文件所在的空间和文件名。 bucket = 'video-cache' key = str(key) filekey = str(key) #转码是使用的队列名称。 pipeline = 'transcoding' #要进行转码的转码操作。 fops = 'avthumb/mp4/s/' + video_sizi + '/vb/' + video_kbps + '/ab/' + video_mp3kbps + '/acodec/libmp3lame' #生成新的文件名 name = key.split(".")[0] key_tpye = key.split(".")[1] key = name + '-' + pxtype + '.' + 'mp4' #可以对转码后的文件进行使用saveas参数自定义命名,当然也可以不指定文件会默认命名并保存在当前空间 saveas_key = urlsafe_base64_encode('video-store:' + "bangumi/" + key) fops = fops + '|saveas/' + saveas_key pfop = PersistentFop(q, bucket, pipeline) ops = [] ops.append(fops) ret, info = pfop.execute(filekey, ops, 1) print(info)
def test_pfop(self): q = Auth(access_key, secret_key) pfop = PersistentFop(q, 'testres', 'sdktest') op = op_save('avthumb/m3u8/segtime/10/vcodec/libx264/s/320x240', 'pythonsdk', 'pfoptest') ops = [] ops.append(op) ret, info = pfop.execute('sintel_trailer.mp4', ops, 1) print(info) assert ret['persistentId'] is not None
def test_pfop(self): q = Auth(access_key, secret_key) pfop = PersistentFop(q, "testres", "sdktest") op = op_save("avthumb/m3u8/segtime/10/vcodec/libx264/s/320x240", "pythonsdk", "pfoptest") ops = [] ops.append(op) ret, info = pfop.execute("sintel_trailer.mp4", ops, 1) print(info) assert ret["persistentId"] is not None
def convert_to_pdf(source_key, convert_task_id=None): dest_key = source_key + '.pdf' op = op_save('yifangyun_preview', QINIU_BUCKET_NAME, dest_key) pfop = PersistentFop( qiniu_auth, QINIU_BUCKET_NAME, notify_url=urlparse.urljoin( QINIU_CALLBACK_URL, '/api/qiniu_persist_callback?convert_task_id={}'.format(convert_task_id))) ret, info = pfop.execute(source_key, [op, ]) return ret, info
def picture_thu(self, file_name): # 要进行转码的转码操作。 fops = 'imageMogr2/auto-orient/thumbnail/600x600>/blur/1x0/quality/75|imageslim' # 可以对转码后的文件进行使用saveas参数自定义命名,当然也可以不指定文件会默认命名并保存在当前空间 saveas_key = urlsafe_base64_encode('{}:{}'.format(self.bucket_name, file_name)) fops = fops+'|saveas/'+saveas_key pfop = PersistentFop(self.q, self.bucket_name) ops = [] ops.append(fops) ret, info = pfop.execute(file_name, ops, 1) print(ret)
def convert_pdf(self): src_bucket_name = current_app.qiniu.PRIVATE_BUCKET_NAME dest_bucket_name = src_bucket_name QINIU_DOCUMENT_CALLBACK_URL = urljoin( current_app.qiniu.CALLBACK_URL, self.QINIU_DOCUMENT_CALLBACK_ROUTE) pfop = PersistentFop(current_app.qiniu.qiniu_auth, src_bucket_name, notify_url=QINIU_DOCUMENT_CALLBACK_URL) saved_key = self.qiniu_key + '.pdf' op = op_save('yifangyun_preview', dest_bucket_name, saved_key.encode('utf-8')) ret, info = pfop.execute(self.qiniu_key, [op, ], force=1) if info.status_code != 200: raise Exception('error {}'.format(info))
def convert_mp3(self): src_bucket_name = current_app.qiniu.PRIVATE_BUCKET_NAME dest_bucket_name = src_bucket_name QINIU_AUDIO_CALLBACK_URL = urljoin( current_app.qiniu.CALLBACK_URL, self.QINIU_AUDIO_CALLBACK_ROUTE) pfop = PersistentFop(current_app.qiniu.qiniu_auth, src_bucket_name, notify_url=QINIU_AUDIO_CALLBACK_URL) saved_key = self.qiniu_key + '.mp3' op = op_save('avthumb/mp3', dest_bucket_name, saved_key.encode('utf-8')) ret, info = pfop.execute(self.qiniu_key, [op], force=1) if info.status_code != 200: raise Exception('error {}'.format(info)) return True
def convert_mp3(self): src_bucket_name = current_app.qiniu.PRIVATE_BUCKET_NAME dest_bucket_name = src_bucket_name QINIU_AUDIO_CALLBACK_URL = urljoin(current_app.qiniu.CALLBACK_URL, self.QINIU_AUDIO_CALLBACK_ROUTE) pfop = PersistentFop(current_app.qiniu.qiniu_auth, src_bucket_name, notify_url=QINIU_AUDIO_CALLBACK_URL) saved_key = self.qiniu_key + '.mp3' op = op_save('avthumb/mp3', dest_bucket_name, saved_key.encode('utf-8')) ret, info = pfop.execute(self.qiniu_key, [op], force=1) if info.status_code != 200: raise Exception('error {}'.format(info)) return True
def perform_pfop(self, origin): access_key = settings.QINIU['ACCESS_KEY'] secret_key = settings.QINIU['SECRET_KEY'] path = reverse('greetings-pfop-notify') notify_url = urlparse.urljoin(origin, path) auth = Auth(access_key, secret_key) pfop = PersistentFop(auth, 'tatmusic', 'wechataudio', notify_url) op = op_save('avthumb/mp3', 'tatmusic', self.key + '.mp3') ret, info = pfop.execute(self.key, [op]) if self.data is None: self.data = ret else: self.data.update(ret) self.save(update_fields=['data'])
def video_cut(self): src_bucket_name = current_app.qiniu.PRIVATE_BUCKET_NAME dest_bucket_name = src_bucket_name pipeline = current_app.qiniu.PIPELINE QINIU_VIDEO_CALLBACK_URL = urljoin( current_app.qiniu.CALLBACK_URL, self.QINIU_CUT_VIDEO_CALLBACK) pfop = PersistentFop(current_app.qiniu.qiniu_auth, src_bucket_name, pipeline, QINIU_VIDEO_CALLBACK_URL) saved_key = self.qiniu_key + '.short.mp4' # import ipdb; ipdb.set_trace() op = op_save('avthumb/mp4/t/180', dest_bucket_name, saved_key.encode('utf-8')) ret, info = pfop.execute(self.qiniu_key, [op, ], force=1) if info.status_code != 200: raise Exception(u'error {}'.format(info))
def convert_pdf(self): src_bucket_name = current_app.qiniu.PRIVATE_BUCKET_NAME dest_bucket_name = src_bucket_name QINIU_DOCUMENT_CALLBACK_URL = urljoin( current_app.qiniu.CALLBACK_URL, self.QINIU_DOCUMENT_CALLBACK_ROUTE) pfop = PersistentFop(current_app.qiniu.qiniu_auth, src_bucket_name, notify_url=QINIU_DOCUMENT_CALLBACK_URL) saved_key = self.qiniu_key + '.pdf' op = op_save('yifangyun_preview', dest_bucket_name, saved_key.encode('utf-8')) ret, info = pfop.execute(self.qiniu_key, [ op, ], force=1) if info.status_code != 200: raise Exception('error {}'.format(info))
def Generate_video_cover(coverkey,videokey): print(coverkey,videokey) q = Auth(access_key, secret_key) bucket = 'video-cache' key = videokey #要进行转码的转码操作。 fops = 'vframe/jpg/offset/3/w/300/h/168' #可以对转码后的文件进行使用saveas参数自定义命名,当然也可以不指定文件会默认命名并保存在当前空间 saveas_key = urlsafe_base64_encode('video-cover:'+coverkey+'.jpg') fops = fops+'|saveas/'+saveas_key pfop = PersistentFop(q, bucket) ops = [] ops.append(fops) ret, info = pfop.execute(key, ops, 1) return coverkey+'.jpg'
def pack_files(self, bucket_name: str, key: str, mk_zip_args: dict, encoding: str = 'utf-8', save_as_bucket_name: str = None, save_as_key: str = None, delete_after_days: int = None, pipeline: str = None): """ 少量文件压缩(mode=2) :param bucket_name: 文件储存空间名 :param key: 文件储存空间某个文件的文件名(存储空间内指定资源的文件名字。此处的key所指的资源内容对 mkzip 操作本身没有影响,必填是由于 pfop 接口规格要求请求 body 中参数必须包含 bucket 和 key,因此即使未对空间特定资源进行操作,在执行 mkzip 操作时仍然 需要指定账号下的特定空间和该空间的已有资源。) :param mk_zip_args: 文件压缩参数,dict类型,key为文件url,value为文件alias :param encoding: 压缩包内资源命名的编码,目前支持 gbk 和 utf-8,默认 utf-8 :param save_as_bucket_name: 储存压缩好的文件的空间名 :param save_as_key: 压缩文件另存为的名称 :param delete_after_days: 将在多少天之后删除此压缩好的文件,不填则不会自动删除 :param pipeline: 管道名称,不填则使用默认管道 :return: """ fops = 'mkzip/2/encoding/' + urlsafe_base64_encode(encoding) for url, alias in mk_zip_args.items(): a = '/url/' + urlsafe_base64_encode( url) + '/alias/' + urlsafe_base64_encode(alias) fops += '/url/' + urlsafe_base64_encode( url) + '/alias/' + urlsafe_base64_encode(alias) if save_as_bucket_name is not None and save_as_key is not None: save_as = urlsafe_base64_encode(save_as_bucket_name + ':' + save_as_key) fops = fops + '|saveas/' + save_as if delete_after_days is not None: fops += '/deleteAfterDays/' + str(delete_after_days) ops = [] pfop = PersistentFop(self._qiniu_auth, bucket_name, pipeline) ops.append(fops) ret, info = pfop.execute(key, ops, 1) return ret, info
def video_cut(self): src_bucket_name = current_app.qiniu.PRIVATE_BUCKET_NAME dest_bucket_name = src_bucket_name pipeline = current_app.qiniu.PIPELINE QINIU_VIDEO_CALLBACK_URL = urljoin(current_app.qiniu.CALLBACK_URL, self.QINIU_CUT_VIDEO_CALLBACK) pfop = PersistentFop(current_app.qiniu.qiniu_auth, src_bucket_name, pipeline, QINIU_VIDEO_CALLBACK_URL) saved_key = self.qiniu_key + '.short.mp4' # import ipdb; ipdb.set_trace() op = op_save('avthumb/mp4/t/180', dest_bucket_name, saved_key.encode('utf-8')) ret, info = pfop.execute(self.qiniu_key, [ op, ], force=1) if info.status_code != 200: raise Exception(u'error {}'.format(info))
def pack_large_number_of_files(self, bucket_name: str, index_file_key: str, encoding: str = 'utf-8', save_as_bucket_name: str = None, save_as_key: str = None, delete_after_days: int = None, pipeline: str = None): """ 大量文件压缩(mode=4) 为了将大量文件压缩,可以将待压缩文件URL写入一个索引文件,上传至bucket,再对该索引文件进行的mkzip操作。 索引文件格式为:<br> /url/<Base64EncodedURL1>[/alias/<Base64EncodedAlias1>] /url/<Base64EncodedURL2>[/alias/<Base64EncodedAlias2>] ... ... /url/<Base64EncodedURLN>[/alias/<Base64EncodedAliasN>] :param bucket_name: 索引文件储存空间名 :param index_file_key: 索引文件名 :param encoding: 压缩包内资源命名的编码,目前支持 gbk 和 utf-8,默认 utf-8 :param save_as_bucket_name: 储存压缩文件的空间名 :param save_as_key: 压缩文件另存为的名称 :param delete_after_days: 将在多少天之后删除此压缩好的文件,不填则不会自动删除 :param pipeline: 管道名称,不填则使用默认管道 :return: """ fops = 'mkzip/4/encoding/' + urlsafe_base64_encode(encoding) if save_as_bucket_name is not None and save_as_key is not None: save_as = urlsafe_base64_encode(save_as_bucket_name + ':' + save_as_key) fops = fops + '|saveas/' + save_as if delete_after_days is not None: fops += '/deleteAfterDays/' + str(delete_after_days) ops = [] pfop = PersistentFop(self._qiniu_auth, bucket_name, pipeline) ops.append(fops) ret, info = pfop.execute(index_file_key, ops, 1) return ret, info
def get_img_from_video(video_url): # 要转码的文件所在的空间和文件名。 q = Auth(ak, sk) bucket_name = 'padmom' # 解析URL 获取key index = video_url.index('img.padmom.com') index += len('img.padmom.com/') key = video_url[index:] # key = video_url # 是使用的队列名称,不设置代表不使用私有队列,使用公有队列。 pipeline = 'castle_video' # 要进行转码的转码操作。 fops = 'vframe/jpg/offset/1/w/640/h/640' pfop = PersistentFop(q, bucket_name, pipeline) ops = [] ops.append(fops) ret, info = pfop.execute(key, ops, 1) # app.logger.info("get_img_from_video info={%s}", info) assert ret['persistentId'] is not None return ret['persistentId']
def encode_video_asyn(self): '''#对已经上传到七牛的视频发起异步转码操作,好像并没什么用''' q = Auth(self.QN_ACCESS_KEY,self.QN_SECRET_KEY) key = 'test_video_test.mp4' # 是使用的队列名称,不设置代表不使用私有队列,使用公有队列。 # pipeline = 'your_pipeline' # 要进行转码的转码操作。 # fops = 'avthumb/mp4/s/640x360/vb/1.25m' fops = 'avthumb/mp4/vcodec/libx264|saveas/' # 可以对转码后的文件进行使用saveas参数自定义命名,当然也可以不指定文件会默认命名并保存在当前空间 saveas_key = urlsafe_base64_encode(self.QN_BUCKET+':n'+key) fops = fops+'|saveas/'+saveas_key pfop = PersistentFop(q, self.QN_BUCKET) ops = [] ops.append(fops) ret, info = pfop.execute(key, ops, 1) print(info) print('-------------') print(ret)
def start_job(self, obj, transcode_kwargs, message=''): """ https://developer.qiniu.com/dora/manual/1248/audio-and-video-transcoding-avthumb """ from qiniu import PersistentFop if 'force' not in transcode_kwargs: transcode_kwargs['force'] = 1 pfop = PersistentFop(self.client, self.bucket_name, self.pipeline_id, self.notify_url) ret, info = pfop.execute(**transcode_kwargs) content_type = ContentType.objects.get_for_model(obj) job = EncodeJob() job.id = ret['persistentId'] job.content_type = content_type job.object_id = obj.pk job.message = message job.save()
def get_video_frame(path): key = path fops = 'vframe/jpg/offset/10/w/480/h/360' #pipeline = 'abc' saveas_key = urlsafe_base64_encode(bucket_name + ':' + os.path.splitext(path)[0] + '.jpg') fops = fops + '|saveas/' + saveas_key print(saveas_key) policy = { 'scope': key, 'deadline': 0, 'persistentOps': fops #'persistentPipeline': pipeline } pfop = PersistentFop(q, bucket_name) ops = [] ops.append(fops) ret, info = pfop.execute(key, ops, 1) print(ret) print(info)
def cover_transcoding(key): q = Auth(access_key, secret_key) #要转码的文件所在的空间和文件名。 bucket = 'cover-cache' key = key #转码是使用的队列名称。 #pipeline = 'mpsdemo' #要进行转码的转码操作。 fops = 'imageView2/1/w/300/h/168/q/90|imageslim' #可以对转码后的文件进行使用saveas参数自定义命名,当然也可以不指定文件会默认命名并保存在当前空间 saveas_key = urlsafe_base64_encode('video-cover:'+ key) fops = fops+'|saveas/'+saveas_key pfop = PersistentFop(q, bucket)#, pipeline ops = [] ops.append(fops) ret, info = pfop.execute(key, ops, 1) print(info) assert ret['persistentId'] is not None
def convert_img(self, src_path, new_type, dst_path=None, force=0): """ :param src_path: 待转码的源文件 :param new_type: 新类型 :param dst_path: 转码后存放的文件名, 为None则覆盖源文件 :param force: 是否强制覆盖已经存在原来的文件,否则如果new_key对应的文件已经存在就不执行命令了 :return: result_dict, 类似{"persistentId": 5476bedf7823de4068253bae}; persistentId可以用于查询异步任务的进度,如:http://api.qiniu.com/status/get/prefop?id=z0.5896682345a2650cfd7733b2 """ pfop_instance = PersistentFop(self.auth, self.bucket, DEFAULT_PRIVATE_ASYNC_QUEUE) # 如果不传表示覆盖 dst_path = dst_path or src_path encoded_key = base64.b64encode('%s:%s' % (self.bucket, dst_path)) # 转化格式并进行存储 fops = [ 'imageMogr2/format/{new_type}|saveas/{encoded_key}'.format( new_type=new_type, encoded_key=encoded_key) ] result, _ = pfop_instance.execute(src_path, fops, force=force) return result
def trig_video_part(key): q = Auth(access_key, secret_key) # 要转码的文件所在的空间和文件名。 bucket = g_bucket_name # 转码是使用的队列名称。 pipeline = 'video_handle' pat = urlsafe_base64_encode("videopart-$(count)") # 要进行转码的转码操作。 fops = "segment/mp4/segtime/5/pattern/%s" % pat # 可以对转码后的文件进行使用saveas参数自定义命名,当然也可以不指定文件会默认命名并保存在当前空间 # saveas_key = urlsafe_base64_encode(g_bucket_name+':自定义文件key') # fops = fops + '|saveas/' + saveas_key pfop = PersistentFop( q, bucket, pipeline, notify_url="https://balimiao.cn/front/qiniu/video_part_callback") ops = [] ops.append(fops) ret, info = pfop.execute(key, ops, 1) if "persistentId" in ret and ret["persistentId"]: return True else: g_stdlogging.exception("[trig_video_part]%s %s" % (ret, info))
def ops(self, urlList): ak = AccountMgr().getAccessKey() sk = AccountMgr().getSecretKey() auth = Auth(ak, sk) domain = "test.zhaojianfeng.cn" pipeline = "av-pipeline" bucket = "test-bucket" key = "mayun0.mp4" mSaveAs = urlsafe_base64_encode(bucket + ":mayun_all.mp4") encodeUrls = [] for i in range(len(urlList)): encodeUrls.append(urlsafe_base64_encode(urlList[i])) fops = "avconcat/2/format/mp4/" + "/".join(encodeUrls) + "|saveas/" + mSaveAs print(fops) sign = urlsafe_base64_encode(domain + "/" + key + "?" + fops) fops = fops + "/sign/" + sign pfops = PersistentFop(auth, bucket, pipeline) ops = [] ops.append(fops) ret, info = pfops.execute(key, ops) print(info) assert ret['persistentId'] is not None
def transcode_h264(self,bucket_name,key): file_tail = ['ori.mp4','.mp4'] for type in file_tail: des_filename = key.replace(type,'h264.mp4') if des_filename is not None: break op=op_save('avthumb/mp4/ab/32k/aq/10/ar/44100/acodec/libfaac/r/25/vb/260k/vcodec/libx264/s/640x360/autoscale/1/stripmeta/0',bucket_name,des_filename) ops = [] ops.append(op) self.pfop=PersistentFop(self.q,bucket_name,'videoconverth264') ret,info = self.pfop.execute(key,ops,1) if 200 == info.status_code: return 0 else: return info.text_body[10:-2]
# -*- coding: utf-8 -*- # flake8: noqa from qiniu import Auth, PersistentFop, build_op, op_save, urlsafe_base64_encode #对已经上传到七牛的视频发起异步转码操作 access_key = 'Access_Key' secret_key = 'Secret_Key' q = Auth(access_key, secret_key) #要转码的文件所在的空间和文件名。 bucket = 'Bucket_Name' key = '1.mp4' #转码是使用的队列名称。 pipeline = 'mpsdemo' #要进行视频截图操作。 fops = 'vframe/jpg/offset/1/w/480/h/360/rotate/90' #可以对转码后的文件进行使用saveas参数自定义命名,当然也可以不指定文件会默认命名并保存在当前空间 saveas_key = urlsafe_base64_encode('目标Bucket_Name:自定义文件key') fops = fops+'|saveas/'+saveas_key pfop = PersistentFop(q, bucket, pipeline) ops = [] ops.append(fops) ret, info = pfop.execute(key, ops, 1) print(info) assert ret['persistentId'] is not None
class QiniuWrap(object): def __init__(self): configer = Configer('') access_key = configer.get_configer('QINIU','access_key') secret_key = configer.get_configer('QINIU','secret_key') self.q=Auth(access_key,secret_key) self.bucket = BucketManager(self.q) def transcode_h264(self,bucket_name,key): file_tail = ['ori.mp4','.mp4'] for type in file_tail: des_filename = key.replace(type,'h264.mp4') if des_filename is not None: break op=op_save('avthumb/mp4/ab/32k/aq/10/ar/44100/acodec/libfaac/r/25/vb/260k/vcodec/libx264/s/640x360/autoscale/1/stripmeta/0',bucket_name,des_filename) ops = [] ops.append(op) self.pfop=PersistentFop(self.q,bucket_name,'videoconverth264') ret,info = self.pfop.execute(key,ops,1) if 200 == info.status_code: return 0 else: return info.text_body[10:-2] def download_pub_file(self,bucket_name,key,path='.'): base_url = 'http://%s.okjiaoyu.cn/%s' % (bucket_name,key) request = urllib2.Request(base_url) response = urllib2.urlopen(request) pic = response.read() with open(path + '/' + key,'wb') as fd: fd.write(pic) return response.code def download_pri_file(self,bucket_name,key): base_url = 'http://%s.okjiaoyu.cn/%s' % (bucket_name,key) private_url = q.private_download_url(base_url,expires = 3600) request = urllib2.Request(base_url) response = urllib2.urlopen(request) pic = response.read() with open(path + '/' + key,'wb') as fd: fd.write(pic) return response.code def upload_file(self,bucket_name,key,localfile): if bucket_name is None or key is None or localfile is None: return 'sys error' token = self.q.upload_token(bucket_name,key) ret,info = put_file(token,key,localfile) if 200 == info.status_code: return None else: return info.text_body[10:-2] def upload_data(self,bucket_name,key,data): if bucket_name is None or key is None or data is None: return 'sys error' token = self.q.upload_token(bucket_name,key) ret,info = put_data(token,key,data) if 200 == info.status_code: return None else: return info.text_body[10:-2] def get_file_info(self,bucket_name,key): bucket_name = bucket_prex + bucket_name ret, info = bucket.stat(bucket_name, key) return info def copy_file(self,frm_bucket_name,frm_key,to_bucket_name,to_key): frm_bucket_name = bucket_prex + frm_bucket_name to_bucket_name = bucket_prex + to_bucket_name ret, info = bucket.copy(frm_bucket_name, frm_key, to_bucket_name, to_key) return ret def move_file(self,frm_bucket_name,frm_key,to_bucket_name,to_key): frm_bucket_name = bucket_prex + frm_bucket_name to_bucket_name = bucket_prex + to_bucket_name ret, info = bucket.move(frm_bucket_name, frm_key, to_bucket_name, to_key2) return ret def del_file(self,bucket_name,key): bucket_name = bucket_prex + bucket_name ret, info = bucket.delete(bucket_name, key) return ret def get_uptoken(self,bucket_name,key): return self.q.upload_token(bucket_name,key)
class QiniuWrap(object): def __init__(self): configer = Configer('') access_key = configer.get_configer('QINIU', 'access_key') secret_key = configer.get_configer('QINIU', 'secret_key') self.q = Auth(access_key, secret_key) self.bucket = BucketManager(self.q) def transcode_h264(self, bucket_name, key): file_tail = ['ori.mp4', '.mp4'] for type in file_tail: des_filename = key.replace(type, 'h264.mp4') if des_filename is not None: break op = op_save( 'avthumb/mp4/ab/32k/aq/10/ar/44100/acodec/libfaac/r/25/vb/260k/vcodec/libx264/s/640x360/autoscale/1/stripmeta/0', bucket_name, des_filename) ops = [] ops.append(op) self.pfop = PersistentFop(self.q, bucket_name, 'videoconverth264') ret, info = self.pfop.execute(key, ops, 1) if 200 == info.status_code: return 0 else: return info.text_body[10:-2] def download_pub_file(self, bucket_name, key, path='.'): base_url = 'http://%s.okjiaoyu.cn/%s' % (bucket_name, key) request = urllib2.Request(base_url) response = urllib2.urlopen(request) pic = response.read() with open(path + '/' + key, 'wb') as fd: fd.write(pic) return response.code def download_pri_file(self, bucket_name, key): base_url = 'http://%s.okjiaoyu.cn/%s' % (bucket_name, key) private_url = q.private_download_url(base_url, expires=3600) request = urllib2.Request(base_url) response = urllib2.urlopen(request) pic = response.read() with open(path + '/' + key, 'wb') as fd: fd.write(pic) return response.code def upload_file(self, bucket_name, key, localfile): if bucket_name is None or key is None or localfile is None: return 'sys error' token = self.q.upload_token(bucket_name, key) ret, info = put_file(token, key, localfile) if 200 == info.status_code: return None else: return info.text_body[10:-2] def upload_data(self, bucket_name, key, data): if bucket_name is None or key is None or data is None: return 'sys error' token = self.q.upload_token(bucket_name, key) ret, info = put_data(token, key, data) if 200 == info.status_code: return None else: return info.text_body[10:-2] def get_file_info(self, bucket_name, key): bucket_name = bucket_prex + bucket_name ret, info = bucket.stat(bucket_name, key) return info def copy_file(self, frm_bucket_name, frm_key, to_bucket_name, to_key): frm_bucket_name = bucket_prex + frm_bucket_name to_bucket_name = bucket_prex + to_bucket_name ret, info = bucket.copy(frm_bucket_name, frm_key, to_bucket_name, to_key) return ret def move_file(self, frm_bucket_name, frm_key, to_bucket_name, to_key): frm_bucket_name = bucket_prex + frm_bucket_name to_bucket_name = bucket_prex + to_bucket_name ret, info = bucket.move(frm_bucket_name, frm_key, to_bucket_name, to_key2) return ret def del_file(self, bucket_name, key): bucket_name = bucket_prex + bucket_name ret, info = bucket.delete(bucket_name, key) return ret def get_uptoken(self, bucket_name, key): return self.q.upload_token(bucket_name, key)
def add_post(request): if not request.user.is_anonymous(): if request.method == 'POST': post_form = PostForm(request.POST) tag = TagForm(request.POST) if post_form.is_valid() and tag.is_valid(): cd_tag = tag.cleaned_data tag_name = cd_tag['tag_name'] for tag_list in tag_name.split(','): Tag.objects.get_or_create(tag_name=tag_list.strip()) title = post_form.cleaned_data['caption'] user = request.user content = post_form.cleaned_data['content'] post = Post(caption=title, user=user, content=content, vedio_xml_link="/home/yusn/liteforum/liteforum/static/ressvr/video.xml") post.save() #tags for tag_list in tag_name.split(','): post.tags.add(Tag.objects.get(tag_name=tag_list.strip())) post.save() post_id = Post.objects.order_by('-publish_time')[0].id #qiniu if 'file' in request.FILES: post.vedio_count = 1 post.save() bucket_src = 'sns-picture' q = qiniu.Auth('iaB9zwTfCcWzZgIoHKmxexJee1mY_301y5fnsSSZ', '4c75Nb8qypfYrwOhOwOY_rLdYAiH0937sKYh6yWh') data = request.FILES['file'] token = q.upload_token(bucket_src) key = request.FILES['file'].name+".mp4" ret, info = qiniu.put_data(token, key, data) pfop = PersistentFop(q, bucket_src) op = op_save('avthumb/mp4/vcodec/libx264/s/', bucket_src, key) ops = [] ops.append(op) ret, info = pfop.execute(key, ops, 1) print(info) assert ret['persistentId'] is not None if ret is not None: print('All is OK') else: print(info) # error message in info #create a new video xml os.chdir("/home/yusn/liteforum/liteforum/static/ressvr") template_object = open('video.xml') try: all_the_text = template_object.read() all_the_text = all_the_text.replace("#replace#", request.FILES['file'].name.encode("utf-8")) new_xml = open(request.FILES['file'].name.encode("utf-8")+'.xml', 'w') new_xml.write(all_the_text) new_xml.close() post.vedio_xml_link = request.FILES['file'].name.encode("utf-8")+'.xml' post.save() finally: template_object.close( ) return HttpResponseRedirect('/forum/%s' % post.id) else: post_form = PostForm() tag = TagForm(initial={'tag_name': 'others'}) return render_to_response('forum/add_post.html', {'form': post_form, 'tag': tag}, RequestContext(request)) else: return render(request, 'forum/login.html', {})
# coding: utf-8 # zhangtaichao import config.param as param from qiniu import Auth, PersistentFop, build_op, op_save key_src= '赤壁赋第一讲赏读.mp4' q = Auth(param.AccessKey,param.SecretKey) pfop = PersistentFop(q,param.bucket,param.pipeline) #op = op_save('avthumb/m3u8/segtime/10/vcodec/libx264/s/320x240', saved_bucket, saved_key) #op = op_save('avthumb/m3u8/segtime/10/vcodec/libx264/s/320x240') ops = { 'r':24, 'vb':'56k' } op = build_op('avthumb','flv',**ops) ops = [] ops.append(op) ret, info = pfop.execute(key_src, ops, 1) print(info) assert ret['persistentId'] is not None
from qiniu import Auth, urlsafe_base64_encode, PersistentFop # AK,SK,初始化 access_key = 'your_AK' secret_key = 'your_SK' q = Auth(access_key, secret_key) # 参数给定 bucket_name = '' #空间名 key = '' #索引文件 fops = 'mkzip/4' save_key = urlsafe_base64_encode('') #保存的空间和名字 fops = fops + '|saves/' + save_key pipline = '' # 指定私有队列 # 开始执行 pfops = PersistentFop(q, bucket_name, pipline) ops = [] ops.append(fops) ret, info = pfops.execute(key, ops, 1) print('本次处理结果的作业ID', ret) print('返回结果:', info)
from qiniu import Auth, PersistentFop, build_op, op_save, urlsafe_base64_encode #对已经上传到七牛的视频发起异步转码操作 access_key = 'Access_Key' secret_key = 'Secret_Key' q = Auth(access_key, secret_key) #要转码的文件所在的空间和文件名。 bucket = 'Bucket_Name' key = '1.mp4' #转码是使用的队列名称。 pipeline = 'mpsdemo' #需要添加水印的图片UrlSafeBase64,可以参考http://developer.qiniu.com/code/v6/api/dora-api/av/video-watermark.html base64URL = urlsafe_base64_encode( 'http://developer.qiniu.com/resource/logo-2.jpg') #视频水印参数 fops = 'avthumb/mp4/' + base64URL #可以对转码后的文件进行使用saveas参数自定义命名,当然也可以不指定文件会默认命名并保存在当前空间 saveas_key = urlsafe_base64_encode('目标Bucket_Name:自定义文件key') fops = fops + '|saveas/' + saveas_key pfop = PersistentFop(q, bucket, pipeline) ops = [] ops.append(fops) ret, info = pfop.execute(key, ops, 1) print(info) assert ret['persistentId']
# coding: utf-8 # zhangtaichao import config.param as param from qiniu import Auth, PersistentFop, build_op, op_save key_src = '赤壁赋第一讲赏读.mp4' q = Auth(param.AccessKey, param.SecretKey) pfop = PersistentFop(q, param.bucket, param.pipeline) #op = op_save('avthumb/m3u8/segtime/10/vcodec/libx264/s/320x240', saved_bucket, saved_key) #op = op_save('avthumb/m3u8/segtime/10/vcodec/libx264/s/320x240') ops = {'r': 24, 'vb': '56k'} op = build_op('avthumb', 'flv', **ops) ops = [] ops.append(op) ret, info = pfop.execute(key_src, ops, 1) print(info) assert ret['persistentId'] is not None