Beispiel #1
0
 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())
Beispiel #2
0
    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()
Beispiel #3
0
    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