migrate to pathlib

This commit is contained in:
jonathan 2021-06-01 14:37:43 +02:00
parent 69e1cfeedd
commit 73eaa81e2a
5 changed files with 41 additions and 48 deletions

View File

@ -2,8 +2,8 @@
custom video filter, which get loaded automatically custom video filter, which get loaded automatically
""" """
import os
import re import re
from pathlib import Path
from ..utils import lower_third from ..utils import lower_third
@ -13,11 +13,11 @@ def filter_link(node):
extract title from file name and overlay it extract title from file name and overlay it
""" """
font = '' font = ''
source = os.path.basename(node.get('source')) source = str(Path(node.get('source')).name)
match = re.match(lower_third.regex, source) match = re.match(lower_third.regex, source)
title = match[1] if match else source title = match[1] if match else source
if lower_third.fontfile and os.path.isfile(lower_third.fontfile): if lower_third.fontfile and Path(lower_third.fontfile).is_file():
font = f":fontfile='{lower_third.fontfile}'" font = f":fontfile='{lower_third.fontfile}'"
if lower_third.text_from_filename: if lower_third.text_from_filename:

View File

@ -19,11 +19,10 @@
This module handles folder reading. It monitor file adding, deleting or moving This module handles folder reading. It monitor file adding, deleting or moving
""" """
import glob
import os
import random import random
import time import time
from copy import deepcopy from copy import deepcopy
from pathlib import Path
from watchdog.events import PatternMatchingEventHandler from watchdog.events import PatternMatchingEventHandler
from watchdog.observers import Observer from watchdog.observers import Observer
@ -58,8 +57,7 @@ class MediaStore:
""" """
for ext in storage.extensions: for ext in storage.extensions:
self.store.extend( self.store.extend(
glob.glob(os.path.join(self.folder, '**', f'*{ext}'), [str(f) for f in Path(self.folder).rglob(f'*{ext}')])
recursive=True))
def sort_or_radomize(self): def sort_or_radomize(self):
""" """
@ -124,8 +122,8 @@ class MediaWatcher:
add file to media list only if it is completely copied add file to media list only if it is completely copied
""" """
file_size = -1 file_size = -1
while file_size != os.path.getsize(event.src_path): while file_size != Path(event.src_path).stat().st_size:
file_size = os.path.getsize(event.src_path) file_size = Path(event.src_path).stat().st_size
time.sleep(1) time.sleep(1)
self._media.add(event.src_path) self._media.add(event.src_path)

View File

@ -19,9 +19,8 @@
This module write the files compression directly to a hls (m3u8) playlist. This module write the files compression directly to a hls (m3u8) playlist.
""" """
import os
import re import re
from glob import iglob from pathlib import Path
from subprocess import PIPE, Popen from subprocess import PIPE, Popen
from threading import Thread from threading import Thread
@ -44,23 +43,20 @@ def clean_ts():
for m3u8_file in m3u8_files: for m3u8_file in m3u8_files:
messenger.debug(f'cleanup *.ts files from: "{m3u8_file}"') messenger.debug(f'cleanup *.ts files from: "{m3u8_file}"')
test_num = 0 test_num = 0
hls_path = os.path.dirname(m3u8_file) hls_path = Path(m3u8_file).parent
if os.path.isfile(m3u8_file): if Path(m3u8_file).is_file():
with open(m3u8_file, 'r') as m3u8: with open(m3u8_file, 'r') as m3u8:
for line in m3u8: for line in m3u8:
if '.ts' in line: if '.ts' in line:
test_num = int(re.findall(r'(\d+).ts', line)[0]) test_num = int(re.findall(r'(\d+).ts', line)[0])
break break
for ts_file in iglob(os.path.join(hls_path, '*.ts')): for ts_file in hls_path.rglob('*.ts'):
ts_num = int(re.findall(r'(\d+).ts', ts_file)[0]) ts_num = int(re.findall(r'(\d+).ts', str(ts_file))[0])
if test_num > ts_num: if test_num > ts_num:
try: ts_file.unlink(missing_ok=True)
os.remove(ts_file)
except OSError:
pass
def output(): def output():

View File

