You are on page 1of 4

http://wm.bbc.co.uk/wms/1xtracoyopa/1xtra_-_saturday_0500.

wma
-R 0500 -D saturday
#! /usr/bin/env python
import
import
import
import

sys
logging
logging.config
argparse

import shutil
import datetime
import subprocess
MODULE_NAME = 'BBC'
MODULE_DESCRIPTION = 'download episodes'
CONFIG_DEST_FOLDER = '/home/marco/VM_Shared'
#=========================================================================
# LOGGER
#=========================================================================
logger = logging.getLogger('%s.log' % MODULE_NAME)
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': '[%(asctime)s][%(levelname)s] %(name)s %(filename)s | %(me
ssage)s',
'datefmt': '%H:%M:%S',
},
'verbose': {
'format': '[%(asctime)s][%(levelname)s] %(name)s %(filename)s:%(func
Name)s:%(lineno)d | %(message)s',
'datefmt': '%H:%M:%S',
}
},
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'standard',
},
},
'loggers': {
'': {
'handlers': ['console', ],
'level': 'DEBUG',
'propagate': True,
},
}
}
logging.config.dictConfig(LOGGING)

#=========================================================================
# BBC
#=========================================================================
class BBC(object):
DAYS = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday',
'sunday']
EXT = '.wma'
URL_BASE = 'mms://wm.bbc.co.uk/wms/radio1coyopa/radio_1_-_'
DEST_FOLDER = CONFIG_DEST_FOLDER
#=========================================================================
# SUPPORT
#=========================================================================
def parse_cl(self):
parser = argparse.ArgumentParser(description='%s, %s.' % (MODULE_NAME, M
ODULE_DESCRIPTION))
parser.add_argument(
'-D',
'--day',
help='Day of the show (es: friday, sunday).')
parser.add_argument(
'-R',
'--hour',
help='Hour of the show (es: 1900, 2200).')
parser.add_argument(
'-F',
'--friday',
default=False,
help='Shorthand for friday show (es: -F true).')
parser.add_argument(
'-S',
'--sunday',
default=False,
help='Shorthand for sunday show (es: -S true).')
parser.add_argument(
'-T',
'--tuesday',
default=False,
help='Shorthand for tuesday show (es: -T true).')
self.opts = parser.parse_args()
def __init__(self):
self.parse_cl()
logger.debug('Backend initialized!')
def __call__(self):
self.check_params()
self.get_recording()
def __repr__(self):
return 'BBC'
#=========================================================================
# HELPERS

#=========================================================================
def check_params(self):
if self.opts.friday:
self.opts.day = 'friday'
self.opts.hour = '1900'
elif self.opts.sunday:
self.opts.day = 'sunday'
self.opts.hour = '2200'
elif self.opts.tuesday:
self.opts.day = 'tuesday'
self.opts.hour = '0200'
if not self.opts.day or not self.opts.hour:
sys.exit('Day and hour needed. See help.')
self.day = self.opts.day
self.hour = self.opts.hour
logger.debug('Target: %s %s' % (self.day, self.hour))
# Compose show name (friday_1900, sunday_2200)
self.show_name = '%s_%s' % (self.day, self.hour)
logger.info('Show named: %s' % self.show_name)
def last_weekday(self, day, weekday):
""" Return a datetime corresponding to the latest occurrence of weekday,
starting from day
day = datetime of today
weekday = 0-6
"""
if day.weekday() <= weekday:
weeks_delta = -1
else:
weeks_delta = 0
return day - datetime.timedelta(days=day.weekday()) + datetime.timedelta
(days=weekday,weeks=weeks_delta)

#=========================================================================
# FUNCTIONS
#=========================================================================
def get_day(self):
# Get today
today = datetime.datetime.today()
logger.info('Today: %s' % today)
# Get past specified weekday
self.lw = self.last_weekday(today, self.DAYS.index(self.day))
logger.info('Last %s: %s' % (self.day, self.lw))
def set_outname(self):
lw = self.lw
self.outname = '%s-%s-%s-%s' % (lw.year, lw.month, lw.day, self.day)
self.outname_ext = '%s%s' % (self.outname, self.EXT)
logger.info('Output named: %s' % self.outname_ext)
def download(self):

url = '%s%s%s' % (self.URL_BASE, self.show_name, self.EXT)


logger.info('Downloading: %s' % url)
cmd = 'mimms %s %s' % (url, self.outname_ext)
subprocess.call(cmd, shell=True)
def convert(self):
self.outname_mp3 = '%s.mp3' % self.outname
logger.info('Converting into mp3: %s' % self.outname_mp3)
cmd = 'ffmpeg -i %s -acodec libmp3lame -ab 128k %s' % (self.outname_ext,
self.outname_mp3)
subprocess.call(cmd, shell=True)
def move(self):
logger.info('Moving to shared folder')
shutil.move(self.outname_ext, self.DEST_FOLDER)
shutil.move(self.outname_mp3, self.DEST_FOLDER)

#=========================================================================
# GET RECORDING
#=========================================================================
def get_recording(self):
# Get today and past specified weekday
self.get_day()
# Set output filename
self.set_outname()
# Download show
self.download()
# Convert into mp3
self.convert()
# Move to shared folder
self.move()

#=========================================================================
# MAIN
#=========================================================================
if __name__ == '__main__':
BBC()()

You might also like