""" download files with URLs from DB """ import re import subprocess from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter import mariadb from setup import get_database_cursors, create_tables, get_logger parser = ArgumentParser(formatter_class=ArgumentDefaultsHelpFormatter) parser.add_argument('--verbose', '-v', action='count', default=0) parser.add_argument('--dir', '-d', default='/data/media') parser.add_argument('--dry-run', '-m', action='store_true') parser.add_argument('--rename', '-r', action='store_true') args = parser.parse_args() def parse_output(lines_list, log): file_name = "" for line in lines_list: if 'has already been downloaded' in line: end_len = len(' has already been downloaded') file_name = line[11:-end_len] log.info('found file: "%s"', file_name) if 'Destination' in line: line_len = len(line) start_len = len('[download] Destination: ') file_len = line_len-start_len file_name = line[-file_len:] log.info('new file: "%s"', file_name) return file_name def download_url(video_url, log): result = subprocess.run(["/home/tpeetz/bin/yt-dlp", video_url], cwd=args.dir, capture_output=True, text=True) if result.returncode == 0: output = result.stdout output = re.sub(' +', ' ', output) lines_list = output.splitlines() return parse_output(lines_list, log) else: return None def download_and_update(link, entry_id, conn): m_cursor = conn.cursor() filename = download_url(link, logger) if filename is None: update_statement = 'UPDATE media_file set review = true WHERE id = ?' logger.debug(f'entry {entry_id} could not downloaded, set to Review') m_cursor.execute(update_statement, (entry_id,)) else: update_statement = 'UPDATE media_file set file_name = ?, should_download = false, review = false WHERE id = ?' logger.debug(f'entry {entry_id} successfully downloaded, set review and should_download to false') m_cursor.execute(update_statement, (filename, entry_id)) conn.commit() if __name__ == '__main__': logger = get_logger(args.verbose) logger.info('kontor.download started') s_conn, m_conn = get_database_cursors(logger) cursor = m_conn.cursor() cursor.execute('SELECT id, url FROM media_file where should_download is true') for (link_id, url) in cursor.fetchall(): if url is None: logger.info('There is no url for id {}'.format(link_id)) else: if args.dry_run: logger.info(f'download {url} for {link_id}') else: download_and_update(url, link_id, m_conn) logger.info('kontor.download finished')