@ -21,12 +21,12 @@ Empty, missing or any other playlist related failure should be compensate.
Missing clips will be replaced by a dummy clip. Missing clips will be replaced by a dummy clip.
""" """
import os
import socket import socket
import time import time
from copy import deepcopy from copy import deepcopy
from datetime import timedelta from datetime import timedelta
from math import isclose from math import isclose
from pathlib import Path
from threading import Thread from threading import Thread
import requests import requests
@ -161,7 +161,7 @@ def validate_thread(clip_nodes, list_date):
if probe.is_remote: if probe.is_remote:
if not probe.video[0]: if not probe.video[0]:
missing.append(f'Remote file not exist: "{source}"') missing.append(f'Remote file not exist: "{source}"')
elif source is None or not os.path.isfile(source): elif source is None or not Path(source).is_file():
missing.append(f'File not exist: "{source}"') missing.append(f'File not exist: "{source}"')
if not type(node.get('in')) in [int, float]: if not type(node.get('in')) in [int, float]:
@ -219,8 +219,8 @@ class PlaylistReader:
json_file = stdin_args.playlist json_file = stdin_args.playlist
else: else:
year, month, _ = self.list_date.split('-') year, month, _ = self.list_date.split('-')
json_file = os.path.join(playlist.path, year, month, json_file = str(Path(playlist.path).joinpath(
f'{self.list_date}.json') year, month, f'{self.list_date}.json'))
if '://' in json_file: if '://' in json_file:
json_file = json_file.replace('\\', '/') json_file = json_file.replace('\\', '/')
@ -241,9 +241,9 @@ class PlaylistReader:
messenger.error(f'No valid playlist from url: {json_file}') messenger.error(f'No valid playlist from url: {json_file}')
self.error = True self.error = True
elif os.path.isfile(json_file): elif Path(json_file).is_file():
# check last modification time from playlist # check last modification time from playlist
mod_time = os.path.getmtime(json_file) mod_time = Path(json_file).stat().st_mtime
if mod_time > self.last_mod_time: if mod_time > self.last_mod_time:
with open(json_file, 'r', encoding='utf-8') as playlist_file: with open(json_file, 'r', encoding='utf-8') as playlist_file:
self.nodes = valid_json(playlist_file) self.nodes = valid_json(playlist_file)

View File

