def start(self): VideoHelper.handle_meida_db_exists() exist_media_dirs = VideoHelper.gen_dir() if Globals.TEST_MEIDA_DIR_TAGS: self.test_tags(exist_media_dirs) for src in VideoHelper.src_dbs(): media_src_root = Path(VideoHelper.media_root(src.path)) files = media_src_root.rglob('*.*') files = self.sort_files(files) for file in files: if not file.is_file() or not yutils.is_movie(file): continue media_db = VideoHelper.get_media_mpath_db(src.query, str(file.as_posix()), exist_media_dirs) if media_db == None: continue VideoHelper.check_media_db_state(media_db) if MediaHelp.is_err(media_db.state): media_db.save() continue VideoHelper.analysis_audio_info(media_db, src.query) VideoHelper.compress_media(media_db) # VideoHelper.create_ts(media_db) VideoHelper.create_thum(media_db) VideoHelper.modify_state(media_db, MediaHelp.STATE_VIDOE_COMPRESS_FINISH) logger.info('VideoService--------------同步结束!')
def get_media_mpath_db(src_db, file_path: str, mdirs): # ypath.convert_path(src.replace(self.src_root, '')), # str(file.as_posix()), exist_media_dirs, self.desc_root if os.path.isdir(file_path): return None if not yutils.is_movie(file_path): return None file_path = ypath.convert_path(file_path) media_db_query = Media.objects.filter(abs_path=file_path) cur_media_db = None if len(media_db_query) > 0: cur_media_db = media_db_query[0] return cur_media_db else: # target = ypath.decompose_path( # file, str(src_root), str(convert_root), exten='.mp4') media_db = Media() if (os.path.dirname(file_path) in mdirs): media_db.src_dir = mdirs[os.path.dirname( file_path)] # media_db.src_mpath.dir_id else: logger.info('该文件没有父文件夹:' + file_path) return None media_db.abs_path = file_path media_db.state = MediaHelp.STATE_INIT media_db.file_name = os.path.basename(file_path) media_db.src_mpath = src_db media_db.desc_path = ypath.del_exten( file_path.replace(media_root(src_db.path), '')) + '.mp4' # media_db.nginx_path = target.replace(str(convert_root.as_posix()), '') # create_db_list.append(media_db) # media_db.folder_key = dm_dict[os.path.dirname(file_path)] return media_db
def delete_not_exist(): if not os.path.exists(middle): logger.info('middle not exist!') return print('[delete_not_exist] begin') right_map = {} for root, dirs, files in os.walk(src): for file in files: if not yutils.is_gif(file) and not yutils.is_photo(file): continue source_file = ypath.join(root, file) rename_file = middle_out_file(source_file) if os.path.exists(rename_file): right_map[rename_file] = source_file for root, dirs, files in os.walk(middle): for file in files: if not yutils.is_gif(file) and not yutils.is_photo(file): continue middle_path = ypath.join(root, file) if middle_path in right_map: pass # print('' + source_path + " src:" + right_map[source_path]) else: thum_path = thum + middle_path[len(middle):] if os.path.exists(middle_path): os.remove(middle_path) if os.path.exists(thum_path): os.remove(thum_path) print('删除文件:', middle_path, thum_path) ypath.del_none_dir(middle) ypath.del_none_dir(thum) print('[delete_not_exist] end')
def file_call(file_list): for file in file_list: if not yutils.is_gif(file.ext) and not yutils.is_photo(file.ext): logger.info('这张不是图片:' + file.path) continue if file.path not in exist_in_db_list: new_file_dict.append(file)
def sync_on_back(): if eve.isSet(): logger.info('正在同步,不会做任何操作') # 正在同步了. 不需要修改. return {'res': 2, 'res_str': '正在同步,不会做任何操作'} logger.info('当前状态是没有在同步,即将唤起线程') eve.set() return {'res': 1, 'res_str': '发起同步操作成功!'}
def tag_now(self, intro='', print_it=True, tag_time=True, tag_mem=True): now_t = self._nowTime() now_mem = memory_profiler.memory_usage()[0] if print_it: logger.info( self._pre + intro + str(now_t - self._last_tag_time) + '毫秒,占用内存:' + str(now_mem) + 'Mb,比较之前上升了:' + str( now_mem - self.cur_mem) + 'Mb') self._last_tag_time = now_t self.cur_mem = now_mem
def sync_on_back(): if PhotoService.in_sync(): return {'res': 3, 'res_str': '图片库正在同步,暂时无法同步照片墙!'} if eve.isSet(): logger.info('正在同步,不会做任何操作') # 正在同步了. 不需要修改. return {'res': 2, 'res_str': '正在同步,不会做任何操作'} logger.info('当前状态是没有在同步,即将唤起线程') eve.set() return {'res': 1, 'res_str': '发起同步操作成功!'}
def loop(): global sync_control cur_file_info.clear() if len(src_dbs) == 0: sync_control = False return False logger.info("MediaService一个流程:" + str(len(src_dbs)) + ' ' + src_dbs[0].abs_path) compress(src_dbs[0]) del src_dbs[0] if len(src_dbs) == 0: sync_control = False return False return True
def begin_convert(self): fragment_list\ = PhotoHelper.convert_fragment_list(self.src_dirs, self.MULIT_THREAD_COUNT) tpool = ThreadingPool.ThreadingPool() create_db_list = [] error_list = [] for k in fragment_list: tpool.append(self.begin_threads, create_db_list, fragment_list[k], error_list) tpool.start() if len(create_db_list) > 0: Photo.objects.bulk_create(create_db_list) self.watch.tag_now('图片同步结束:') logger.info('错误图片列表:' + str(error_list))
def compress_media(media_db: Media): if MediaHelp.is_err(media_db.state): return if media_db.desc_mpath == None: with lock: media_db.desc_mpath = MediaPath.pdc().search_by_abs_path( MediaPath.desc(), is_src=False) pass d_abs_path = desc_path( media_db) # ypath.join(media_db.desc_mpath.path, media_db.desc_path) # 如果开关开着. 则不管desc是否已有.,根据数据库去覆盖. if media_db.state < MediaHelp.STATE_COMPRESS_HLS: # 标记为 未转码完毕 if os.path.exists(d_abs_path): if Globals.MEDIA_SERVICE_COVER_DESC: os.remove(d_abs_path) else: logger.info('MediaService.target exists 所以直接修改数据') modify_state(media_db, MediaHelp.STATE_COMPRESS_HLS) else: if not os.path.exists(d_abs_path): # 状态是转码完毕后. 但是desc文件不存在. 则需要重新转码 modify_state(media_db, MediaHelp.STATE_AUDIO_FINISH) if media_db.state >= MediaHelp.STATE_COMPRESS_HLS: logger.info('该文件已经转码过了:' + media_db.abs_path) return if os.path.exists(d_abs_path): os.remove(d_abs_path) ypath.create_dirs(d_abs_path) # media_db.nginx_path = target if media_db.codec_type == 'h264': logger.info('这个视频是 h264流视频, 可以直接复制' + media_db.abs_path) can_audio_copy = (media_db.audio_name == 'aac' or media_db.audio_name == 'mp3') if not can_audio_copy: EmailUtil.send('该文件需要检查audio:' + media_db.abs_path + ' \nmedia_db.audio_name:' + media_db.audio_name) # input('该文件需要检查audio:' + media_db.abs_path) if media_db.abs_path.endswith('.mp4') and can_audio_copy: os.symlink(media_db.abs_path, d_abs_path) else: # 这里进行复制内容 audio_cmd = '-acodec copy' if can_audio_copy else '-acodec mp3' # audio_cmd = '-acodec copy' yutils.process_cmd(ffmpeg_tools + ' -i \"' + media_db.abs_path + '\" -vcodec copy ' + audio_cmd + ' \"' + d_abs_path + '\"') else: # '\"%s\" -i \"%s\" \"%s\"' % (ffmpeg_tools, src_path, target) logger.info('这个视频不是:' + media_db.abs_path) yutils.process_cmd('\"%s\" -i \"%s\" \"%s\"' % (ffmpeg_tools, media_db.abs_path, d_abs_path)) if not os.path.exists(d_abs_path): logger.error('源文件错误:%s' % d_abs_path) modify_state(media_db, MediaHelp.STATE_SRC_ERROR) else: modify_state(media_db, MediaHelp.STATE_COMPRESS_HLS)
def start(self): self.src_dirs = PhotoHelper.src_list(self.src_root) self.desc_dirs = PhotoHelper.desc_list(self.desc_root) logger.info('PhotoService.开始执行同步!!!!') self.err_pic.clear() self.watch.print_now_time('开始图片转换服务. 开启时间:') self.watch.tag_now(print_it=False) logger.info("开始去重...") ypath.delrepeat_file_list(self.src_dirs, PngImagePlugin.MAX_TEXT_MEMORY) self.watch.tag_now('去重操作占用时长:') PhotoHelper.del_not_exist(self.desc_middle_root) logger.info('PhotoConvert.create_dirs begin!') PhotoHelper.create_dirs(self.src_dirs, self.src_root, self.webp_cache_root) logger.info('[create_dirs] end') logger.info('PhotoService.begin_convert begin!') self.begin_convert()
def __send(self, content, tag, title='01-pc的通知'): try: smtpObj = smtplib.SMTP_SSL(host='smtp.qq.com') smtpObj.connect(host='smtp.qq.com', port=465) smtpObj.login(self.sender, 'qjmrhlkopaoicige') message = MIMEText(tag + "\n" + content, 'plain', 'utf-8') message['From'] = self.sender # Header("教程", 'utf-8') message['To'] = self.receivers[0] # Header("接收者", 'utf-8') message['Subject'] = title # message['X-Mailer'] = Header('Microsoft Outlook Express 6.00.2900.2869', 'utf-8') smtpObj.sendmail(self.sender, self.receivers, message.as_string()) print('发送成功') smtpObj.quit() smtpObj.close() return True except smtplib.SMTPException as e: logger.info(e) return False
def gen_dir(): str_media_src = str(media_src_root.as_posix()) dir_db_paths = {} for dir in os.listdir(str_media_src): m_file_list = ypath.path_res(ypath.join(str_media_src, dir), parse_file=False) all_media_dirs = Dir.objects.filter(tags=dir) for dir_db in all_media_dirs: if dir_db.abs_path not in m_file_list: logger.info('被删除的路径:' + dir_db.abs_path) dir_db.delete() else: dir_db_paths[dir_db.abs_path] = dir_db for local_dir in m_file_list: if local_dir.path not in dir_db_paths: dir_db_paths[local_dir.path] = ServiceHelper.create_dir(dir_db_paths, local_dir, yutils.M_FTYPE_MOIVE, dir) # create_dir(dir_db_paths, local_dir, dir) logger.info('创建该文件夹:' + str(local_dir)) return dir_db_paths
def create_dir(cur_dir_dbs, info, type, tags='', save_it=True): name = info.name parent_path = info.parent # info[ypath.KEYS.PARENT] rel_path = info.relative d_model = Dir() d_model.name = name d_model.isdir = True d_model.abs_path = ypath.convert_path(info.path) d_model.rel_path = rel_path d_model.type = type # d_model.tags = tags # if info[ypath.KEYS.LEVEL] == 0 else '' try: parent = cur_dir_dbs[parent_path] # Dir.objects.get(abs_path=parent_path) d_model.parent_dir = parent except Exception as e: logger.info('错误,这货没有爸爸的,忽视这个问题:%s:is not found :%s' % (parent_path, e)) pass if save_it: d_model.save() return d_model
def src2pc(delete_exist): if not os.path.exists(src): logger.info('src2pc:src not exist!') return ImageFile.LOAD_TRUNCATED_IMAGES = True # cmd = 'for i in ' + src + '/*.jpg;do jpegoptim -m50 -d ' + desc + ' -p "$i";done' # os.system(cmd) from frames import ThreadingPool tpool = ThreadingPool.ThreadingPool() img_link_dic = {} for root, dirs, files in os.walk(src): for dir in dirs: src_dir = ypath.join(root, dir) out_dir, single_dir = middle_out_dir(src_dir) img_link_dic[single_dir] = src_dir tpool.append(begin_s2middle_by_threads, src_dir, out_dir, delete_exist) tpool.start() print('end mulite thread!!!!!!!!!!!!!!') return img_link_dic
def create_thum(media_db: Media): if MediaHelp.is_err(media_db.state): return desc_root = media_db.desc_mpath.path media_tum_root = ypath.join( desc_root, movie_config.img_info.img_root ) # TmpUtil.desc() / movie_config.img_info.img_root # convert_root # if media_db.state >= MediaHelp.STATE_VIDEO_THUM: # logger.info('该文件已经转缩略图过了:' + media_db.abs_path) # return target_img_dir = ypath.join(media_tum_root, media_db.desc_path) ypath.create_dirs(target_img_dir) desc = ypath.join(target_img_dir, movie_config.img_info.img) desc_thum = ypath.join(target_img_dir, movie_config.img_info.thum) if os.path.exists(desc) and os.path.exists(desc_thum): logger.info('该视频不需要做缩略图裁切,因为已有:%s' % desc) return # 裁切缩略图的比例 thum_percent = int(movie_config.base_info.thum_w) / int( movie_config.base_info.thum_h) max_thum_time = int(movie_config.base_info.max_thum_time) min_thum_time = int(movie_config.base_info.min_thum_time) ypath.create_dirs(desc) r_time = random.randint( min_thum_time if media_db.duration > min_thum_time else 0, max_thum_time if media_db.duration > max_thum_time else media_db.duration) d_abs_path = ypath.join(media_root(desc_root), media_db.desc_path) cmd = ffmpeg_tools + ' -i \"' + d_abs_path + '\" -y -vframes 1 -ss 00:00:' + str( r_time) + ' -f image2 \"' + desc + '\"' yutils.process_cmd(cmd) if not os.path.exists(desc): return img = Image.open(desc) w, h = img.size crop_img = img.crop(yutils.crop_size(w, h, thum_percent)) crop_img.save(desc_thum)
def start(): watch.tag_now('开始启动服务器') tctime = socket(AF_INET, SOCK_STREAM) tctime.bind(ADDR) tctime.listen(3) while True: logger.info('Wait for connection ...') tctimeClient, addr = tctime.accept() logger.info("Connection from :", str(addr)) # while True: try: data = tctimeClient.recv(buffsize).decode() except Exception: pass # if not data: # print('break!!!!!') # break res = parse_path(find_path(data)) tctimeClient.send(res.encode('gbk')) tctimeClient.close()
def create_ts(media_db: Media): # d_abs_path = ypath.join(media_root(media_db), media_db.desc_path) desc_root = media_db.desc_mpath.path media_ts_dir = ypath.join(desc_root, movie_config.ts_info.ts_dir, media_db.desc_path) if media_db.state >= MediaHelp.STATE_VIDEO_TS and os.path.isdir( media_ts_dir): logger.info('该视频已经切片过了:' + media_db.abs_path) return if os.path.exists(media_ts_dir): shutil.rmtree(media_ts_dir) ypath.create_dirs(media_ts_dir, True) media_desc_path = desc_path( media_db) # ypath.join(desc_path(media_db), media_db.desc_path) m3u8_file = ypath.join(media_ts_dir, movie_config.ts_info.u8name) cmd = '\"' + ffmpeg_tools + '\" -i \"' + media_desc_path + \ '\" -codec copy -vbsf h264_mp4toannexb -map 0 -f segment -segment_list \"' + \ m3u8_file + '\" -segment_time 30 \"' + media_ts_dir + '/%05d.ts\"' yutils.process_cmd(cmd) modify_state(media_db, MediaHelp.STATE_VIDEO_TS) # m3u8_path = ypath.join(media_ts_dir, movie_config.ts_info.u8name) # media_db.m3u8_path = ypath.join(media_db.desc_path, movie_config.ts_info.u8name) print(desc_root)
def m_second_gallery(request, dir_id): if request.method == "POST": try: page = request.POST.get('page') c_id = int(dir_id) json = yquery.pic_level2_2json(c_id, page) print('[m_second_gallery]:', dir_id, page) # return HttpResponse(json) return HttpResponse( json, 'content-type=application/x-www-form-urlencoded') # render(request, 'gallery/secondLevel/index.html', {'json': json, 'pre_path': '/pic/middle'}) except: logger.error('非法参数:', dir_id) else: logger.info('[m_second_gallery]:', dir_id) try: c_id = int(dir_id) json = yquery.pic_level2_2json(c_id, 1) return render(request, 'gallery/secondLevel/index.html', { 'json': json, 'pre_path': '/pic/middle' }) except: logger.error('[m_second_gallery]没有该id的照片:', dir_id)
def list_finish(res, _): logger.info( 'list os files suc! do next:save different list to file! out/upload_list.txt & out/delete_list.txt' ) os_list = org_os_list(res) local_files = local_list(local_path) upload_list, delete_list = diff_path(os_list, local_files) upload_path = [] for upload_item in upload_list: upload_path.append(local_path + upload_item.split('|')[0]) delete_px_list = [] for delete_item in delete_list: if delete_item.split('|')[0] not in upload_path: delete_px_list.append(bucket_dir + delete_item.split('|')[0]) ypath.create_dirs(upload_list_path) with open(upload_list_path, 'w', encoding='utf-8') as f: f.write('\n'.join(upload_path)) ypath.create_dirs(delete_list_path) with open(delete_list_path, 'w', encoding='utf-8') as f: f.write('\n'.join(delete_px_list)) print(upload_list, delete_px_list)
def compress_media(media_db): if MediaHelp.is_err(media_db.state): return # 如果开关开着. 则不管desc是否已有.,根据数据库去覆盖. if media_db.state < MediaHelp.STATE_VIDOE_COMPRESS_FINISH: # 标记为 未转码完毕 if os.path.exists(media_db.desc_path): if Globals.MEDIA_SERVICE_COVER_DESC: os.remove(media_db.desc_path) else: logger.info('MediaService.target exists 所以直接修改数据') modify_state(media_db, MediaHelp.STATE_VIDOE_COMPRESS_FINISH) else: if not os.path.exists(media_db.desc_path): # 状态是转码完毕后. 但是desc文件不存在. 则需要重新转码 modify_state(media_db, MediaHelp.STATE_AUDIO_FINISH) if media_db.state >= MediaHelp.STATE_VIDOE_COMPRESS_FINISH: logger.info('该文件已经转码过了:' + media_db.abs_path) return if os.path.exists(media_db.desc_path): os.remove(media_db.desc_path) ypath.create_dirs(media_db.desc_path) # media_db.nginx_path = target if media_db.codec_type == 'h264': logger.info('这个视频是 h264流视频, 可以直接复制' + media_db.abs_path) if media_db.abs_path.endswith('.mp4'): os.symlink(media_db.abs_path, media_db.desc_path) else: # 这里进行复制内容 yutils.process_cmd( ffmpeg_tools + ' -i \"' + media_db.abs_path + '\" -vcodec copy -acodec copy \"' + media_db.desc_path + '\"') else: # '\"%s\" -i \"%s\" \"%s\"' % (ffmpeg_tools, src_path, target) logger.info('这个视频不是:' + media_db.abs_path) yutils.process_cmd('\"%s\" -i \"%s\" \"%s\"' % (ffmpeg_tools, media_db.abs_path, media_db.desc_path)) if not os.path.exists(media_db.desc_path): logger.error('源文件错误:%s' % media_db.desc_path) modify_state(media_db, MediaHelp.STATE_SRC_ERROR) else: modify_state(media_db, MediaHelp.STATE_VIDOE_COMPRESS_FINISH)
def print_diff_list(res, param): logger.info('bucket suc! do next:list os files') yutils.process_cmd('coscmd list -ar ' + bucket_dir, done_call=list_finish)
def analysis_audio_info(media_db): def movie_info_res(cmdlist, _): if len(cmdlist) <= 0: modify_state(media_db, MediaHelp.STATE_AUDIO_FINISH) return jsonbean = json.loads(''.join(cmdlist)) if 'streams' not in jsonbean.keys(): modify_state(media_db, MediaHelp.STATE_SRC_ERROR) return streamlist = jsonbean['streams'] format = jsonbean['format'] media_db.md5 = yutils.get_md5(media_db.abs_path) media_db.duration = int(float(format['duration'])) # cur_file_info['duration'] = media_db.size = int(format['size']) if len(streamlist) <= 0: modify_state(media_db, MediaHelp.STATE_AUDIO_FINISH) return audio_streams = [] decode_map = '' for stream_item in streamlist: if stream_item['codec_type'] == 'audio': logger.info(str(stream_item)) audio_streams.append(stream_item) else: if stream_item['codec_type'] == 'video': # 如果是视频.保存视频信息 media_db.codec_type = stream_item['codec_name'] media_db.codec_long_name = stream_item['codec_long_name'] media_db.width = int(stream_item['width']) media_db.height = int(stream_item['height']) try: media_db.r_frame_rate = round(eval(stream_item['r_frame_rate'])) media_db.avg_frame_rate = round(eval(stream_item['avg_frame_rate'])) except ZeroDivisionError: media_db.r_frame_rate = 0 media_db.avg_frame_rate = 0 decode_map += ' -map 0:' + str(stream_item['index']) # 有多个语种 digout = False if len(audio_streams) > 1: for audio_stream in audio_streams: if 'tags' in audio_stream and 'title' in audio_stream['tags'] \ and ('国语' == audio_stream['tags']['title'] or '中语' == audio_stream['tags']['title']): decode_map += ' -map 0:' + str(audio_stream['index']) digout = True break else: logger.info('该视频音轨只有一个,不需要转换:' + media_db.abs_path) modify_state(media_db, MediaHelp.STATE_AUDIO_FINISH) return if not digout: for audio_stream in audio_streams: decode_map += ' -map 0:' + str(audio_stream['index']) # out_content += str(index) + ':' + str(audio_stream) + '\n' # index += 1 # select_audio = len(audio_streams) # while len(audio_streams) <= select_audio or select_audio < 0: # select_audio = int(input(out_content + '选择音轨:')) # desc_file = file + mulit_audio_path = TmpUtil.src() / movie_config.base_info.mulit_audio_dir desc_mulit_path = ypath.decompose_path(media_db.abs_path, str(media_src_root), str(mulit_audio_path)) out_file = desc_mulit_path + '.chi' + ypath.file_exten(media_db.abs_path) ypath.create_dirs(desc_mulit_path) if os.path.exists(out_file): os.remove(out_file) logger.info(out_file) copy_cmd = ffmpeg_tools + ' -i \"' + media_db.abs_path + '\"' + decode_map + ' -vcodec copy -acodec copy \"' + out_file + '\"' yutils.process_cmd(copy_cmd, done_call=rm_on_audio_copy, param=(media_db.abs_path, out_file, desc_mulit_path)) if MediaHelp.is_err(media_db.state): return # 音轨结束后,保存源文件到movie_otherformat目录,替换原有文件名. def rm_on_audio_copy(_, files): shutil.move(files[0], files[2]) shutil.move(files[1], files[0]) modify_state(media_db, MediaHelp.STATE_AUDIO_FINISH) if media_db.state >= MediaHelp.STATE_AUDIO_FINISH: logger.info('该文件的音轨已经转换过了:' + media_db.abs_path) return logger.info('开始转换:' + media_db.abs_path) yutils.process_cmd( ffprobe_tools + ' \"' + media_db.abs_path + '\" -print_format json -show_format -show_streams', done_call=movie_info_res)
def print_now_time(self, intro): logger.info(self._pre + intro + datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') + ' 占用内存:' + str( self.cur_mem) + 'Mb')
def _sync(): logger.info('MediaService.开始同步') # gen_dir() dbs = gen_media_dbs() src_dbs.extend(dbs) logger.info('同步成功,正在执行转换程式')
def movie_info_res(cmdlist, _): if len(cmdlist) <= 0: modify_state(media_db, MediaHelp.STATE_AUDIO_FINISH) return jsonbean = json.loads(''.join(cmdlist)) if 'streams' not in jsonbean.keys(): modify_state(media_db, MediaHelp.STATE_SRC_ERROR) return streamlist = jsonbean['streams'] format = jsonbean['format'] media_db.md5 = yutils.get_md5(media_db.abs_path) media_db.duration = int(float(format['duration'])) # cur_file_info['duration'] = media_db.size = int(format['size']) if len(streamlist) <= 0: modify_state(media_db, MediaHelp.STATE_AUDIO_FINISH) return audio_streams = [] decode_map = '' for stream_item in streamlist: if stream_item['codec_type'] == 'audio': logger.info(str(stream_item)) audio_streams.append(stream_item) else: if stream_item['codec_type'] == 'video': # 如果是视频.保存视频信息 media_db.codec_type = stream_item['codec_name'] media_db.codec_long_name = stream_item['codec_long_name'] media_db.width = int(stream_item['width']) media_db.height = int(stream_item['height']) try: media_db.r_frame_rate = round( eval(stream_item['r_frame_rate'])) media_db.avg_frame_rate = round( eval(stream_item['avg_frame_rate'])) except ZeroDivisionError: media_db.r_frame_rate = 0 media_db.avg_frame_rate = 0 decode_map += ' -map 0:' + str(stream_item['index']) # 有多个语种 digout = False if len(audio_streams) > 1: for audio_stream in audio_streams: if 'tags' in audio_stream and 'title' in audio_stream['tags'] \ and ('国语' == audio_stream['tags']['title'] or '中语' == audio_stream['tags']['title']): decode_map += ' -map 0:' + str(audio_stream['index']) media_db.audio_long_name = audio_stream['codec_long_name'] media_db.audio_name = audio_stream['codec_name'] digout = True break else: if len(audio_streams) == 1: media_db.audio_long_name = audio_streams[0]['codec_long_name'] media_db.audio_name = audio_streams[0]['codec_name'] logger.info('该视频音轨只有一个,不需要转换:' + media_db.abs_path) modify_state(media_db, MediaHelp.STATE_AUDIO_FINISH) return if not digout: if len(audio_streams) >= 1: media_db.audio_long_name = audio_streams[0]['codec_long_name'] media_db.audio_name = audio_streams[0]['codec_name'] # media_db.audio_long_name = stream_item['codec_long_name'] # media_db.audio_name = stream_item['codec_name'] for audio_stream in audio_streams: decode_map += ' -map 0:' + str(audio_stream['index']) # out_content += str(index) + ':' + str(audio_stream) + '\n' # index += 1 # select_audio = len(audio_streams) # while len(audio_streams) <= select_audio or select_audio < 0: # select_audio = int(input(out_content + '选择音轨:')) with lock: mulit_audio_path = ypath.join(MediaPath.src(), mulit_audio_dir) desc_mulit_path = ypath.decompose_path(media_db.abs_path, src_db.path, str(mulit_audio_path)) out_file = desc_mulit_path + '.chi' + ypath.file_exten( media_db.abs_path) ypath.create_dirs(desc_mulit_path) if os.path.exists(out_file): os.remove(out_file) logger.info(out_file) copy_cmd = ffmpeg_tools + ' -i \"' + media_db.abs_path + '\"' + decode_map + ' -vcodec copy -acodec copy \"' + out_file + '\"' yutils.process_cmd(copy_cmd, done_call=rm_on_audio_copy, param=(media_db.abs_path, out_file, desc_mulit_path))
def begin_threads(self, create_db_list: list, f_list, err_list): for link_item in f_list: if not yutils.is_gif(link_item.ext) and not yutils.is_photo( link_item.ext): logger.info('这张不是图片:' + link_item.path) continue src_file = link_item.path file_stat = os.stat(src_file) if file_stat.st_size > PngImagePlugin.MAX_TEXT_MEMORY: err_list.append(src_file) continue pi = Photo() pi.src_abs_path = src_file pi.src_name = link_item.relative pi.src_mpath = MediaPath.pdc().search_by_abs_path( link_item.pic_root) try: file_steam = open(src_file, 'rb') pi.src_md5 = yutils.get_md5_steam(file_steam) pi.ctime = int(file_stat.st_ctime) pi.mtime = int(file_stat.st_mtime) desc_rela_name, pi.src_size = PhotoHelper.file_desc_dir( file_stat, pi.src_abs_path, pi.src_md5) src_img = Image.open(file_steam) if src_img.mode == 'RGB': pi.desc_rela_path = desc_rela_name + '.jpg' else: pi.desc_rela_path = desc_rela_name + link_item.ext pi.src_width, pi.src_height = src_img.size except: err_list.append(src_file) logger.info('这张图有错误!!!!!!!!!!!!!!!!!!!!!!!:' + src_file) continue with lock: desc_root = MediaPath.desc() pi.desc_mpath = MediaPath.pdc().search_by_abs_path( desc_root, False) desc_middle_path = ypath.join(desc_root, self.desc_middle_root, pi.desc_rela_path) desc_thum_path = ypath.join(desc_root, self.desc_thum_root, pi.desc_rela_path) desc_webp_path = ypath.join(desc_root, self.desc_webp_root, pi.desc_rela_path) ypath.create_dirs(desc_middle_path) ypath.create_dirs(desc_thum_path) ypath.create_dirs(desc_webp_path) m_img = PhotoHelper.convert_middle(src_img, link_item.path, desc_middle_path, self.middle_area) w, h = m_img.size pi.mid_width = w pi.mid_height = h pi.mid_size = os.path.getsize(desc_middle_path) pi.state = PicHelp.STATE_FINISH pi.is_gif = yutils.is_gif(link_item.ext) # webp_file = ypath.join(desc_webp_root, mulit_file_list[middle_file][0] + '.webp') # convert_webp(m_img, webp_file, middle_file) t_img = PhotoHelper.cut_middle2thum(m_img, desc_thum_path, self.thum_size) if m_img is not t_img: del m_img del t_img else: del m_img with lock: create_db_list.append(pi) if len(create_db_list) >= PhotoHelper.SYNC_PHOTO_DB_COUNT: Photo.objects.bulk_create(create_db_list) create_db_list.clear()
print('删除文件:', middle_path, thum_path) ypath.del_none_dir(middle) ypath.del_none_dir(thum) print('[delete_not_exist] end') if __name__ == '__main__': src = TmpUtil.src() src = ypath.join(src, pic_cfg.dir_root) desc = TmpUtil.desc() desc = ypath.join(desc, pic_cfg.dir_root) gif_space = TmpUtil.input_note(GIF_SPACE, '请指定gif的占位符的图片位置:\n') logger.info('初始化成功src:', src, ',desc:', desc, 'gif_space:', gif_space) middle = ypath.join(desc, pic_cfg.middle) thum = ypath.join(desc, pic_cfg.thum) other_file.clear() # 去重 ypath.delrepeat_file(src) # 去掉middle中的图. delete_not_exist() link_dic = src2pc(False) if len(other_file) > 0: str = input('警告!发现非图片或gif的文件,请确认:\n').lower() if 'y' != str: sys.exit(0)
# from MryangService import MediaService as ms def im_out(s_name, s_time=60): # 没事做了,睡1分钟在看看有没有事,这个如果service多了是否会造成空跑的影响?这个再说了. time.sleep(s_time) def proxy_method(ins, method_log): print() if __name__ == '__main__': # FileObserver.append_call(ms, '/media/') logger.info("服务启动正常,该服务进程id:" + str(os.getpid())) # tp.append(FileObserver.start, TmpUtil.src()) # tp.append(proxy_method, ms, 'MediaService.loop') # tp.append(proxy_method, ps, 'PicService.loop') # () # PhotoService.start() # PhotoConvert.start() tp = tp() tp.append(PhotoService.start) # tp.append(VideoService.start) # tp.append(statewatch.start) # PicConvert.start() # MPath.objects.all().delete() # tp.append(PicConvert.start) # tp.append(proxy_method, statewatch, 'statewatch.loop')