Get everything nice for heroku
parent
2cdf45cd01
commit
e4599c2866
10
README.md
10
README.md
|
@ -1,11 +1,12 @@
|
||||||
# Repod
|
# Elektricity
|
||||||
|
|
||||||
A server designed to make it easy to re-broadcast existing content
|
A server designed to make it easy to re-broadcast existing content
|
||||||
as a podcast.
|
as a podcast. Named after [London Elektricity][1] who, among other
|
||||||
|
things, hosts the [Hospital Podcast][2].
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
The purpose of Repod is to take content that exists on the web already,
|
The purpose of Elektricity is to take content that exists on the web already,
|
||||||
and turn it into a podcast to consume whenever you want. Specifically,
|
and turn it into a podcast to consume whenever you want. Specifically,
|
||||||
I'm a huge Drum & Bass head that wanted an easy way to access
|
I'm a huge Drum & Bass head that wanted an easy way to access
|
||||||
[the Bassdrive archives](http://archives.bassdrivearchive.com/) since
|
[the Bassdrive archives](http://archives.bassdrivearchive.com/) since
|
||||||
|
@ -19,3 +20,6 @@ Future ideas: Turn your mixcloud feed into a podcast?
|
||||||
|
|
||||||
Repod is currently very bare-bones, but the Requirements file should
|
Repod is currently very bare-bones, but the Requirements file should
|
||||||
be enough to get up and running.
|
be enough to get up and running.
|
||||||
|
|
||||||
|
[1]: https://www.youtube.com/watch?v=6IRiuLy0IW4
|
||||||
|
[2]: https://www.hospitalrecords.com/podcast/
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
# Format (all args are passed to __init__ as kwargs:
|
||||||
|
#
|
||||||
|
# <mountpoint>:
|
||||||
|
# class: <feed_class>
|
||||||
|
# args:
|
||||||
|
# key: value
|
||||||
|
|
||||||
|
subfactory-show:
|
||||||
|
package: bassdrive
|
||||||
|
class: BassdriveFeed
|
||||||
|
args:
|
||||||
|
url: http://archives.bassdrivearchive.com/1%20-%20Monday/Subfactory%20Show%20-%20DJ%20Spim/
|
||||||
|
logo: http://www.bassdrive.com/img/radio_schedule_entries/image/original/subfactory-web-add-56.jpg
|
||||||
|
|
||||||
|
electronic-warfare:
|
||||||
|
package: bassdrive
|
||||||
|
class: BassdriveFeed
|
||||||
|
args:
|
||||||
|
url: http://archives.bassdrivearchive.com/6%20-%20Saturday/Electronic%20Warfare%20-%20The%20Overfiend/
|
||||||
|
logo: http://bassdrive.com/img/radio_schedule_entries/image/original/front-page-intro-box-200x200-115.jpg
|
Binary file not shown.
|
@ -0,0 +1,30 @@
|
||||||
|
"""
|
||||||
|
Given a configuration file, set up everything needed to kick
|
||||||
|
off the server.
|
||||||
|
"""
|
||||||
|
from importlib import import_module
|
||||||
|
import yaml
|
||||||
|
from pyramid.config import Configurator
|
||||||
|
from os.path import expanduser, join
|
||||||
|
|
||||||
|
# Needed for import_module call
|
||||||
|
# noinspection PyUnresolvedReferences
|
||||||
|
import podcasters
|
||||||
|
|
||||||
|
|
||||||
|
def build_configuration(conf=None) -> Configurator:
|
||||||
|
if conf is None:
|
||||||
|
conf = join(expanduser('~'), '.repodrc')
|
||||||
|
|
||||||
|
server_conf = Configurator()
|
||||||
|
with open(conf) as conf_file:
|
||||||
|
conf_dict = yaml.load(conf_file)
|
||||||
|
for mountpoint, feed in conf_dict.items():
|
||||||
|
feed_package = import_module('podcasters.' + feed['package'])
|
||||||
|
feed_class = getattr(feed_package, feed['class'])
|
||||||
|
feed_instance = feed_class(**feed['args'])
|
||||||
|
|
||||||
|
server_conf.add_route(mountpoint, '/' + mountpoint + '/')
|
||||||
|
server_conf.add_view(feed_instance.view, route_name=mountpoint)
|
||||||
|
|
||||||
|
return server_conf
|
|
@ -1,6 +1,6 @@
|
||||||
import argparse
|
import argparse
|
||||||
import traceback
|
import traceback
|
||||||
from os.path import expanduser, join
|
from os.path import expanduser, join, dirname, realpath
|
||||||
from wsgiref.simple_server import make_server
|
from wsgiref.simple_server import make_server
|
||||||
|
|
||||||
from pyramid.config import Configurator
|
from pyramid.config import Configurator
|
||||||
|
@ -12,14 +12,15 @@ from conf_parser import build_configuration
|
||||||
def start_server(server_conf: dict, configurator: Configurator) -> None:
|
def start_server(server_conf: dict, configurator: Configurator) -> None:
|
||||||
app = configurator.make_wsgi_app()
|
app = configurator.make_wsgi_app()
|
||||||
|
|
||||||
port = server_conf['port'] if 'port' in server_conf else cmd_args.port
|
port = server_conf['port']
|
||||||
host = server_conf['host'] if 'host' in server_conf else cmd_args.host
|
host = server_conf['host']
|
||||||
server = make_server(host, port, app)
|
server = make_server(host, port, app)
|
||||||
|
|
||||||
server.serve_forever()
|
server.serve_forever()
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
default_rc = join(expanduser('~'), '.repodrc')
|
# default_rc = join(expanduser('~'), '.repodrc')
|
||||||
|
default_rc = join(dirname(realpath(__file__)), '../default_conf.yaml')
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
parser.add_argument('--verbose', action='store_true',
|
parser.add_argument('--verbose', action='store_true',
|
||||||
help='Run server in verbose mode')
|
help='Run server in verbose mode')
|
||||||
|
@ -32,7 +33,11 @@ if __name__ == '__main__':
|
||||||
|
|
||||||
cmd_args = parser.parse_args()
|
cmd_args = parser.parse_args()
|
||||||
try:
|
try:
|
||||||
server_conf, configurator = build_configuration(cmd_args.configuration)
|
configurator = build_configuration(cmd_args.configuration)
|
||||||
|
server_conf = {
|
||||||
|
'host': cmd_args.host,
|
||||||
|
'port': cmd_args.port
|
||||||
|
}
|
||||||
start_server(server_conf, configurator)
|
start_server(server_conf, configurator)
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
print("Unable to find configuration file. Does {} exist?"
|
print("Unable to find configuration file. Does {} exist?"
|
||||||
|
@ -44,8 +49,3 @@ if __name__ == '__main__':
|
||||||
.format(cmd_args.configuration))
|
.format(cmd_args.configuration))
|
||||||
if cmd_args.verbose:
|
if cmd_args.verbose:
|
||||||
print(traceback.format_exc())
|
print(traceback.format_exc())
|
||||||
except KeyError:
|
|
||||||
print('Unable to parse configuration file. Is there a `podcasts` '
|
|
||||||
'section?')
|
|
||||||
if cmd_args.verbose:
|
|
||||||
print(traceback.format_exc())
|
|
|
@ -1,15 +0,0 @@
|
||||||
# Format (all args are passed to __init__ as kwargs:
|
|
||||||
#
|
|
||||||
# <mountpoint>:
|
|
||||||
# class: <feed_class>
|
|
||||||
# args:
|
|
||||||
# key: value
|
|
||||||
server:
|
|
||||||
port: 10000
|
|
||||||
|
|
||||||
podcasts:
|
|
||||||
subfactory-show:
|
|
||||||
class: podcasters.BassdriveFeed
|
|
||||||
args:
|
|
||||||
url: http://archives.bassdrivearchive.com/1%20-%20Monday/Subfactory%20Show%20-%20DJ%20Spim/
|
|
||||||
logo: http://www.bassdrive.com/img/radio_schedule_entries/image/original/subfactory-web-add-56.jpg
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
python>=3.5.0
|
||||||
pyramid>=1.6.1
|
pyramid>=1.6.1
|
||||||
feedgen>=0.3.2
|
feedgen>=0.3.2
|
||||||
PyYAML>=3.11
|
PyYAML>=3.11
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
python-3.5.2
|
|
@ -1,40 +0,0 @@
|
||||||
"""
|
|
||||||
Given a configuration file, set up everything needed to kick
|
|
||||||
off the server.
|
|
||||||
"""
|
|
||||||
from importlib import import_module
|
|
||||||
|
|
||||||
import yaml
|
|
||||||
from pyramid.config import Configurator
|
|
||||||
|
|
||||||
|
|
||||||
def build_configurator(podcasts: dict) -> Configurator:
|
|
||||||
server_conf = Configurator()
|
|
||||||
for mountpoint, feed in podcasts.items():
|
|
||||||
package, class_name = feed['class'].rsplit('.', 1)
|
|
||||||
feed_package = import_module(package)
|
|
||||||
feed_class = getattr(feed_package, class_name)
|
|
||||||
feed_instance = feed_class(**feed)
|
|
||||||
|
|
||||||
server_conf.add_route(mountpoint, '/' + mountpoint + '/')
|
|
||||||
server_conf.add_view(feed_instance.view, route_name=mountpoint)
|
|
||||||
|
|
||||||
return server_conf
|
|
||||||
|
|
||||||
|
|
||||||
def build_configuration_text(file_str: str) -> (dict, Configurator):
|
|
||||||
conf_dict = yaml.load(file_str)
|
|
||||||
|
|
||||||
server_opts = conf_dict.get('server', None)
|
|
||||||
podcasts = build_configurator(conf_dict['podcasts'])
|
|
||||||
return server_opts, podcasts
|
|
||||||
|
|
||||||
|
|
||||||
def build_configuration(file_name) -> (dict, Configurator):
|
|
||||||
try:
|
|
||||||
with open(file_name) as conf_file:
|
|
||||||
return build_configuration_text(conf_file.read())
|
|
||||||
except FileNotFoundError:
|
|
||||||
print("Could not locate configuration file " +
|
|
||||||
"(does {} exist?)".format(file_name))
|
|
||||||
raise
|
|
Loading…
Reference in New Issue