@ -22,7 +22,6 @@ This module contains default variables and helper functions
import json import json
import logging import logging
import math import math
import os
import re import re
import signal import signal
import smtplib import smtplib
@ -35,8 +34,9 @@ from datetime import date, datetime, timedelta
from email.mime.multipart import MIMEMultipart from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText from email.mime.text import MIMEText
from email.utils import formatdate from email.utils import formatdate
from glob import glob
from logging.handlers import TimedRotatingFileHandler from logging.handlers import TimedRotatingFileHandler
from pathlib import Path
from platform import system
from shutil import which from shutil import which
from subprocess import STDOUT, CalledProcessError, check_output from subprocess import STDOUT, CalledProcessError, check_output
from types import SimpleNamespace from types import SimpleNamespace
@ -44,8 +44,8 @@ from types import SimpleNamespace
import yaml import yaml
# path to user define configs # path to user define configs
CONFIG_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), CONFIG_PATH = Path(__file__).parent.absolute().joinpath('conf.d')
'conf.d')
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# argument parsing # argument parsing
@ -88,7 +88,7 @@ stdin_parser.add_argument(
) )
# read dynamical new arguments # read dynamical new arguments
for arg_file in glob(os.path.join(CONFIG_PATH, 'argparse_*')): for arg_file in CONFIG_PATH.glob('argparse_*'):
with open(arg_file, 'r') as _file: with open(arg_file, 'r') as _file:
config = yaml.safe_load(_file) config = yaml.safe_load(_file)
@ -164,7 +164,7 @@ def read_config():
if stdin_args.config: if stdin_args.config:
cfg_path = stdin_args.config cfg_path = stdin_args.config
elif os.path.isfile('/etc/ffplayout/ffplayout.yml'): elif Path('/etc/ffplayout/ffplayout.yml').is_file():
cfg_path = '/etc/ffplayout/ffplayout.yml' cfg_path = '/etc/ffplayout/ffplayout.yml'
else: else:
cfg_path = 'ffplayout.yml' cfg_path = 'ffplayout.yml'
@ -242,7 +242,7 @@ playlist.length = _p_length
log.to_file = _cfg['logging']['log_to_file'] log.to_file = _cfg['logging']['log_to_file']
log.backup_count = _cfg['logging']['backup_count'] log.backup_count = _cfg['logging']['backup_count']
log.path = _cfg['logging']['log_path'] log.path = Path(_cfg['logging']['log_path'])
log.level = _cfg['logging']['log_level'] log.level = _cfg['logging']['log_level']
log.ff_level = _cfg['logging']['ffmpeg_level'] log.ff_level = _cfg['logging']['ffmpeg_level']
@ -333,17 +333,16 @@ encoder_logger = logging.getLogger('encoder')
encoder_logger.setLevel(log.ff_level) encoder_logger.setLevel(log.ff_level)
if log.to_file and log.path != 'none': if log.to_file and log.path != 'none':
if log.path and os.path.isdir(log.path): if log.path.is_dir():
playout_log = os.path.join(log.path, 'ffplayout.log') playout_log = log.path('ffplayout.log')
decoder_log = os.path.join(log.path, 'decoder.log') decoder_log = log.path('decoder.log')
encoder_log = os.path.join(log.path, 'encoder.log') encoder_log = log.path('encoder.log')
else: else:
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) log_dir = Path(__file__).parent.absolute().joinpath('log')
log_dir = os.path.join(base_dir, 'log') log_dir.mkdir(exist_ok=True)
os.makedirs(log_dir, exist_ok=True) playout_log = log_dir.joinpath('ffplayout.log')
playout_log = os.path.join(log_dir, 'ffplayout.log') decoder_log = log_dir.joinpath('decoder.log')
decoder_log = os.path.join(log_dir, 'decoder.log') encoder_log = log_dir.joinpath('encoder.log')
encoder_log = os.path.join(log_dir, 'encoder.log')
p_format = logging.Formatter('[%(asctime)s] [%(levelname)s] %(message)s') p_format = logging.Formatter('[%(asctime)s] [%(levelname)s] %(message)s')
f_format = logging.Formatter('[%(asctime)s] %(message)s') f_format = logging.Formatter('[%(asctime)s] %(message)s')
@ -388,7 +387,7 @@ class Mailer:
self.time = None self.time = None
self.timestamp = get_time('stamp') self.timestamp = get_time('stamp')
self.rate_limit = 600 self.rate_limit = 600
self.temp_msg = os.path.join(tempfile.gettempdir(), 'ffplayout.txt') self.temp_msg = Path(tempfile.gettempdir()).joinpath('ffplayout.txt')
def current_time(self): def current_time(self):
""" """
@ -438,8 +437,8 @@ class Mailer:
""" """
send message only when is new or the rate_limit is pass send message only when is new or the rate_limit is pass
""" """
if os.path.isfile(self.temp_msg): if Path(self.temp_msg).is_file():
mod_time = os.path.getmtime(self.temp_msg) mod_time = Path(self.temp_msg).stat().st_mtime
with open(self.temp_msg, 'r', encoding='utf-8') as msg_file: with open(self.temp_msg, 'r', encoding='utf-8') as msg_file:
last_msg = msg_file.read() last_msg = msg_file.read()
@ -612,7 +611,7 @@ class MediaProbe:
else: else:
self.is_remote = False self.is_remote = False
if not self.src or not os.path.isfile(self.src): if not self.src or not Path(self.src).is_file():
self.audio.append(None) self.audio.append(None)
self.video.append(None) self.video.append(None)
@ -673,7 +672,7 @@ def handle_sighub(sig, frame):
signal.signal(signal.SIGTERM, handle_sigterm) signal.signal(signal.SIGTERM, handle_sigterm)
if os.name == 'posix': if system() == 'Linux':
signal.signal(signal.SIGHUP, handle_sighub) signal.signal(signal.SIGHUP, handle_sighub)
@ -922,7 +921,7 @@ def src_or_dummy(node):
node['src_cmd'] = [ node['src_cmd'] = [
'-i', node['source'] '-i', node['source']
] + set_length(86400, node['seek'], node['out']) ] + set_length(86400, node['seek'], node['out'])
elif node.get('source') and os.path.isfile(node['source']): elif node.get('source') and Path(node['source']).is_file():
if node['out'] > node['duration']: if node['out'] > node['duration']:
if node['seek'] > 0.0: if node['seek'] > 0.0:
messenger.warning( messenger.warning(