From 20cc6dfba32d297e74033bf3006a44b6dccab6be Mon Sep 17 00:00:00 2001 From: stubbfel Date: Fri, 8 Apr 2016 00:11:25 +0200 Subject: [PATCH] add new feeds --- .gitignore | 2 + src/config/config.py | 4 +- src/feed/feed.py | 55 +- src/ui/web/cgi/cgi_server.py | 21 + src/ui/web/cgi/pages/FeedOverview.py | 44 + src/ui/web/cgi/pages/FileLoader.py | 48 + src/ui/web/cgi/pages/index.py | 70 + .../podcast/SBK028_Arbeit.mp3.torrent | Bin 865 -> 0 bytes testenv/testfeeds/podcast/lnp/lnp-config.json | 6 + .../podcast/medienkuh/medienkuh-config.json | 6 + testenv/testfeeds/podcast/sbk/sbk-config.json | 4 +- testenv/testfeeds/podcast/sbk/sbk.json | 518 +++--- testenv/testfeeds/podcast/sbk/sbk.xml | 1388 +++++++++++------ testenv/tests/feed/testfeed.py | 41 +- .../cgi-bin/feedConfig/sbk-config.json | 6 - testenv/tests/webpage/cgitestrun/dummy | 0 testenv/tests/webpage/webserver.py | 14 +- 17 files changed, 1549 insertions(+), 678 deletions(-) delete mode 100644 testenv/testfeeds/podcast/SBK028_Arbeit.mp3.torrent create mode 100644 testenv/testfeeds/podcast/lnp/lnp-config.json create mode 100644 testenv/testfeeds/podcast/medienkuh/medienkuh-config.json delete mode 100644 testenv/tests/webpage/cgitestrun/cgi-bin/feedConfig/sbk-config.json create mode 100644 testenv/tests/webpage/cgitestrun/dummy diff --git a/.gitignore b/.gitignore index 6102faf..7c95164 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ .idea/ __pycache__ *~ +testenv/tests/webpage/cgitestrun/cgi-bin +testenv/tests/webpage/cgitestrun/testfeeds \ No newline at end of file diff --git a/src/config/config.py b/src/config/config.py index 5f46f03..a42feaa 100644 --- a/src/config/config.py +++ b/src/config/config.py @@ -1,11 +1,11 @@ __author__ = 'dev' Config = { - "FeedLinkTypes" : {"audio/mpeg","application/x-bittorrent"}, + "FeedLinkTypes" : {"audio/mpeg","application/x-bittorrent", "audio/opus"}, "FeedTypes" : {"podcast","rss"}, "FeedStorageFolder" : "testfeeds", "FeedStoragePrefix" : { "0" : "FeedType", "1" : "FeedName"}, "ConfigFileSuffix" : "-config", "ConfigFileExtension" : ".json", - "TorrentStorageFolder": "testtorrents" + "TorrentStorageFolder": "testtorrents", } \ No newline at end of file diff --git a/src/feed/feed.py b/src/feed/feed.py index 418b72e..28578a0 100644 --- a/src/feed/feed.py +++ b/src/feed/feed.py @@ -5,6 +5,7 @@ from utilities.podcastserializer import PodcastSerializer from utilities.serializer import Serializer import feedparser import os +import glob import utilities.file_methods as fm @@ -23,6 +24,8 @@ class Feed: self.feed_file_path = None self.serializer = None self.feed_folder = None + self.name = feed_name + self.type = feed_type self.setup_feed(feed_name, feed_type, link_type, feed_url) def load_feed(self): @@ -133,6 +136,9 @@ class Feed: assert (self.feed_config is not None) fm.write_json_file(self.create_feed_config_path(), self.feed_config) + def get_feed_items(self): + return fm.read_json_file(self.feed_file_path) + @staticmethod def create_feed_config_file(feed_name, feed_type, link_type, feed_url): """ @@ -155,4 +161,51 @@ class Feed: "FeedUrl": feed_url, "LinkType": link_type } - return feed_config \ No newline at end of file + return feed_config + + @staticmethod + def create_feed_from_feed_config(feed_config): + assert feed_config is not None + feed_name = feed_config["FeedName"] + feed_type = feed_config["FeedType"] + feed_url = feed_config["FeedUrl"] + link_type = feed_config["LinkType"] + return Feed(feed_name, feed_type, link_type, feed_url) + + @staticmethod + def create_feed_from_feed_config_path(feed_config_path): + assert os.path.isfile(feed_config_path) + feed_config = fm.read_json_file(feed_config_path) + return Feed.create_feed_from_feed_config(feed_config) + + @staticmethod + def create_feed_from_feed_folder_path(feed_folder_path): + assert os.path.isdir(feed_folder_path) + feed_config_path = glob.glob(feed_folder_path + "/*" + Config["ConfigFileSuffix"] + Config["ConfigFileExtension"])[0] + return Feed.create_feed_from_feed_config_path(feed_config_path) + + @staticmethod + def create_feeds_from_storage_folder(): + feed_list_items = [] + for file_path in glob.glob(Config["FeedStorageFolder"] + "/*" * (len(Config["FeedStoragePrefix"]) + 1) + Config["ConfigFileSuffix"] + Config["ConfigFileExtension"], recursive=True): + try: + feed = Feed.create_feed_from_feed_config_path(file_path) + feed_list_items.append(feed) + except: + pass + return feed_list_items + + @staticmethod + def FindItem(feed_items, item_key, search_pattern): + assert feed_items is not None + assert item_key is not None + assert search_pattern is not None + result = None + for feed_item in feed_items: + if item_key not in feed_item: + continue + if feed_item[item_key] == search_pattern: + result = feed_item + break + + return result \ No newline at end of file diff --git a/src/ui/web/cgi/cgi_server.py b/src/ui/web/cgi/cgi_server.py index e69de29..1fdef61 100644 --- a/src/ui/web/cgi/cgi_server.py +++ b/src/ui/web/cgi/cgi_server.py @@ -0,0 +1,21 @@ +import os +import sys +import shutil +import glob +import stat +from http.server import HTTPServer, CGIHTTPRequestHandler +import ui.web.cgi.pages + +def runServer(workingDir, serverAddress=('',8080)): + + page_folder = os.path.join(workingDir, "cgi-bin/") + if(not os.path.exists(page_folder)): + srcpagefolder = str(sys.modules['ui.web.cgi.pages']).replace("","") + shutil.copytree(srcpagefolder, page_folder) + os.chdir(page_folder) + for file in glob.glob('*.py'): + os.chmod(file, stat.S_IXUSR | stat.S_IWUSR | stat.S_IRUSR) + + os.chdir('..') + server = HTTPServer(serverAddress, CGIHTTPRequestHandler) + server.serve_forever() \ No newline at end of file diff --git a/src/ui/web/cgi/pages/FeedOverview.py b/src/ui/web/cgi/pages/FeedOverview.py index e69de29..0691dd5 100644 --- a/src/ui/web/cgi/pages/FeedOverview.py +++ b/src/ui/web/cgi/pages/FeedOverview.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 -*- + +# enable debugging +import cgi +import urllib +from feed.feed import Feed + + +def create_episode_list(episodes, feedFolder): + result = [] + for episode in episodes: + result.append('''
  • {EpisodeTitle} {EpisodeDate} +

    {EpisodeSubTitle}

  • '''.format(EpisodeTitle=episode["title"], EpisodeSubTitle=episode["subtitle"], EpisodeDate=episode["pubdate"], EpisodeUrl=urllib.parse.urlencode({'EpisodeTitle': episode["title"], 'FeedFolder': feedFolder}))) + + return "\n".join(result) + +arguments = cgi.FieldStorage() +feedFolder =arguments["FeedFolder"].value +feed = Feed.create_feed_from_feed_folder_path(feedFolder) +feedObj = feed.get_feed_items() + +page = '''Content-Type: text/html + + + + + +Feed: {FeedName} - {FeedTitle} + + + +

    Feed: {FeedName} - {FeedTitle}

    +

    {FeedSubTitle}

    +

    {FeedSummary}

    + + + + +'''.format(FeedName=feed.name, FeedTitle=feedObj["title"], FeedSubTitle=feedObj["subtitle"], FeedSummary=feedObj["summary"], EpisodeList=create_episode_list(feedObj["episodes"], feed.feed_folder_path)) + +print(page) \ No newline at end of file diff --git a/src/ui/web/cgi/pages/FileLoader.py b/src/ui/web/cgi/pages/FileLoader.py index e69de29..8d0267f 100644 --- a/src/ui/web/cgi/pages/FileLoader.py +++ b/src/ui/web/cgi/pages/FileLoader.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 -*- + +# enable debugging +import cgi +import os +import subprocess +from feed.feed import Feed + +arguments = cgi.FieldStorage() +feedFolder = arguments["FeedFolder"].value +feed = Feed.create_feed_from_feed_folder_path(feedFolder) +feedObj = feed.get_feed_items() + +feedName = feed.name +episodeTitle = arguments["EpisodeTitle"].value +episode = Feed.FindItem(feedObj["episodes"], "title", episodeTitle) +originLink = episode["file_link"] +filename, file_extension = os.path.splitext(originLink) +mylinkPrefix = os.path.join(feedFolder, episodeTitle.replace(" ", "_")) +mylink = mylinkPrefix + file_extension +if not os.path.exists(mylink): + subprocess.call(['curl -Lo "{Mylink}" "{OriginLink}" &'.format(Mylink=mylink, OriginLink=originLink)], + shell=True + ) + + +page = '''Content-Type: text/html + + + + + +FileLoad + + +

    FileLoad

    + +

    {FeedName}: {EpisodeTitle}

    + +