fix download entry pickle (closes #827)
This commit is contained in:
18
app/ytdl.py
18
app/ytdl.py
@@ -7,6 +7,7 @@ import asyncio
|
|||||||
import multiprocessing
|
import multiprocessing
|
||||||
import logging
|
import logging
|
||||||
import re
|
import re
|
||||||
|
import types
|
||||||
|
|
||||||
import yt_dlp.networking.impersonate
|
import yt_dlp.networking.impersonate
|
||||||
from dl_formats import get_format, get_opts, AUDIO_FORMATS
|
from dl_formats import get_format, get_opts, AUDIO_FORMATS
|
||||||
@@ -14,6 +15,17 @@ from datetime import datetime
|
|||||||
|
|
||||||
log = logging.getLogger('ytdl')
|
log = logging.getLogger('ytdl')
|
||||||
|
|
||||||
|
def _convert_generators_to_lists(obj):
|
||||||
|
"""Recursively convert generators to lists in a dictionary to make it pickleable."""
|
||||||
|
if isinstance(obj, types.GeneratorType):
|
||||||
|
return list(obj)
|
||||||
|
elif isinstance(obj, dict):
|
||||||
|
return {k: _convert_generators_to_lists(v) for k, v in obj.items()}
|
||||||
|
elif isinstance(obj, (list, tuple)):
|
||||||
|
return type(obj)(_convert_generators_to_lists(item) for item in obj)
|
||||||
|
else:
|
||||||
|
return obj
|
||||||
|
|
||||||
class DownloadQueueNotifier:
|
class DownloadQueueNotifier:
|
||||||
async def added(self, dl):
|
async def added(self, dl):
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
@@ -44,7 +56,8 @@ class DownloadInfo:
|
|||||||
self.size = None
|
self.size = None
|
||||||
self.timestamp = time.time_ns()
|
self.timestamp = time.time_ns()
|
||||||
self.error = error
|
self.error = error
|
||||||
self.entry = entry
|
# Convert generators to lists to make entry pickleable
|
||||||
|
self.entry = _convert_generators_to_lists(entry) if entry is not None else None
|
||||||
self.playlist_item_limit = playlist_item_limit
|
self.playlist_item_limit = playlist_item_limit
|
||||||
|
|
||||||
class Download:
|
class Download:
|
||||||
@@ -375,6 +388,9 @@ class DownloadQueue:
|
|||||||
elif etype == 'playlist':
|
elif etype == 'playlist':
|
||||||
log.debug('Processing as a playlist')
|
log.debug('Processing as a playlist')
|
||||||
entries = entry['entries']
|
entries = entry['entries']
|
||||||
|
# Convert generator to list if needed (for len() and slicing operations)
|
||||||
|
if isinstance(entries, types.GeneratorType):
|
||||||
|
entries = list(entries)
|
||||||
log.info(f'playlist detected with {len(entries)} entries')
|
log.info(f'playlist detected with {len(entries)} entries')
|
||||||
playlist_index_digits = len(str(len(entries)))
|
playlist_index_digits = len(str(len(entries)))
|
||||||
results = []
|
results = []
|
||||||
|
|||||||
Reference in New Issue
Block a user