Skip to content

Commit 61c59a6

Browse files
committed
The Buffering window will work with the selected station
instead of working on the config option
1 parent faab5e7 commit 61c59a6

File tree

3 files changed

+104
-90
lines changed

3 files changed

+104
-90
lines changed

pyradio/common.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ class Station(IntEnum):
4545
'playing_': 'Playing: ',
4646
'buffering_': 'Buffering: ',
4747
'station_': 'Station: ',
48+
'station_buffering': 'Station Buffering',
4849
'station-open': ' - Opening connection...',
4950
'selected_player_': 'Selected player: ',
5051
'down-icon': 'Downloading icon...',

pyradio/edit.py

Lines changed: 98 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -2273,40 +2273,52 @@ def keypress(self, char):
22732273

22742274

22752275
class PyRadioBuffering():
2276+
_bitrate_manager = None
22762277

22772278
_text = 'Buffer size in seconds: '
22782279
_text128 = 'Buffer in KB @128kbps: '
22792280
_text192 = ' @192kbps: '
22802281
_text320 = ' @320kbps: '
22812282
_help_text = ' Help '
22822283
_note_text = ' Note '
2283-
_max_lines = 16
2284+
_max_lines = 12
22842285
_cache_data = None
22852286
_big_step = _min = 5
2286-
_limit = 60
2287+
_max = 60
22872288

22882289
def __init__(self,
2290+
buffering,
22892291
parent,
2290-
config,
2291-
player,
22922292
global_functions=None):
2293+
self._buffering = buffering
2294+
self.buffering_value, self.bitrate_value = buffering.split('@')
2295+
if self.buffering_value != '0':
2296+
try:
2297+
if not (5 <= int(self.buffering_value) <= 60):
2298+
self.buffering_value = '0'
2299+
except ValueError:
2300+
self.buffering_value = '0'
2301+
self._original_buffering_value = self.buffering_value
22932302
self._parent = parent
2294-
self._cnf = config
2295-
self._player = player
22962303
self._global_functions = global_functions
22972304
if self._global_functions is None:
22982305
self._global_functions = {}
22992306
self.recording = lambda: self._player.recording
2300-
self._title = ' ' + M_STRINGS['buffering_'].replace(':', '')
2301-
self._cache_data = PlayerCache(
2302-
player.PLAYER_NAME,
2303-
self._cnf.state_dir,
2304-
lambda: self._player.recording
2305-
)
2306-
if self._cnf.buffering_data:
2307-
self._delay = self._cache_data.delay
2307+
self._title = ' ' + M_STRINGS['station_buffering'] + ' '
2308+
2309+
@property
2310+
def bitrate_value(self):
2311+
return self._bitrate_value
2312+
return self._bitrate_manager.bitrate
2313+
2314+
@bitrate_value.setter
2315+
def bitrate_value(self, value):
2316+
self._bitrate_value = value
2317+
return
2318+
if self._bitrate_manager is None:
2319+
self._bitrate_manager = BitrateManager(value)
23082320
else:
2309-
self._delay = 0
2321+
self._bitrate_manager.bitrate = value
23102322

23112323
def save(self):
23122324
self._cache_data._save()
@@ -2338,50 +2350,33 @@ def show(self, parent=None):
23382350

23392351
# show content
23402352
self._win.addstr(2, 4, self._text, curses.color_pair(10))
2341-
self._win.addstr('{}'.format(self._delay), curses.color_pair(11))
2342-
2343-
# show KB
2344-
self._win.addstr(3, 4, self._text128, curses.color_pair(10))
2345-
self._win.addstr('{}'.format(
2346-
seconds_to_KB_128[self._delay if self._delay == 0 else self._delay - 4]
2347-
), curses.color_pair(11))
2348-
self._win.addstr(4, 4, self._text192, curses.color_pair(10))
2349-
self._win.addstr('{}'.format(
2350-
seconds_to_KB_192[self._delay if self._delay == 0 else self._delay - 4]
2351-
), curses.color_pair(10))
2352-
self._win.addstr(5, 4, self._text320, curses.color_pair(10))
2353-
self._win.addstr('{}'.format(
2354-
seconds_to_KB_320[self._delay if self._delay == 0 else self._delay - 4]
2355-
), curses.color_pair(10))
2356-
2353+
self._win.addstr('{}'.format(self.buffering_value), curses.color_pair(11))
23572354

