mirror of
				https://github.com/chibicitiberiu/ytsm.git
				synced 2024-02-24 05:43:31 +00:00 
			
		
		
		
	Fixed problem caused by parallel downloads where ok.mkdirs would fail (when called by youtube-dl).
This commit is contained in:
		| @@ -5,10 +5,13 @@ import os | ||||
| import youtube_dl | ||||
| import logging | ||||
| import re | ||||
| from threading import Lock | ||||
|  | ||||
| log = logging.getLogger('video_downloader') | ||||
| log_youtube_dl = log.getChild('youtube_dl') | ||||
|  | ||||
| _lock = Lock() | ||||
|  | ||||
|  | ||||
| def __get_valid_path(path): | ||||
|     """ | ||||
| @@ -73,27 +76,36 @@ def download_video(video: Video, attempt: int = 1): | ||||
|  | ||||
|     log.info('Downloading video %d [%s %s]', video.id, video.video_id, video.name) | ||||
|  | ||||
|     max_attempts = settings.getint_sub(video.subscription, 'user', 'DownloadMaxAttempts', fallback=3) | ||||
|     # Issue: if multiple videos are downloaded at the same time, a race condition appears in the mkdirs() call that | ||||
|     # youtube-dl makes, which causes it to fail with the error 'Cannot create folder - file already exists'. | ||||
|     # For now, allow a single download instance. | ||||
|     _lock.acquire() | ||||
|  | ||||
|     youtube_dl_params, output_path = __build_youtube_dl_params(video) | ||||
|     with youtube_dl.YoutubeDL(youtube_dl_params) as yt: | ||||
|         ret = yt.download(["https://www.youtube.com/watch?v=" + video.video_id]) | ||||
|     try: | ||||
|         max_attempts = settings.getint_sub(video.subscription, 'user', 'DownloadMaxAttempts', fallback=3) | ||||
|  | ||||
|     log.info('Download finished with code %d', ret) | ||||
|         youtube_dl_params, output_path = __build_youtube_dl_params(video) | ||||
|         with youtube_dl.YoutubeDL(youtube_dl_params) as yt: | ||||
|             ret = yt.download(["https://www.youtube.com/watch?v=" + video.video_id]) | ||||
|  | ||||
|     if ret == 0: | ||||
|         video.downloaded_path = output_path | ||||
|         video.save() | ||||
|         log.info('Video %d [%s %s] downloaded successfully!', video.id, video.video_id, video.name) | ||||
|         log.info('Download finished with code %d', ret) | ||||
|  | ||||
|     elif attempt <= max_attempts: | ||||
|         log.warning('Re-enqueueing video (attempt %d/%d)', attempt, max_attempts) | ||||
|         __schedule_download_video(video, attempt + 1) | ||||
|         if ret == 0: | ||||
|             video.downloaded_path = output_path | ||||
|             video.save() | ||||
|             log.info('Video %d [%s %s] downloaded successfully!', video.id, video.video_id, video.name) | ||||
|  | ||||
|     else: | ||||
|         log.error('Multiple attempts to download video %d [%s %s] failed!', video.id, video.video_id, video.name) | ||||
|         video.downloaded_path = '' | ||||
|         video.save() | ||||
|         elif attempt <= max_attempts: | ||||
|             log.warning('Re-enqueueing video (attempt %d/%d)', attempt, max_attempts) | ||||
|             __schedule_download_video(video, attempt + 1) | ||||
|  | ||||
|         else: | ||||
|             log.error('Multiple attempts to download video %d [%s %s] failed!', video.id, video.video_id, video.name) | ||||
|             video.downloaded_path = '' | ||||
|             video.save() | ||||
|  | ||||
|     finally: | ||||
|         _lock.release() | ||||
|  | ||||
|  | ||||
| def __schedule_download_video(video: Video, attempt=1): | ||||
|   | ||||
		Reference in New Issue
	
	Block a user