Files
youtube-dl/lib/tool_expand/fileprocess.py
2025-12-25 19:42:32 +09:00

327 lines
13 KiB
Python

# -*- coding: utf-8 -*-
#########################################################
# python
import os
import re
import shutil
import threading
import time
import traceback
from framework import app
from . import logger
EXTENSION = 'mp4|avi|mkv|ts|wmv|m2ts|smi|srt|ass|m4v|flv|asf|mpg|ogm'
class ToolExpandFileProcess(object):
@classmethod
def remove_extension(cls, filename):
ret = filename
regex = r'(.*?)\.(?P<ext>%s)$' % EXTENSION
match = re.compile(regex).match(filename)
if match:
ret = filename.replace('.' + match.group('ext'), '')
return ret
@classmethod
def remove_small_file_and_move_target(cls, path, size, target=None, except_ext=None, small_move_path=None):
''' path 안의 폴더들을 재귀탐색하여 기준 크기보다 작은 것은 삭제하고 크기보다 큰 것은 target 경로로 이동한다. 결론적으로 모든 폴더들은 삭제된다.
target이 None경우 path 로 이동한다. 이동할때 파일이 이미 존재하는 경우 파일을 삭제한다. 크기 체크 안함.
Argument
path : 정리할 폴더
size : 파일 크기. 메가단위
target : 이동할 폴더. None경우 path
except_exe : 삭제하지 않을 확장자. 기본 : ['.smi', '.srt', 'ass']
no_remove_path : None인 경우 삭제. 값이 있는 경우 삭제가 아닌 이동
Return
True : 성공
False : 실패
'''
try:
if target is None:
target = path
if except_ext is None:
except_ext = ['.smi', '.srt', '.ass', '.sup']
lists = os.listdir(path)
for f in lists:
try:
file_path = os.path.join(path, f)
except_file = False
if os.path.splitext(file_path.lower())[1] in except_ext:
except_file = True
if os.path.isdir(file_path):
cls.remove_small_file_and_move_target(file_path, size, target=target, except_ext=except_ext)
if not os.listdir(file_path):
logger.info('REMOVE DIR : %s', file_path)
os.rmdir(file_path)
else:
if os.stat(file_path).st_size > 1024 * 1024 * size or except_file:
if path == target:
continue
try:
logger.info('MOVE : %s', os.path.join(target, f))
except:
logger.info('MOVE')
if os.path.exists(os.path.join(target, f)):
logger.info(u'ALREADY in Target : %s', os.path.join(target, f))
os.remove(file_path)
else:
shutil.move(file_path, os.path.join(target, f))
else:
if small_move_path is None or small_move_path == '':
try:
logger.info(u'FILE REMOVE : %s %s', file_path, os.stat(file_path).st_size)
except:
logger.info(u'FILE REMOVE')
os.remove(file_path)
else:
logger.info(u'SNALL FILE MOVE : %s', file_path)
shutil.move(file_path, os.path.join(small_move_path, f))
except UnicodeDecodeError:
pass
except Exception as e:
logger.error(f"Exception:{str(e)}")
logger.error(traceback.format_exc())
except Exception as e:
logger.error(f"Exception:{str(e)}")
logger.error(traceback.format_exc())
@classmethod
def change_filename_censored(cls, filename):
#24id
# 2021-06-30
tmp = os.path.splitext(filename)
if tmp[-1].lower() in ['.smi', '.ass', '.srt', '.sup']:
return filename.lower()
match = re.compile('\d{2}id', re.I).search(filename.lower())
id_before = None
if match:
id_before = match.group(0)
filename = filename.lower().replace(id_before, 'zzid')
try:
filename = cls.change_filename_censored_old(filename)
if filename is not None:
if id_before is not None:
filename = filename.replace('zzid', id_before)
base, ext = os.path.splitext(filename)
tmps = base.split('-')
tmp2 = tmps[1].split('cd')
if len(tmp2) == 1:
tmp = '%s-%s%s' % (tmps[0], str(int(tmps[1])).zfill(3), ext)
elif len(tmp2) == 2:
tmp = '%s-%scd%s%s' % (tmps[0], str(int(tmp2[0])).zfill(3), tmp2[1], ext)
return tmp
except Exception as e:
logger.debug('filename : %s', filename)
logger.error(f"Exception:{str(e)}")
logger.error(traceback.format_exc())
return filename
@classmethod
def change_filename_censored_old(cls, filename):
#logger.debug('get_plex_filename:%s', file)
original_filename = filename
#return file
filename = filename.lower()
#-h264 제거
filename = filename.replace('-h264', '')
filename = filename.replace('-264', '')
#2019-10-06 -■-IBW-670Z_1080p.mkv => ibw-6701080 [-■-IBW-670Z_1080p].mkv
filename = filename.replace('z_1080p', '').replace('z_720p', '')
filename = filename.replace('z_', '')
filename = filename.replace('-c.', '.')
filename = filename.replace('c.', '.')
# 2021-11-09
for sp in ['.com@', '.com-']:
tmp = filename.split(sp)
logger.error(tmp)
if len(tmp) == 2:
filename = tmp[1]
#if file.find('@') != -1:
# file = file.split('@')[1]
# 1080p
regex = r'^(?P<code>.*?)\.1080p\.(?P<ext>%s)$' % EXTENSION
match = re.compile(regex).match(filename)
if match:
filename = '%s.%s' % (match.group('code'), match.group('ext'))
# fhd
#regex = r'^(?P<code>.*?)fhd\.(?P<ext>%s)$' % EXTENSION
#2019-10-06
# sdmu-676_FHD.mp4 => sdmu-676cd-1 [sdmu-676_FHD].mp4
regex = r'^(?P<code>.*?)(\_|\-)fhd\.(?P<ext>%s)$' % EXTENSION
match = re.compile(regex).match(filename)
if match:
filename = '%s.%s' % (match.group('code'), match.group('ext'))
# [ ]숫자 제거
regex = r'^\[.*?\]\d+(?P<code>.*?)\.(?P<ext>%s)$'
match = re.compile(regex).match(filename)
if match:
filename = '%s.%s' % (match.group('code'), match.group('ext'))
# [ ] 제거
regex = r'^\[.*?\](?P<code>.*?)\.(?P<ext>%s)$' % EXTENSION
match = re.compile(regex).match(filename)
if match:
filename = '%s.%s' % (match.group('code'), match.group('ext'))
# ( ) 제거
regex = r'^\(.*?\)(?P<code>.*?)\.(?P<ext>%s)$' % EXTENSION
match = re.compile(regex).match(filename)
if match:
filename = '%s.%s' % (match.group('code'), match.group('ext'))
# 3,4자리 숫자
regex = r'^\d{3,4}(?P<code>.*?)\.(?P<ext>%s)$' % EXTENSION
match = re.compile(regex).match(filename)
if match:
filename = '%s.%s' % (match.group('code'), match.group('ext'))
regex = r'^.*\.com\-?\d*\-?\d*@?(?P<code>.*?)(\-h264)??\.(?P<ext>%s)$' % EXTENSION
match = re.compile(regex).match(filename)
if match:
filename = '%s.%s' % (match.group('code'), match.group('ext'))
regex = r'^(?P<dummy>.*\.com.*?)(?P<code>[a-z]+)'
match = re.compile(regex).match(filename)
if match:
filename = filename.replace(match.group('dummy'), '')
# -5 제거
regex = r'^(?P<code>.*?)\-5.(?P<ext>%s)$' % EXTENSION
match = re.compile(regex).match(filename)
if match:
filename = '%s.%s' % (match.group('code'), match.group('ext'))
# dhd1080.com@1fset00597hhb.mp4
#regex = r'^.*?com@(\d)?(?P<code>[a-z]+\d+)\w+.(?P<ext>%s)$' % EXTENSION
#match = re.compile(regex).match(file)
#if match:
# file = '%s.%s' % (match.group('code'), match.group('ext'))
# s-cute
regex = r'^s-cute\s(?P<code>\d{3}).*?.(?P<ext>%s)$' % EXTENSION
match = re.compile(regex).match(filename)
if match:
ret = 'scute-%s.%s' % (match.group('code'), match.group('ext'))
return ret.lower()
logger.debug('5. %s', filename)
regex_list = [
r'^(?P<name>[a-zA-Z]+)[-_]?(?P<no>\d+)(([-_]?(cd|part)?(?P<part_no>\d))|[-_]?(?P<part_char>\w))?\.(?P<ext>%s)$' % EXTENSION,
r'^\w+.\w+@(?P<name>[a-zA-Z]+)[-_]?(?P<no>\d+)(([-_\.]?(cd|part)?(?P<part_no>\d))|[-_\.]?(?P<part_char>\w))?\.(?P<ext>%s)$' % EXTENSION
]
for regex in regex_list:
match = re.compile(regex).match(filename)
if match:
ret = filename
part = None
if match.group('part_no') is not None:
part = 'cd%s' % match.group('part_no')
elif match.group('part_char') is not None:
part = 'cd%s' % (ord(match.group('part_char').lower()) - ord('a') + 1)
if part is None:
ret = '%s-%s.%s' % (match.group('name').lower(), match.group('no'), match.group('ext'))
else:
ret = '%s-%s%s.%s' % (match.group('name').lower(), match.group('no'), part, match.group('ext'))
#logger.debug('%s -> %s' % (file, ret))
return ret.lower()
# T28 - 매치여야함.
#logger.debug('N2 before:%s', file)
regex = r'(?P<name>[a-zA-Z]+\d+)\-(?P<no>\d+).*?\.(?P<ext>%s)$' % EXTENSION
match = re.compile(regex).match(filename)
if match:
ret = '%s-%s.%s' % (match.group('name'), match.group('no'), match.group('ext'))
#logger.debug('N2. %s -> %s' % (file, ret))
return ret.lower()
# 오리지널로 ABC123 매치여야함.
# hjd2048.com-0113meyd466-264.mp4
#logger.debug('N3 before:%s', original_filename)
regex = r'^(?P<name>[a-zA-Z]{3,})\-?(?P<no>\d+).*?\.(?P<ext>%s)$' % EXTENSION
#logger.debug(file)
match = re.compile(regex).match(filename)
if match:
ret = '%s-%s.%s' % (match.group('name'), match.group('no'), match.group('ext'))
#logger.debug('N3. %s -> %s' % (file, ret))]
#logger.debug('match 00')
return ret.lower()
regex = r'^(?P<name>[a-zA-Z]{3,})\-?(?P<no>\d+).*?\.(?P<ext>%s)$' % EXTENSION
match = re.compile(regex).match(original_filename)
if match:
ret = '%s-%s.%s' % (match.group('name'), match.group('no'), match.group('ext'))
#logger.debug('N3. %s -> %s' % (file, ret))]
#logger.debug('match 11')
return ret.lower()
# 서치
#logger.debug('N1 before:%s', file)
regex = r'(?P<name>[a-zA-Z]+)\-(?P<no>\d+).*?\.(?P<ext>%s)$' % EXTENSION
match = re.compile(regex).search(filename)
if match:
ret = '%s-%s.%s' % (match.group('name'), match.group('no'), match.group('ext'))
#logger.debug('N1. %s -> %s' % (file, ret))
#logger.debug('match 22')
return ret.lower()
# 서치
#logger.debug('N1 before:%s', file)
regex = r'(?P<name>[a-zA-Z]+)\-(?P<no>\d+).*?\.(?P<ext>%s)$' % EXTENSION
match = re.compile(regex).search(original_filename)
if match:
ret = '%s-%s.%s' % (match.group('name'), match.group('no'), match.group('ext'))
#logger.debug('N1. %s -> %s' % (file, ret))
#logger.debug('match 33')
return ret.lower()
#21-01-08 fbfb.me@sivr00103.part1.mp4
regex = r'\w+.\w+@(?P<name>[a-zA-Z]+)(?P<no>\d{5})\.(cd|part)(?P<part_no>\d+)\.(?P<ext>%s)$' % EXTENSION
match = re.compile(regex).match(original_filename)
if match:
ret = filename
part = None
if match.group('part_no') is not None:
part = 'cd%s' % match.group('part_no')
if part is None:
ret = '%s-%s.%s' % (match.group('name').lower(), match.group('no'), match.group('ext'))
else:
ret = '%s-%s%s.%s' % (match.group('name').lower(), match.group('no'), part, match.group('ext'))
#logger.debug('%s -> %s' % (file, ret))
return ret.lower()
#20-02-02
regex = r'\w+.\w+@(?P<name>[a-zA-Z]+)(?P<no>\d{5}).*?.(?P<ext>%s)$' % EXTENSION
match = re.compile(regex).search(original_filename)
if match:
no = match.group('no').replace('0', '').zfill(3)
ret = '%s-%s.%s' % (match.group('name'), no, match.group('ext'))
#logger.debug('match 44')
return ret.lower()
#logger.debug('%s -> %s' % (file, None))
return None