def move_item(item): logger.debug('Move media item : %s to %s ', item['file'][0], ModelSetting.get('move_path')) try: celery_shutil.move(item['file'][0], ModelSetting.get('move_path')) ModelItem.save_as_dict(item) except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc())
def run(self): # import youtube_dl from .plugin import YOUTUBE_DL_PACKAGE youtube_dl = __import__('%s' % YOUTUBE_DL_PACKAGE) import glob2 try: self.start_time = datetime.now() self.status = Status.START # headers는 전역으로 계속 사용하기 때문에 매번 세팅 youtube_dl.utils.std_headers = self.headers # 동영상 정보 가져오기 info_dict = MyYoutubeDL.get_info_dict(self.url, self.opts.get('proxy'), self.opts.get('cookiefile')) if info_dict is None: self.status = Status.ERROR return self.info_dict['extractor'] = info_dict['extractor'] self.info_dict['title'] = info_dict.get('title', info_dict['id']) self.info_dict['uploader'] = info_dict.get('uploader', '') self.info_dict['uploader_url'] = info_dict.get('uploader_url', '') ydl_opts = { 'logger': MyLogger(), 'progress_hooks': [self.my_hook], # 'match_filter': self.match_filter_func, 'outtmpl': os.path.join(self.temp_path, self.filename), 'ignoreerrors': True, 'cachedir': False } ydl_opts.update(self.opts) with youtube_dl.YoutubeDL(ydl_opts) as ydl: ydl.download([self.url]) if self.status in (Status.START, Status.FINISHED): # 다운로드 성공 for i in glob2.glob(self.temp_path + '/**/*'): path = i.replace(self.temp_path, self.save_path, 1) if os.path.isdir(i): if not os.path.isdir(path): os.mkdir(path) continue celery_shutil.move(i, path) self.status = Status.COMPLETED except Exception as e: self.status = Status.ERROR logger.error('Exception:%s', e) logger.error(traceback.format_exc()) finally: # 임시폴더 삭제 celery_shutil.rmtree(self.temp_path) if self.status != Status.STOP: self.end_time = datetime.now()
def scheduler_function_tracer(): try: job_list = ModelOffcloud2Job.get_list() for job in job_list: if not job.use_tracer: continue # 토렌트 인포가 실패할수도 있고, 중간에 추가된 경우도 있기 때문에... query = db.session.query(ModelOffcloud2Item) \ .filter(ModelOffcloud2Item.job_id == job.id ) \ .filter(ModelOffcloud2Item.oc_status != '' ) \ .filter(ModelOffcloud2Item.created_time > datetime.datetime.now() + datetime.timedelta(days=ModelSetting.get_int('tracer_max_day')*-1)) \ .filter(ModelOffcloud2Item.torrent_info == None) \ .filter(ModelOffcloud2Item.link.like('magnet%')) items = query.all() if items: for idx, feed in enumerate(items): if feed.make_torrent_info(): db.session.add(feed) db.session.commit() #logger.debug('%s/%s %s', idx, len(items), feed.title) ####################################################### lists = os.listdir(job.mount_path) for target in lists: try: #logger.debug(target) if target == 'SJVA': continue fullpath = os.path.join(job.mount_path, target) # 자막파일은 바로 이동 if os.path.splitext( target.lower())[1] in ['.smi', '.srt', 'ass']: celery_task.move_exist_remove(fullpath, job.move_path, run_in_celery=True) continue if os.path.splitext( target.lower())[1] == '.aria2__temp': target_folder = os.path.join( job.mount_path, 'SJVA', u'기타') if not os.path.exists(target_folder): os.makedirs(target_folder) celery_task.move_exist_remove(fullpath, target_folder, run_in_celery=True) continue if os.path.splitext(target.lower())[1] == '.torrent': target_folder = os.path.join( job.mount_path, 'SJVA', u'torrent') if not os.path.exists(target_folder): os.makedirs(target_folder) celery_task.move_exist_remove(fullpath, target_folder, run_in_celery=True) continue # 해쉬 변경 match = re.match(r'\w{40}', target) if match: feeds = db.session.query( ModelOffcloud2Item).filter( ModelOffcloud2Item.link.like( '%' + target)).all() if len(feeds) == 1: #logger.debug(feeds[0].dirname) #logger.debug(len(feeds[0].dirname)) #logger.debug(feeds[0].filename) if feeds[0].dirname != '': new_fullpath = os.path.join( job.mount_path, feeds[0].dirname) else: new_fullpath = os.path.join( job.mount_path, feeds[0].filename) if not os.path.exists(new_fullpath): celery_task.move(fullpath, new_fullpath, run_in_celery=True) #logger.debug('Hash %s %s', fullpath, new_fullpath) fullpath = new_fullpath target = os.path.basename(new_fullpath) else: logger.debug('HASH NOT MOVED!!!!!!!') if os.path.isdir(fullpath): #feeds = db.session.query(ModelOffcloud2Item).filter(ModelOffcloud2Item.dirname == target).all() feeds = db.session.query( ModelOffcloud2Item).filter( ModelOffcloud2Item.dirname.like( target + '%')).all() else: feeds = db.session.query( ModelOffcloud2Item).filter( ModelOffcloud2Item.filename == target).all() logger.debug('Feeds count : %s, %s, %s', len(feeds), os.path.isdir(fullpath), target) # 이규연의 스포트라이트 _신천지 위장단체와 정치_.E237.200319.720p-NEXT # 이규연의 스포트라이트 (신천지 위장단체와 정치).E237.200319.720p-NEXT.mp4 # 특수문자를 _으로 변경하는 경우 있음. 일단.. 파일만 if len(feeds) == 0: if os.path.isdir(fullpath): pass else: query = db.session.query(ModelOffcloud2Item) for t in target.split('_'): query = query.filter( ModelOffcloud2Item.filename.like('%' + t + '%')) feeds = query.all() if len(feeds) == 1: #rename new_fullpath = os.path.join( job.mount_path, feeds[0].filename) celery_task.move_exist_remove( fullpath, new_fullpath, run_in_celery=True) fullpath = new_fullpath #else: # logger.debug('EEEEEEEEEEEEEEEEEEEEEEE') for feed in feeds: #logger.debug('제목 : %s, %s', feed.title, feed.filecount) flag = True for tmp in feed.torrent_info['files']: #logger.debug('PATH : %s', tmp['path']) #logger.debug(os.path.split(tmp['path'])) if os.path.split(tmp['path'])[0] != '': tmp2 = os.path.join( job.mount_path, os.path.sep.join( os.path.split(tmp['path']))) else: tmp2 = os.path.join( job.mount_path, tmp['path']) #logger.debug('변환 : %s', tmp2) #if os.path.exists(tmp2): # logger.debug('File Exist : True') #else: # logger.debug('파일 없음!!') # flag = False # break if not os.path.exists(tmp2): logger.debug('NOT FIND :%s', tmp2) flag = False break #2020-06-26 #생성이 추적기간 끝나면 이동 if flag == False: try: ctime = int(os.path.getctime(fullpath)) delta = datetime.datetime.now( ) - datetime.datetime.fromtimestamp(ctime) if delta.days >= ModelSetting.get_int( 'tracer_max_day'): flag = True logger.debug('TRACER_MAX_DAY OVER') except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc()) if flag: dest_fullpath = os.path.join( job.move_path, target) if os.path.exists(dest_fullpath): dup_folder = os.path.join( job.mount_path, 'SJVA', u'중복') if not os.path.exists(dup_folder): os.makedirs(dup_folder) dest_folder = dup_folder else: dest_folder = job.move_path #logger.debug('이동 전: %s' % fullpath) celery_task.move_exist_remove( fullpath, dest_folder, run_in_celery=True) logger.debug('이동 완료: %s, %s' % (fullpath, dest_folder)) #else: # logger.debug('대기 : %s' % fullpath) except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc()) except Exception as e: logger.error('Exception:%s', e) logger.error(traceback.format_exc()) return False