aboutsummaryrefslogtreecommitdiffstats
path: root/yt_dlp/minicurses.py
diff options
context:
space:
mode:
authorpukkandan <pukkandan.ytdlp@gmail.com>2021-10-10 07:08:22 +0530
committerpukkandan <pukkandan.ytdlp@gmail.com>2021-10-10 09:31:59 +0530
commitd1d5c08f29b3b1d60d8b11b812029757fe3fd90a (patch)
tree51c2edd74113821bbe47a3c13aff5294ccc522f5 /yt_dlp/minicurses.py
parent2e01ba62181fee12bf44b8f3f6cb0f46cd591e61 (diff)
downloadhypervideo-pre-d1d5c08f29b3b1d60d8b11b812029757fe3fd90a.tar.lz
hypervideo-pre-d1d5c08f29b3b1d60d8b11b812029757fe3fd90a.tar.xz
hypervideo-pre-d1d5c08f29b3b1d60d8b11b812029757fe3fd90a.zip
[minicurses] Fix when printing to file
Closes #1215
Diffstat (limited to 'yt_dlp/minicurses.py')
-rw-r--r--yt_dlp/minicurses.py42
1 files changed, 22 insertions, 20 deletions
diff --git a/yt_dlp/minicurses.py b/yt_dlp/minicurses.py
index 0e37ed818..a6e159a14 100644
--- a/yt_dlp/minicurses.py
+++ b/yt_dlp/minicurses.py
@@ -1,6 +1,6 @@
import functools
from threading import Lock
-from .utils import supports_terminal_sequences, TERMINAL_SEQUENCES
+from .utils import supports_terminal_sequences, TERMINAL_SEQUENCES, write_string
class MultilinePrinterBase:
@@ -25,20 +25,26 @@ class MultilinePrinterBase:
return f'{line + 1}: {text}'
return text
+ def write(self, *text):
+ write_string(''.join(text), self.stream)
+
class QuietMultilinePrinter(MultilinePrinterBase):
pass
class MultilineLogger(MultilinePrinterBase):
+ def write(self, *text):
+ self.stream.debug(''.join(text))
+
def print_at_line(self, text, pos):
# stream is the logger object, not an actual stream
- self.stream.debug(self._add_line_number(text, pos))
+ self.write(self._add_line_number(text, pos))
class BreaklineStatusPrinter(MultilinePrinterBase):
def print_at_line(self, text, pos):
- self.stream.write(self._add_line_number(text, pos) + '\n')
+ self.write(self._add_line_number(text, pos), '\n')
class MultilinePrinter(MultilinePrinterBase):
@@ -58,50 +64,46 @@ class MultilinePrinter(MultilinePrinterBase):
def _move_cursor(self, dest):
current = min(self._lastline, self.maximum)
- self.stream.write('\r')
+ yield '\r'
distance = dest - current
if distance < 0:
- self.stream.write(TERMINAL_SEQUENCES['UP'] * -distance)
+ yield TERMINAL_SEQUENCES['UP'] * -distance
elif distance > 0:
- self.stream.write(TERMINAL_SEQUENCES['DOWN'] * distance)
+ yield TERMINAL_SEQUENCES['DOWN'] * distance
self._lastline = dest
@lock
def print_at_line(self, text, pos):
if self._HAVE_FULLCAP:
- self._move_cursor(pos)
- self.stream.write(TERMINAL_SEQUENCES['ERASE_LINE'])
- self.stream.write(text)
- return
+ self.write(*self._move_cursor(pos), TERMINAL_SEQUENCES['ERASE_LINE'], text)
text = self._add_line_number(text, pos)
textlen = len(text)
if self._lastline == pos:
# move cursor at the start of progress when writing to same line
- self.stream.write('\r')
+ prefix = '\r'
if self._lastlength > textlen:
text += ' ' * (self._lastlength - textlen)
self._lastlength = textlen
else:
# otherwise, break the line
- self.stream.write('\n')
+ prefix = '\n'
self._lastlength = textlen
- self.stream.write(text)
+ self.write(prefix, text)
self._lastline = pos
@lock
def end(self):
# move cursor to the end of the last line, and write line break
# so that other to_screen calls can precede
- if self._HAVE_FULLCAP:
- self._move_cursor(self.maximum)
+ text = self._move_cursor(self.maximum) if self._HAVE_FULLCAP else []
if self.preserve_output:
- self.stream.write('\n')
+ self.write(*text, '\n')
return
if self._HAVE_FULLCAP:
- self.stream.write(
- TERMINAL_SEQUENCES['ERASE_LINE']
- + f'{TERMINAL_SEQUENCES["UP"]}{TERMINAL_SEQUENCES["ERASE_LINE"]}' * self.maximum)
+ self.write(
+ *text, TERMINAL_SEQUENCES['ERASE_LINE'],
+ f'{TERMINAL_SEQUENCES["UP"]}{TERMINAL_SEQUENCES["ERASE_LINE"]}' * self.maximum)
else:
- self.stream.write(' ' * self._lastlength)
+ self.write(*text, ' ' * self._lastlength)