23582355
# show help
23592356
try:
2360-
self._win.addstr(7, 2, '─' * (self.MaxX - 4), curses.color_pair(3))
2357+
self._win.addstr(4, 2, '─' * (self.MaxX - 4), curses.color_pair(3))
23612358
except:
2362-
self._win.addstr(7, 2, '─'.encode('utf-8') * (self.MaxX - 6), curses.color_pair(3))
2363-
self._win.addstr(7, int((self.MaxX - len(self._help_text))/2), self._help_text, curses.color_pair(3))
2364-
self._win.addstr(8, 2, kb2str('{j} {k} Up Down'), curses.color_pair(11))
2365-
self._win.addstr(9, 2, 'PgUp PgDown', curses.color_pair(11))
2359+
self._win.addstr(4, 2, '─'.encode('utf-8') * (self.MaxX - 6), curses.color_pair(3))
2360+
self._win.addstr(4, int((self.MaxX - len(self._help_text))/2), self._help_text, curses.color_pair(3))
2361+
self._win.addstr(5, 2, kb2str('{j} {k} Up Down'), curses.color_pair(11))
2362+
self._win.addstr(6, 2, 'PgUp PgDown', curses.color_pair(11))
23662363
self._win.addstr(' Adjust value', curses.color_pair(10))
2367-
self._win.addstr(10, 2, kb2chr('revert_saved'), curses.color_pair(11))
2364+
self._win.addstr(7, 2, kb2chr('revert_saved'), curses.color_pair(11))
23682365
self._win.addstr(' Load saved value', curses.color_pair(10))
2369-
self._win.addstr(11, 2, kb2chr('no_buffer'), curses.color_pair(11))
2366+
self._win.addstr(8, 2, kb2chr('no_buffer'), curses.color_pair(11))
23702367
self._win.addstr(' No buffering', curses.color_pair(10))
2371-
self._win.addstr(12, 2, 'Enter ' + kb2chr('s'), curses.color_pair(11))
2368+
self._win.addstr(9, 2, 'Enter ' + kb2chr('s'), curses.color_pair(11))
23722369
self._win.addstr(' Accept value', curses.color_pair(10))
2373-
self._win.addstr(13, 2, kb2str('Esc {q} {h} Right'), curses.color_pair(11))
2370+
self._win.addstr(10, 2, kb2str('Esc {q} {h} Right'), curses.color_pair(11))
23742371
self._win.addstr(' Cancel operation', curses.color_pair(10))
2375-
self._win.addstr(14, 2, kb2str('{?}'), curses.color_pair(11))
2376-
self._win.addstr(' Display help', curses.color_pair(10))
23772372
self._win.refresh()
23782373

23792374
def keypress(self, char):
23802375
""" PyRadioBuffering keypress
23812376
Returns:
2382-
-1: Cancel - []
2383-
0: go on - []
2384-
1: Ok = [buffering parameters]
2377+
-1: Cancel - None
2378+
0: go on - None
2379+
1: Ok = buffering parameters
23852380
"""
23862381
l_char = None
23872382
if char in self._global_functions or \
@@ -2392,12 +2387,11 @@ def keypress(self, char):
23922387

23932388
elif char in (curses.KEY_ENTER, ord('\n'), ord('\r'), kbkey['s']) or \
23942389
check_localized(char, (kbkey['s'], )):
2395-
self._cache_data.delay = self._delay
2396-
return 1, self._cache_data.cache
2390+
return 1, self.buffering_value + '@' + self.bitrate_value
23972391

23982392
elif char in (curses.KEY_EXIT, 27, kbkey['q'], kbkey['h'], curses.KEY_LEFT) or \
23992393
check_localized(char, (kbkey['q'], kbkey['h'])):
2400-
return -1, []
2394+
return -1, None
24012395

24022396
elif char in (kbkey['j'], curses.KEY_UP,
24032397
kbkey['k'], curses.KEY_DOWN,
@@ -2406,54 +2400,74 @@ def keypress(self, char):
24062400
) or check_localized(char, (
24072401
kbkey['j'], kbkey['k'],
24082402
kbkey['no_buffer'], kbkey['revert_saved'])):
2403+
delay = int(self.buffering_value)
24092404
if char == kbkey['revert_saved'] or \
24102405
check_localized(char, (kbkey['revert_saved'], )):
2411-
self._delay = self._cache_data.delay
2406+
self.buffering_value = self._original_buffering_value
24122407
elif char in (kbkey['k'], curses.KEY_UP) or \
24132408
check_localized(char, (kbkey['k'], )):
2414-
self._delay += 1
2415-
if self._delay < self._min:
2416-
self._delay = self._min
2409+
delay += 1
2410+
if delay < self._min:
2411+
delay = self._min
2412+
if delay > self._max:
2413+
delay = self._max
2414+
self.buffering_value = str(delay)
24172415
elif char in (kbkey['j'], curses.KEY_DOWN) or \
24182416
check_localized(char, (kbkey['j'], )):
2419-
self._delay -= 1
2420-
if self._delay < self._min:
2421-
self._delay = 0
2417+
delay -= 1
2418+
if delay < self._min:
2419+
delay = 0
2420+
self.buffering_value = str(delay)
24222421
elif char == curses.KEY_NPAGE:
2423-
self._delay -= self._big_step
2424-
if self._delay < self._min:
2425-
self._delay = 0
2422+
delay -= self._big_step
2423+
if delay < self._min:
2424+
delay = 0
2425+
self.buffering_value = str(delay)
24262426
elif char == curses.KEY_PPAGE:
2427-
self._delay += self._big_step
2427+
delay += self._big_step
2428+
if delay > self._max:
2429+
delay = self._max
2430+
self.buffering_value = str(delay)
24282431
elif char == kbkey['no_buffer'] or \
24292432
check_localized(char, (kbkey['no_buffer'], )):
2430-
self._delay = 0
2433+
self.buffering_value = '0'
24312434

