1
0
Fork 0
mirror of https://github.com/mwalbeck/podfox.git synced 2025-04-13 01:38:04 +00:00
podfox/podfoxer.py
Bastian Reitemeier d04d038e8f rename
2015-10-25 17:53:25 +01:00

128 lines
3.9 KiB
Python

"""p0d - podcatcher for the terminal
Usage:
p0d.py import <feed-url> [--shortname=<shortname> --max-num=<n>]
p0d.py findfeed <website-url>
p0d.py get-updates <feedname>
p0d.py show-updates <feedname>
p0d.py download <feedname>
p0d.py show-feeds
p0d.py sync-to <folder> [--delete --max-num-<n> <feeds>]
Options:
-h --help Show this help
-v --verbose Show more output
"""
# (C) 2015 Bastian Reitemeier
# mail(at)brtmr.de
from colorama import Fore, Back, Style
from docopt import docopt
from os.path import expanduser
from sys import exit
import colorama
import feedparser
import json
import os.path
import sys
import os
PODCAST_DIRECTORY = ''
CONFIGURATION = {}
def print_err(err):
print(Fore.RED + Style.BRIGHT + err + \
Fore.RESET + Back.RESET + Style.RESET_ALL \
, file=sys.stderr)
def import_feed(url, shortname=''):
global CONFIGURATION
# configuration for this feed, will be written to file.
feed_conf = {}
# check if the folder exists.
folder_created = False
if shortname:
folder = os.path.join(CONFIGURATION['podcast-directory'],shortname)
if os.path.exists(folder):
print_err(
'{} already exists'.format(folder))
exit(-1)
else:
os.makedirs(folder)
folder_created = True
#get the feed.
d = feedparser.parse(url)
#if the user did not specify a folder name,
#we have to create one from the title
if not folder_created:
# we wanna avoid any filename crazyness,
# so foldernames will be restricted to lowercase ascii letters,
# numbers,
# and dashes:
title = d['feed']['title']
title = ''.join(ch for ch in title \
if ch.isalnum() or ch==' ')
title=title.replace(' ','-').lower()
folder = os.path.join(CONFIGURATION['podcast-directory'],title)
if os.path.exists(folder):
print_err(
'{} already exists'.format(folder))
exit(-1)
else:
os.makedirs(folder)
folder_created = True
#we have succesfully generated a folder that we can store the files
#in
feed_conf['episodes'] = []
for entry in d.entries:
if hasattr(entry, 'links'):
for link in entry.links:
if link.type == 'audio/mpeg' or link.type == 'audio/ogg':
feed_conf['episodes'].append({
'title' : entry.title,
'url' : link.href,
'downloaded' : False,
'listened' : False
})
feed_conf['name'] = d['feed']['title']
feed_conf['url'] = url
# write the configuration to a feed.json within the folder
feed_conf_file = os.path.join(folder,'feed.json')
with open(feed_conf_file,'x') as f:
json.dump(feed_conf,f)
def find_feed(url):
pass
def available_feeds():
'''
p0d will save each feed to its own folder. Each folder should
contain a json configuration file describing which elements
have been downloaded already, and how many will be kept.
'''
pass
def show_updates():
pass
if __name__=='__main__':
colorama.init()
arguments = docopt(__doc__, version='p0d 0.01')
# before we do anything with the commands,
# find the configuration file
home_directory = expanduser("~")
with open(home_directory + '/.p0d.json') as conf_file:
try:
CONFIGURATION = json.load(conf_file)
except ValueError:
print("invalid json in configuration file.")
exit(-1)
#handle the commands
if arguments['import']:
if arguments['--shortname'] is None:
import_feed(arguments['<feed-url>'])
else:
import_feed(arguments['<feed-url>'], shortname=arguments['--shortname'])