Handle OS error 36 - File name too long
Browse filesOn many Linux systems, the maximum file name lenght
is 255 bytes. If the title contains UTF-8 characters, each
character may require more than 1 byte in the file name,
causing a title of 100 characters to actually exceed the 255
byte limit.
We handle this error and then use a much stricter file name format.
- download.py +16 -1
download.py
CHANGED
@@ -1,7 +1,9 @@
|
|
1 |
import os
|
2 |
|
3 |
from tempfile import mkdtemp
|
|
|
4 |
from yt_dlp import YoutubeDL
|
|
|
5 |
from yt_dlp.postprocessor import PostProcessor
|
6 |
|
7 |
class FilenameCollectorPP(PostProcessor):
|
@@ -14,6 +16,15 @@ class FilenameCollectorPP(PostProcessor):
|
|
14 |
return [], information
|
15 |
|
16 |
def downloadUrl(url: str, maxDuration: int = None):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
destinationDirectory = mkdtemp()
|
18 |
|
19 |
ydl_opts = {
|
@@ -23,6 +34,11 @@ def downloadUrl(url: str, maxDuration: int = None):
|
|
23 |
'home': destinationDirectory
|
24 |
}
|
25 |
}
|
|
|
|
|
|
|
|
|
|
|
26 |
filename_collector = FilenameCollectorPP()
|
27 |
|
28 |
with YoutubeDL(ydl_opts) as ydl:
|
@@ -44,7 +60,6 @@ def downloadUrl(url: str, maxDuration: int = None):
|
|
44 |
|
45 |
return result
|
46 |
|
47 |
-
|
48 |
class ExceededMaximumDuration(Exception):
|
49 |
def __init__(self, videoDuration, maxDuration, message):
|
50 |
self.videoDuration = videoDuration
|
|
|
1 |
import os
|
2 |
|
3 |
from tempfile import mkdtemp
|
4 |
+
from tkinter import Y
|
5 |
from yt_dlp import YoutubeDL
|
6 |
+
import yt_dlp
|
7 |
from yt_dlp.postprocessor import PostProcessor
|
8 |
|
9 |
class FilenameCollectorPP(PostProcessor):
|
|
|
16 |
return [], information
|
17 |
|
18 |
def downloadUrl(url: str, maxDuration: int = None):
|
19 |
+
try:
|
20 |
+
return _performDownload(url, maxDuration=maxDuration)
|
21 |
+
except yt_dlp.utils.DownloadError as e:
|
22 |
+
# In case of an OS error, try again with a different output template
|
23 |
+
if e.msg and e.msg.find("[Errno 36] File name too long") >= 0:
|
24 |
+
return _performDownload(url, maxDuration=maxDuration, outputTemplate="%(title).10s %(id)s.%(ext)s")
|
25 |
+
pass
|
26 |
+
|
27 |
+
def _performDownload(url: str, maxDuration: int = None, outputTemplate: str = None):
|
28 |
destinationDirectory = mkdtemp()
|
29 |
|
30 |
ydl_opts = {
|
|
|
34 |
'home': destinationDirectory
|
35 |
}
|
36 |
}
|
37 |
+
|
38 |
+
# Add output template if specified
|
39 |
+
if outputTemplate:
|
40 |
+
ydl_opts['outtmpl'] = outputTemplate
|
41 |
+
|
42 |
filename_collector = FilenameCollectorPP()
|
43 |
|
44 |
with YoutubeDL(ydl_opts) as ydl:
|
|
|
60 |
|
61 |
return result
|
62 |
|
|
|
63 |
class ExceededMaximumDuration(Exception):
|
64 |
def __init__(self, videoDuration, maxDuration, message):
|
65 |
self.videoDuration = videoDuration
|