Skip to content

Commit

Permalink
Prepare to publish
Browse files Browse the repository at this point in the history
  • Loading branch information
klen committed Aug 29, 2012
1 parent 1590900 commit f5660b5
Show file tree
Hide file tree
Showing 10 changed files with 214 additions and 61 deletions.
3 changes: 3 additions & 0 deletions .gitignore
@@ -0,0 +1,3 @@
.ropeproject
*.pyc
*.orig
5 changes: 5 additions & 0 deletions Changelog
@@ -0,0 +1,5 @@
2012-08-29 klen

* Version 0.3.0
* Add console interface
* Published on pypi
1 change: 1 addition & 0 deletions DESCRIPTION
@@ -0,0 +1 @@
Command line internet radio player.
32 changes: 32 additions & 0 deletions Makefile
@@ -0,0 +1,32 @@
MODULE=pyradio
SPHINXBUILD=sphinx-build
ALLSPHINXOPTS= -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
BUILDDIR=_build


.PHONY: clean
clean:
sudo rm -rf build dist docs/_build
find . -name "*.pyc" -delete
find . -name "*.orig" -delete

.PHONY: register
register:
python setup.py register

.PHONY: upload
upload:
python setup.py sdist upload || echo 'Upload already'

.PHONY: test
test: audit
python setup.py test

.PHONY: audit
audit:
pylama $(MODULE) -i E501

.PHONY: doc
doc: docs
python setup.py build_sphinx --source-dir=docs/ --build-dir=docs/_build --all-files
python setup.py upload_sphinx --upload-dir=docs/_build/html
31 changes: 30 additions & 1 deletion README.md
@@ -1,9 +1,38 @@
# PyRadio

Command line internet radio player. Requires mplayer.
Command line internet radio player.

