-
Notifications
You must be signed in to change notification settings - Fork 0
/
YoutubeDL.patch
110 lines (105 loc) · 6.37 KB
/
YoutubeDL.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
--- /home/xiaobai/Downloads/youtube-dl/3/lib/python3.8/site-packages/youtube_dl-2021.2.22-py3.8.egg/youtube_dl/YoutubeDL.py 2021-02-28 05:48:55.456548078 +0800
+++ /home/xiaobai/Downloads/youtube-dl/youtube-dl-patch/YoutubeDL.py 2021-02-28 06:45:18.125265736 +0800
@@ -112,6 +112,9 @@
if compat_os_name == 'nt':
import ctypes
+# hole patch:
+from .utils import get_fs_max, get_max_path, sanitize_patch
+from pathlib import PurePath, Path
class YoutubeDL(object):
"""YoutubeDL class.
@@ -634,7 +637,7 @@
except UnicodeEncodeError:
self.to_screen('[download] The file has already been downloaded')
- def prepare_filename(self, info_dict):
+ def prepare_filename(self, info_dict, format_name=''):
"""Generate the output filename."""
try:
template_dict = dict(info_dict)
@@ -663,6 +666,71 @@
outtmpl = self.params.get('outtmpl', DEFAULT_OUTTMPL)
+
+
+ #'''
+ # Note: Only do for python 3 and Linux-like systems
+ #print('hole style')
+ path = Path(outtmpl)
+ save_dir = str(path.parent)
+ #print('save into: ' + repr(save_dir))
+ arg_cut = -1
+ fs_f_max = get_fs_max()
+ #print('fs_f_max: ' + str(fs_f_max))
+ # must hard code some max such as 30 for .ext which is last resort if all empty
+ # No need worry if [:30] means 30*4 bytes unicode, because slice is per unicode glyph
+ format_name = format_name.strip()
+ if format_name:
+ format_name = sanitize_patch(format_name).strip()[:30].strip()
+ ext = sanitize_patch(template_dict['ext']).strip()[:30].strip()
+ if format_name:
+ ext = format_name + '.' + ext
+ #print('format name final: ' + repr(ext))
+ dat = sanitize_patch(template_dict['upload_date']).strip()
+ #print('template_dict: ' + repr(template_dict))
+ if not ext:
+ ext = 'unknown'
+ if not dat:
+ dat = 'NA'
+ template_dict['id'] = sanitize_patch( str(template_dict['id']) )
+ # got 2 places(possibly more places) blindly add extension without re-calculate the length to fit maximum filemena of fielsystem
+ # fragment_filename = '%s-Frag%d' % (ctx['tmpfilename'], ctx['fragment_index']) , line #99 of downloader/fragment.py
+ # return filename + '.part' , line #188 of downloader/common.py
+ #
+ # So, possible 2 .part and 1 frag such as '.mp4.part-Frag0.part', so nid must patch fragN of fragment.py since N can be 1000++ without fixed width and must sacrifice 10 bytes without too much changes (Lesson learned: Shouldn't pass filename as single string to next level instead of class with title/id/date/extension/temporary_extension/...etc fields, it causes next level hard to determine which part is extension which suppose immutable, which part is title which ok to strip to fit filename maximum length of filesystem). And single filename means not possible to have 2 different structure of filenames when doing temporary stuff without blindly append new suffix which causes filename maximum length exceed.
+ # fragment_filename = '%s-Frag%d' % (ctx['tmpfilename'], ctx['fragment_index']) , line #99 of downloader/fragment.py
+ # return filename + '.part' , line #188 of downloader/common.py
+ #immutable = sanitize_patch( '-' + dat + '-' + template_dict['id'] + '.' + ext + '.part.part')
+ immutable = sanitize_patch( '-' + dat + '-' + template_dict['id'] + '.' + ext + '.part') # '.part 'or '.ytdl' to cover file extension later
+ #print('imm: ' + immutable)
+ #print('title: ' + template_dict['title'])
+ fpart_excluded_ext_before = sanitize_patch( template_dict['title'] )
+ fpart_excluded_ext = get_max_path(fs_f_max, fpart_excluded_ext_before, immutable, False)
+ if fpart_excluded_ext:
+ if fpart_excluded_ext_before == fpart_excluded_ext: # means not truncat
+ # Prevent confuse when trailing period become '..'ext and looks like '...'
+ if fpart_excluded_ext[-1] == '.':
+ fpart_excluded_ext = fpart_excluded_ext[:-1]
+ else: # Truncated
+ # No need care if two/three/... dots, overkill to trim more and loss information
+ if fpart_excluded_ext[-1] == '.':
+ fpart_excluded_ext = fpart_excluded_ext[:-1]
+ fpart_excluded_ext = get_max_path(fs_f_max, fpart_excluded_ext
+ , '...' + immutable, False)
+
+ fpart_excluded_ext = fpart_excluded_ext + '...'
+
+ #print('vid: '+ repr(template_dict['id']))
+ #print('fpart: ' + repr(fpart_excluded_ext + '.' + ext))
+ # In case date + video id very long, just remains .ext as last resort:
+ fpart = get_max_path(fs_f_max, fpart_excluded_ext + '-' + dat + '-' + template_dict['id'], '.' + ext, False) + '.' + ext
+ filename = os.path.abspath( os.path.join(save_dir, '{}'.format( fpart )) )
+ #print('hole fname: ' + repr(filename))
+ return sanitize_path(filename)
+ #'''
+
+
+
# For fields playlist_index and autonumber convert all occurrences
# of %(field)s to %(field)0Nd for backward compatibility
field_size_compat_map = {
@@ -1948,9 +2016,13 @@
for f in requested_formats:
new_info = dict(info_dict)
new_info.update(f)
- fname = prepend_extension(
- self.prepare_filename(new_info),
- 'f%s' % f['format_id'], new_info['ext'])
+
+ fname = self.prepare_filename(new_info, 'f%s' % f['format_id']) # hole patch
+ # orig:
+ #fname = prepend_extension(
+ # self.prepare_filename(new_info),
+ # 'f%s' % f['format_id'], new_info['ext'])
+
if not ensure_dir_exists(fname):
return
downloaded.append(fname)