Skip to content

Commit 7d7d317

Browse files
committed
didabling search function; keyboard input is too unstable
1 parent 6c145f6 commit 7d7d317

File tree

9 files changed

+102
-487
lines changed

9 files changed

+102
-487
lines changed

Changelog

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
2019-02-03 s-n-g
1+
2019-02-10 s-n-g
22

3+
* Version 0.7.1
34
* Avoiding curses layout breakage due to BROKEN PIPE errors
45
* Start of playback detection implemented. This is done by
56
detecting the players audio decoder info, which actually mean
@@ -10,7 +11,6 @@
1011
* Playing a station in random order will not stop until a
1112
working station is acquired or another action is taken (e.g
1213
pressing a key)
13-
* Adding search function for both player and playlist mode
1414
* Stations name is limited to window width
1515
* Station title is validated before displayed
1616

README.html

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@
66
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
77
<title>PyRadio README</title>
88
<style>
9+
html {margin: 2em;}
10+
h2 {margin-top: 2.5em; border-bottom:1px solid #D6D6D6;}
11+
h3 {margin-top: 2em;}
12+
dl {margin: 2em;}
13+
dd {margin: 1em;}
14+
dt {font-weight: bold;}
15+
pre { background-color: #F6F6F6; padding: 1.5em; border: 1px solid #E6E6E6;}
916
code{white-space: pre-wrap;}
1017
span.smallcaps{font-variant: small-caps;}
1118
span.underline{text-decoration: underline;}

build.html

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@
66
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
77
<title>PyRadio Build Instructions</title>
88
<style>
9+
html {margin: 2em;}
10+
h2 {margin-top: 2.5em; border-bottom:1px solid #D6D6D6;}
11+
h3 {margin-top: 2em;}
12+
dl {margin: 2em;}
13+
dd {margin: 1em;}
14+
dt {font-weight: bold;}
15+
pre { background-color: #F6F6F6; padding: 1.5em; border: 1px solid #E6E6E6;}
916
code{white-space: pre-wrap;}
1017
span.smallcaps{font-variant: small-caps;}
1118
span.underline{text-decoration: underline;}

devel/pre-commit

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ do
1414
rm tmp.md
1515
exit 1
1616
}
17-
sed -i '/<style /a \
17+
sed -i '/<style[^>]*>/a \
1818
html {margin: 2em;} \
1919
h2 {margin-top: 2.5em; border-bottom:1px solid #D6D6D6;} \
2020
h3 {margin-top: 2em;} \

pyradio.1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
.\" Copyright (C) 2011 Ben Dowling <http://www.coderholic.com/pyradio>
22
.\" This manual is freely distributable under the terms of the GPL.
33
.\"
4-
.TH PYRADIO 1 "January 2019"
4+
.TH PYRADIO 1 "February 2019"
55

66
.SH NAME
77
.PP

pyradio/main.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ def __configureLogger():
2929
logger.addHandler(fh)
3030

3131
def shell():
32+
# set window title
33+
try:
34+
sys.stdout.write("\x1b]2;PyRadio: The Internet Radio player\x07")
35+
except:
36+
pass
3237
requested_player = ''
3338
parser = ArgumentParser(description="Curses based Internet radio player")
3439
parser.add_argument("-s", "--stations", default='',

pyradio/radio.py

Lines changed: 22 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -493,28 +493,6 @@ def reloadCurrentPlaylist(self, mode):
493493
logger.debug('MODE: PLAYLIST_DIRTY_RELOAD_CONFIRM_MODE -> NORMAL_MODE')
494494
return
495495

496-
497-
498-
#self.selections[self.operation_mode] = (self.selection, self.startPos, self.playing, self.cnf.stations)
499-
#self.operation_mode = self.window_mode = PLAYLIST_MODE
500-
#self.selection, self.startPos, self.playing, self.stations = self.selections[self.operation_mode]
501-
#self.number_of_items, self.playing = self.read_playlists()
502-
#self.stations = self.cnf.playlists
503-
#if self.number_of_items == 0:
504-
# return
505-
#else:
506-
# self.refreshBody()
507-
# if logger.isEnabledFor(logging.DEBUG):
508-
# logger.debug('MODE: NORMAL_MODE -> PLAYLIST_MODE')
509-
# return
510-
511-
#playing = self.playing
512-
#selection = self.selections
513-
#number_of_items = self.number_of_items
514-
#if self.player.isPlaying() and self.cnf.dirty_playlist:
515-
# # TODO: ask to save previous playlist
516-
# pass
517-
518496
def readPlaylists(self):
519497
num_of_playlists, playing = self.cnf.read_playlists()
520498
if num_of_playlists == 0:
@@ -1026,22 +1004,22 @@ def keypress(self, char):
10261004
self.refreshBody()
10271005
return
10281006

1029-
elif char in (ord('/'), ):
1030-
self.jumpnr = ''
1031-
self._random_requested = False
1032-
if self.operation_mode == NORMAL_MODE or \
1033-
self.operation_mode == PLAYLIST_MODE:
1034-
self.search.string = ''
1035-
self.search.show(self.bodyWin)
1036-
if self.operation_mode == NORMAL_MODE:
1037-
self.operation_mode = SEARCH_NORMAL_MODE
1038-
if logger.isEnabledFor(logging.DEBUG):
1039-
logger.debug('MODE: NORMAL_MODE -> SEARCH_NORMAL_MODE')
1040-
else:
1041-
self.operation_mode = SEARCH_PLAYLIST_MODE
1042-
if logger.isEnabledFor(logging.DEBUG):
1043-
logger.debug('MODE: PLAYLIST_MODE -> SEARCH_PLAYLIST_MODE')
1044-
return
1007+
#elif char in (ord('/'), ):
1008+
# self.jumpnr = ''
1009+
# self._random_requested = False
1010+
# if self.operation_mode == NORMAL_MODE or \
1011+
# self.operation_mode == PLAYLIST_MODE:
1012+
# #self.search.string = ''
1013+
# self.search.show(self.bodyWin)
1014+
# if self.operation_mode == NORMAL_MODE:
1015+
# self.operation_mode = SEARCH_NORMAL_MODE
1016+
# if logger.isEnabledFor(logging.DEBUG):
1017+
# logger.debug('MODE: NORMAL_MODE -> SEARCH_NORMAL_MODE')
1018+
# else:
1019+
# self.operation_mode = SEARCH_PLAYLIST_MODE
1020+
# if logger.isEnabledFor(logging.DEBUG):
1021+
# logger.debug('MODE: PLAYLIST_MODE -> SEARCH_PLAYLIST_MODE')
1022+
# return
10451023

10461024
elif char in (ord('n'), ) and \
10471025
(self.operation_mode == NORMAL_MODE or \
@@ -1274,36 +1252,7 @@ def keypress(self, char):
12741252

12751253
if char in (ord('?'), ):
12761254
self.jumpnr = ''
1277-
if self.operation_mode == PLAYLIST_MODE:
1278-
txt = """Up/j/PgUp
1279-
Down/k/PgDown Change playlist selection.
1280-
g Jump to first playlist.
1281-
<n>G Jump to n-th / last playlist.
1282-
Enter/Right/l Open selected playlist.
1283-
r Re-read playlists from disk.
1284-
# Redraw window.
1285-
Esc/q Cancel. """
1286-
self._show_help(txt, mode_to_set=PLAYLIST_HELP_MODE)
1287-
if logger.isEnabledFor(logging.DEBUG):
1288-
logger.debug('MODE = PLAYLIST_HELP_MODE')
1289-
else:
1290-
txt = """Up/j/PgUp
1291-
Down/k/PgDown Change station selection.
1292-
g Jump to first station.
1293-
<n>G Jump to n-th / last station.
1294-
Enter/Right/l Play selected station.
1295-
r Select and play a random station.
1296-
Space/Left/h Stop/start playing selected station.
1297-
-/+ or ,/. Change volume.
1298-
m Mute / unmute player.
1299-
v Save volume (not applicable with vlc).
1300-
o s R Open / Save / Reload playlist.
1301-
DEL,x Delete selected station.
1302-
# Redraw window.
1303-
Esc/q Quit. """
1304-
self._show_help(txt)
1305-
if logger.isEnabledFor(logging.DEBUG):
1306-
logger.debug('MODE = MAIN_HELP_MODE')
1255+
self._print_help()
13071256
return
13081257

13091258
if char in (curses.KEY_END, ):
@@ -1404,11 +1353,13 @@ def keypress(self, char):
14041353
self._random_requested = False
14051354
if self.cnf.dirty_playlist:
14061355
if self.cnf.auto_save_playlist:
1407-
# TODO save playlist
1408-
# open playlist
1356+
# save playlist and open playlist
14091357
pass
1358+
ret = self.saveCurrentPlaylist()
1359+
if ret == 0:
1360+
self._open_playlist()
14101361
else:
1411-
# TODO ask to save playlist
1362+
# ask to save playlist
14121363
self._print_save_modified_playlist()
14131364
else:
14141365
self._open_playlist()

pyradio/simple_curses_widgets.py

Lines changed: 57 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@ class SimpleCursesLineEdit(object):
99
""" Class to insert one line of text
1010
Python 3 supports all chars
1111
Python 2 supports ascii only
12-
12+
1313
"""
1414
string = ''
15+
_string = ''
1516

1617
""" windows """
1718
parent_win = None
@@ -57,6 +58,8 @@ def __init__(self, parent, begin_y, begin_x, **kwargs):
5758
for key, value in kwargs.items():
5859
if key == 'boxed':
5960
self._boxed = value
61+
elif key == 'string':
62+
self._string = value
6063
elif key == 'string_len':
6164
self._string_len = value
6265
elif key == 'caption':
@@ -109,6 +112,15 @@ def focused(self, val):
109112
self._focused = val
110113
self.refreshEditWindow()
111114

115+
@property
116+
def string(self):
117+
return self._string
118+
119+
@string.setter
120+
def string(self, val):
121+
self._string = val
122+
self._curs_pos = len(self._string)
123+
112124
def getmaxyx(self):
113125
return self._caption_win.getmaxyx()
114126

@@ -159,8 +171,8 @@ def refreshEditWindow(self):
159171
active_cursor_color = self.caption_color
160172
self._edit_win.erase()
161173
#self._edit_win.bkgd('-', curses.A_REVERSE)
162-
if self.string:
163-
self._edit_win.addstr(0, 0, self.string, active_edit_color)
174+
if self._string:
175+
self._edit_win.addstr(0, 0, self._string, active_edit_color)
164176
else:
165177
self._curs_pos = 0
166178
if self.log is not None:
@@ -202,7 +214,7 @@ def keypress(self, win, char):
202214
if char in (curses.KEY_ENTER, ord('\n'), ord('\r')):
203215
""" ENTER """
204216
if self._has_history:
205-
self._input_history.add_to_history(self.string)
217+
self._input_history.add_to_history(self._string)
206218
return 0
207219
elif char in (curses.KEY_EXIT, 27):
208220
self._edit_win.nodelay(True)
@@ -212,16 +224,16 @@ def keypress(self, win, char):
212224
self._edit_win.nodelay(False)
213225
if char == -1:
214226
""" ESCAPE """
215-
self.string = ''
227+
self._string = ''
216228
self._curs_pos = 0
217229
return -1
218230
else:
219231
return 1
220232
elif char in (curses.KEY_RIGHT, curses.ascii.ACK):
221233
""" KEY_RIGHT, Alt-F """
222234
self._curs_pos += 1
223-
if len(self.string) < self._curs_pos:
224-
self._curs_pos = len(self.string)
235+
if len(self._string) < self._curs_pos:
236+
self._curs_pos = len(self._string)
225237
elif char in (curses.KEY_LEFT, ):
226238
""" KEY_LEFT """
227239
self._curs_pos -= 1
@@ -232,15 +244,15 @@ def keypress(self, win, char):
232244
self._curs_pos = 0
233245
elif char in (curses.KEY_END, curses.ascii.ENQ):
234246
""" KEY_END, ^E """
235-
self._curs_pos = len(self.string)
247+
self._curs_pos = len(self._string)
236248
elif char in (curses.KEY_DC, curses.ascii.EOT):
237249
""" DEL key, ^D """
238-
if self._curs_pos < len(self.string):
239-
self.string = self.string[:self._curs_pos] + self.string[self._curs_pos+1:]
250+
if self._curs_pos < len(self._string):
251+
self._string = self._string[:self._curs_pos] + self._string[self._curs_pos+1:]
240252
elif char in (curses.KEY_BACKSPACE, curses.ascii.BS,127):
241253
""" KEY_BACKSPACE """
242254
if self._curs_pos > 0:
243-
self.string = self.string[:self._curs_pos-1] + self.string[self._curs_pos:]
255+
self._string = self._string[:self._curs_pos-1] + self._string[self._curs_pos:]
244256
self._curs_pos -= 1
245257
elif char in (curses.KEY_UP, curses.ascii.DLE):
246258
""" KEY_UP, ^N """
@@ -301,27 +313,27 @@ def keypress(self, win, char):
301313
curses.ungetch(char)
302314
elif char in (curses.ascii.VT, ):
303315
""" Ctrl-K - delete to end of line """
304-
self.string = self.string[:self._curs_pos]
316+
self._string = self._string[:self._curs_pos]
305317
elif 0<= char <=31:
306318
pass
307319
else:
308-
if len(self.string) + 1 == self._max_width:
320+
if len(self._string) + 1 == self._max_width:
309321
return 1
310322
if version_info < (3, 0):
311323
if 32 <= char < 127:
312324
# accept only ascii characters
313-
if len(self.string) == self._curs_pos:
314-
self.string += chr(char)
325+
if len(self._string) == self._curs_pos:
326+
self._string += chr(char)
315327
self._curs_pos += 1
316328
else:
317-
self.string = self.string[:self._curs_pos] + chr(char) + self.string[self._curs_pos:]
329+
self._string = self._string[:self._curs_pos] + chr(char) + self._string[self._curs_pos:]
318330
else:
319331
char = self._get_char(win, char)
320-
if len(self.string) == self._curs_pos:
321-
self.string += char
332+
if len(self._string) == self._curs_pos:
333+
self._string += char
322334
self._curs_pos += 1
323335
else:
324-
self.string = self.string[:self._curs_pos] + char + self.string[self._curs_pos:]
336+
self._string = self._string[:self._curs_pos] + char + self._string[self._curs_pos:]
325337

326338
self.refreshEditWindow()
327339
return 1
@@ -362,9 +374,34 @@ def get_check_next_byte():
362374
out = ''.join([chr(b) for b in bytes])
363375
else:
364376
buf = bytearray(bytes)
365-
out = buf.decode('utf-8')
377+
out = self._decode_string(buf)
378+
#out = buf.decode('utf-8')
366379
return out
367380

381+
def _encode_string(self, data):
382+
encodings = ['utf-8', locale.getpreferredencoding(False), 'latin1']
383+
for enc in encodings:
384+
try:
385+
data = data.encode(enc)
386+
except:
387+
continue
388+
break
389+
390+
assert type(data) != bytes # Latin1 should have worked.
391+
return data
392+
393+
def _decode_string(self, data):
394+
encodings = ['utf-8', locale.getpreferredencoding(False), 'latin1']
395+
for enc in encodings:
396+
try:
397+
data = data.decode(enc)
398+
except:
399+
continue
400+
break
401+
402+
assert type(data) != bytes # Latin1 should have worked.
403+
return data
404+
368405
def _log(self, msg):
369406
with open(self._log_file, 'a') as log_file:
370407
log_file.write(msg)

0 commit comments

Comments
 (0)