Ben Dowling - [http://www.coderholic.com/pyradio](http://www.coderholic.com/pyradio)


## Requirements

* python 2.6+
* mplayer


## Installation

pip install pyradio


## Shell

$ pyradio -h

usage: main.py [-h] [--stations STATIONS] [--random] [--add] [--list]

Console radio player

optional arguments:
-h, --help show this help message and exit
--stations STATIONS, -s STATIONS
Path on stations csv file.
--random, -r Start and play random station.
--add, -a Add station to list.
--list, -l List of added stations.


## Controls
```
Up/Down/PgUp/PgDown Change station selection
Expand Down
8 changes: 8 additions & 0 deletions pyradio/__init__.py
@@ -0,0 +1,8 @@
" pyradio -- Console radio player. "

version_info = (0, 3, 0)

__version__ = version = '.'.join(map(str, version_info))
__project__ = __name__
__author__ = "Ben Dowling"
__license__ = "MIT"
55 changes: 55 additions & 0 deletions pyradio/main.py
@@ -0,0 +1,55 @@
import csv
import sys
import curses
from argparse import ArgumentParser
from os import path as op

from .radio import PyRadio


DEFAULT_FILE = ''
for path in ['~/.pyradio/stations.csv', '~/.pyradio', op.join(op.dirname(__file__), 'stations.csv')]:
if op.exists(path) and op.isfile(path):
DEFAULT_FILE = path
break


def shell():
parser = ArgumentParser(description="Console radio player")
parser.add_argument("--stations", "-s", default=DEFAULT_FILE, help="Path on stations csv file.")
parser.add_argument("--random", "-r", action='store_true', help="Start and play random station.")
parser.add_argument("--add", "-a", action='store_true', help="Add station to list.")
parser.add_argument("--list", "-l", action='store_true', help="List of added stations.")
args = parser.parse_args()

try:
cfgfile = open(args.stations, 'rb')
except IOError, e:
print str(e)
sys.exit(1)

stations = []
for row in csv.reader(cfgfile, skipinitialspace=True):
if row[0].startswith('#'):
continue
name, url = map(lambda s: s.strip(), row)
stations.append((name, url))

if args.list:
for name, url in stations:
print '{0:50s} {1:s}'.format(name, url)
sys.exit()

if args.add:
params = raw_input("Enter the name:"), raw_input("Enter the url:")
cfgfile = open(args.stations, 'a+b')
writter = csv.writer(cfgfile)
writter.writerow(params)
sys.exit()

pyradio = PyRadio(stations, play=args.random)
curses.wrapper(pyradio.setup)


if __name__ == '__main__':
shell()
96 changes: 36 additions & 60 deletions pyradio → pyradio/radio.py 100755 → 100644
Expand Up @@ -3,13 +3,12 @@
# PyRadio: Curses based Internet Radio Player
# http://www.coderholic.com/pyradio
# Ben Dowling - 2009 - 2010

import os
import sys
# Kirill Klenov - 2012
import curses
import thread
import os
import random
import subprocess
import thread


def rel(path):
Expand Down Expand Up @@ -119,8 +118,9 @@ class PyRadio(object):
selection = 0
playing = -1

def __init__(self, stations):
def __init__(self, stations, play=False):
self.stations = stations
self.play = play

def setup(self, stdscr):
self.stdscr = stdscr
Expand Down Expand Up @@ -220,6 +220,12 @@ def refreshBody(self):
self.bodyWin.refresh()

def run(self):

if self.play:
self.setStation(random.randint(0, len(self.stations)))
self.playSelection()
self.refreshBody()

while True:
try:
c = self.bodyWin.getch()
Expand Down Expand Up @@ -261,92 +267,62 @@ def keypress(self, char):
if char == curses.KEY_EXIT or char == ord('q'):
self.player.close()
return -1
elif char in (curses.KEY_ENTER, ord('\n'), ord('\r')):

if char in (curses.KEY_ENTER, ord('\n'), ord('\r')):
self.playSelection()
self.refreshBody()
return
elif char == ord(' '):

if char == ord(' '):
if self.player.is_playing():
self.player.close()
self.log.write('Playback stopped')
else:
self.playSelection()

self.refreshBody()
return
elif char == curses.KEY_DOWN or char == ord('j'):

if char == curses.KEY_DOWN or char == ord('j'):
self.setStation(self.selection + 1)
self.refreshBody()
return
elif char == curses.KEY_UP or char == ord('k'):

if char == curses.KEY_UP or char == ord('k'):
self.setStation(self.selection - 1)
self.refreshBody()
return
elif char == ord('+'):

if char == ord('+'):
self.player.volumeUp()
return
elif char == ord('-'):

if char == ord('-'):
self.player.volumeDown()
return
elif char == curses.KEY_PPAGE:

if char == curses.KEY_PPAGE:
self.setStation(self.selection - pageChange)
self.refreshBody()
return
elif char == curses.KEY_NPAGE:

if char == curses.KEY_NPAGE:
self.setStation(self.selection + pageChange)
self.refreshBody()
return
elif char == ord('m'):

if char == ord('m'):
self.player.mute()
return
elif char == ord('r'):

if char == ord('r'):
# Pick a random radio station
self.setStation(random.randint(0, len(self.stations)))
self.playSelection()
self.refreshBody()
elif char == ord('#') or char == curses.KEY_RESIZE:

if char == ord('#') or char == curses.KEY_RESIZE:
self.setupAndDrawScreen()
#self.refreshBody()

if __name__ == "__main__":
# Default stations list
stations = [
("Digitally Imported: Chillout", "http://di.fm/mp3/chillout.pls"),
("Digitally Imported: Trance", "http://di.fm/mp3/trance.pls"),
("Digitally Imported: Classic Techno",
"http://di.fm/mp3/classictechno.pls"),
("Frequence 3 (Pop)", "http://streams.frequence3.net/hd-mp3.m3u"),
("Mostly Classical", "http://www.sky.fm/mp3/classical.pls"),
("Ragga Kings", "http://www.raggakings.net/listen.m3u"),
("Secret Agent (Downtempo)", "http://somafm.com/secretagent.pls"),
("Slay Radio (C64 Remix)", "http://sc.slayradio.org:8000/listen.pls"),
("SomaFM: Groove Salad",
"http://somafm.com/startstream=groovesalad.pls"),
("SomaFM: Beat Blender",
"http://somafm.com/startstream=beatblender.pls"),
("SomaFM: Cliq Hop", "http://somafm.com/startstream=cliqhop.pls"),
("SomaFM: Sonic Universe",
"http://somafm.com/startstream=sonicuniverse.pls"),
("SomaFM: Tags Trance Trip", "http://somafm.com/tagstrance.pls"),
]
csvFile = os.path.join(os.path.expanduser("~/.pyradio"), "stations.csv")
if len(sys.argv) > 1 and sys.argv[1]:
csvFile = sys.argv[1]

try:
csv = open(csvFile, "r")
stations = []
for line in csv.readlines():
line = line.strip()
if not line:
continue
try:
(name, url) = line.split(",")
stations.append((name, url))
except:
print "Error, skipping ", line
except IOError:
print "Could not open stations file '%s'. " \
"Using default stations list" % csvFile

pyRadio = PyRadio(stations)
curses.wrapper(pyRadio.setup)

# pymode:lint_ignore=W901
File renamed without changes.
44 changes: 44 additions & 0 deletions setup.py
@@ -0,0 +1,44 @@
#!/usr/bin/env python
from os import path as op
from sys import version_info

from setuptools import setup, find_packages

from pyradio import version, __project__, __license__


read = lambda f: open(op.join(op.dirname(__file__), f)).read() if op.exists(f) else ''


install_requires = []
if version_info < (2, 7):
install_requires.append('argparse')


meta = dict(
name=__project__,
version=version,
license=__license__,
description=read('DESCRIPTION'),
long_description=read('README.md'),
platforms=('Any'),

author='Kirill Klenov',
author_email='horneds@gmail.com',
url=' http://github.com/coderholic/pyradio',

packages=find_packages(),

entry_points={
'console_scripts': [
'pyradio = pyradio.main:shell',
]
},

install_requires=install_requires,
test_suite = 'tests',
)


if __name__ == "__main__":
setup(**meta)

0 comments on commit f5660b5

Please sign in to comment.