2432-
if self._delay < 0:
2433-
self._delay = 0
2434-
elif self._delay > self._limit:
2435-
self._delay = self._limit
2436-
self._win.addstr(2, len(self._text) + 4, '{:<7}'.format(self._delay), curses.color_pair(11))
2437-
self._win.addstr(
2438-
3, len(self._text128) + 4, '{:<7}'.format(
2439-
seconds_to_KB_128[self._delay if self._delay == 0 else self._delay - 4]
2440-
),
2441-
curses.color_pair(11)
2442-
)
2443-
self._win.addstr(
2444-
4, len(self._text192) + 4, '{:<7}'.format(
2445-
seconds_to_KB_192[self._delay if self._delay == 0 else self._delay - 4]
2446-
),
2447-
curses.color_pair(10)
2448-
)
2449-
self._win.addstr(
2450-
5, len(self._text320) + 4, '{:<7}'.format(
2451-
seconds_to_KB_320[self._delay if self._delay == 0 else self._delay - 4]
2452-
),
2453-
curses.color_pair(10)
2454-
)
2435+
self._win.addstr(2, len(self._text) + 4, '{:<7}'.format(self.buffering_value), curses.color_pair(11))
24552436
self._win.refresh()
2456-
return 0, []
2437+
return 0, None
2438+
2439+
2440+
class BitrateManager:
2441+
bitrates = (16, 24, 32, 48, 64, 96, 128, 160, 192, 256, 320, 700, 1411)
2442+
2443+
def __init__(self, initial_bitrate: str):
2444+
self._initial_bitrate = initial_bitrate
2445+
self._current_bitrate = initial_bitrate
2446+
2447+
@property
2448+
def bitrate(self) -> str:
2449+
return self._current_bitrate
2450+
2451+
@bitrate.setter
2452+
def bitrate(self, value: str):
2453+
self._current_bitrate = value
2454+
2455+
def next(self) -> str:
2456+
current = int(self._current_bitrate)
2457+
next_bitrates = [b for b in self.bitrates if b > current]
2458+
if next_bitrates:
2459+
self._current_bitrate = str(min(next_bitrates))
2460+
return self._current_bitrate
2461+
2462+
def previous(self) -> str:
2463+
current = int(self._current_bitrate)
2464+
previous_bitrates = [b for b in self.bitrates if b < current]
2465+
if previous_bitrates:
2466+
self._current_bitrate = str(max(previous_bitrates))
2467+
return self._current_bitrate
2468+
2469+
def reset(self) -> None:
2470+
self._current_bitrate = self._initial_bitrate
24572471

24582472

24592473
class PyRadioConnectionType():

pyradio/radio.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7166,9 +7166,8 @@ def keypress(self, char):
71667166
self._update_status_bar_right(status_suffix='')
71677167
if self.ws.operation_mode == self.ws.NORMAL_MODE:
71687168
self._buffering_win = PyRadioBuffering(
7169+
self.stations[self.selection][Station.buffering],
71697170
parent=self.outerBodyWin,
7170-
config=self._cnf,
7171-
player=self.player,
71727171
global_functions=self._global_functions
71737172
)
71747173
self.ws.operation_mode = self.ws.BUFFER_SET_MODE
@@ -7515,10 +7514,10 @@ def keypress(self, char):
75157514
if ret == 0:
75167515
return
75177516
elif ret == 1:
7518-
self._cnf.buffering_data = buf[:]
7519-
if logger.isEnabledFor(logging.DEBUG):
7520-
logger.debug('buffering data = {}'.format(buf))
7521-
self._buffering_win.save()
7517+
self.ws.close_window()
7518+
self.stations[self.selection][Station.buffering] = buf
7519+
self._cnf.dirty_playlist = True
7520+
self.saveCurrentPlaylist()
75227521
self._buffering_win = None
75237522
elif ret == -1:
75247523
self._buffering_win = None

0 commit comments

Comments
 (0)