#!/usr/bin/env python3
import os
import copy
import click
import yaml
import xml
import podcastparser
import urllib
global options
options = {"DEBUG": False, "serverlist": os.path.normpath(os.path.join(os.path.expanduser("~/.config/podweb"), "serverlist")), "podcastpath": ""}
class PodWeb():
def __init__(self, DEBUG : bool = False) -> None:
self.options = options
self.options.update({"DEBUG": DEBUG})
self.servers = []
self.DEFAULT_SERVERLIST_HEADING = '''## You can add podcast xml feeds here.
## You can also optionally add categories and names for the podcasts.
## The order of category, name, and url does not matter.
## Here are some example entries:
## - category: example category
## name: example podcast 1
## url: https://example.com/feed.xml
## - name: example podcast 2
## url: example.com/feed2.xml
'''
if self.options["DEBUG"]:
self.config_path = "."
self.config_filepath = "debug_config.yaml"
self.options["serverlist"] = "debug_serverlist"
else:
self.config_path = os.path.normpath(os.path.expanduser("~/.config/podweb"))
self.config_filepath = os.path.join(self.config_path, "config.yaml")
self._load_config()
self._load_serverlist()
def _load_config(self) -> None:
if not os.path.exists(self.config_path): os.makedirs(self.config_path)
if not os.path.isfile(self.config_filepath):
with open(self.config_filepath, "w+") as f:
yaml.dump(self.options, f)
else:
with open(self.config_filepath, "r+") as f:
self.options.update(yaml.full_load(f))
def _update_config(self, changed_option : dict) -> None:
'''Makes a change to the config file'''
with open(self.options["serverlist"], "w+") as f:
config_options = yaml.full_load(f)
config_options.update(changed_option)
f.write(config_options)
def _load_serverlist(self) -> list:
'''Loads the contents of the serverlist'''
self._create_serverlist()
with open(self.options["serverlist"], "r+") as f:
content = yaml.full_load(f)
if content:
self.servers = content
def _create_serverlist(self) -> None:
'''Checks if the serverlist does not exist and creates it if not'''
if not os.path.isfile(self.options["serverlist"]):
with open(self.options["serverlist"], "w+") as f:
f.write(self.DEFAULT_SERVERLIST_HEADING)
def _update_serverlist(self) -> None:
'''This is destructive and overwrites the current serverlist with the stored serverlist'''
with open(self.options["serverlist"], "w+") as f:
f.write(self.DEFAULT_SERVERLIST_HEADING)
if len(self.servers):
with open(self.options["serverlist"], "a") as f:
yaml.dump(self.servers, f)
def add_podcast(self, feedurl : str, name = None, category = None) -> None:
for i in self.servers:
iparse = urllib.parse.urlparse(i["url"])
feedparse = urllib.parse.urlparse(feedurl)
if iparse.hostname == feedparse.hostname and iparse.path == feedparse.path:
return None
parsed = podcastparser.parse(feedurl, urllib.request.urlopen(feedurl))
if name:
new_feed = {"url": feedurl, "name": name}
else:
new_feed = {"url": feedurl, "name": parsed["title"]}
if category: new_feed.update({"category": category})
self.servers.append(new_feed)
self._update_serverlist()
def import_opml(self, opml_path : str):
pass
testweb = PodWeb(DEBUG = True)