diff --git a/src/config/config.py b/src/config/config.py index cc0dc51..f90e6e7 100644 --- a/src/config/config.py +++ b/src/config/config.py @@ -1,7 +1,7 @@ __author__ = 'dev' Config = { - "FeedLinkTypes" : {"application/x-bittorrent","mp3"}, + "FeedLinkTypes" : {"audio/mpeg","application/x-bittorrent"}, "FeedTypes" : {"podcast","rss"}, "FeedStorageFolder" : "testfeeds", "FeedStoragePrefix" : { "0" : "FeedType", "1" : "FeedName"}, diff --git a/src/feed/feed.py b/src/feed/feed.py index d0cc516..633e66d 100644 --- a/src/feed/feed.py +++ b/src/feed/feed.py @@ -1,40 +1,67 @@ __author__ = 'dev' from utilities.jsonfile import JsonFile +from utilities.feedfile import FeedFile from config.config import Config +from utilities.podcastserializer import PodcastSerializer import os +import feedparser + class Feed: def __init__(self, feed_name=None, feed_type=None, link_type=None, feed_url=None): - self.valid_file_types = {"application/x-bittorrent","mp3"} + self.config_path = None + self.feed_folder_path = None + self.feed_config = None + self.setup_feed(feed_name, feed_type, link_type, feed_url) + + def load_feed(self): + assert self.feed_config is not None + return feedparser.parse(self.feed_config["FeedUrl"]) + + def setup_feed(self, feed_name, feed_type, link_type, feed_url): + assert feed_name is not None + assert feed_type is not None + assert link_type is not None + assert feed_url is not None + self.feed_config = self.create_feed_config_file(feed_name, feed_type, link_type, feed_url) + self.config_path = self.create_feed_config_path() + if os.path.exists(self.config_path) is False: + self.write_feed_config_file() def new_feed_folder(self): - feed_folder = Config["FeedStorageFolder"] - feed_folder_prefix = Config["FeedStoragePrefix"] - for i in range(len(feed_folder_prefix)): - value = feed_folder_prefix.get(str(i)) - if value is not None: - tmpValue = self.feed_config.get(value) - if tmpValue is not None: - value = tmpValue + if self.feed_folder_path is None: + assert self.feed_config is not None + feed_folder = Config.get("FeedStorageFolder") + assert feed_folder is not None + feed_folder_prefix = Config.get("FeedStoragePrefix") + assert feed_folder_prefix is not None - feed_folder += "/" + value - else: - break + for i in range(len(feed_folder_prefix)): + value = feed_folder_prefix.get(str(i)) + if value is not None: + tmp_value = self.feed_config.get(value) + if tmp_value is not None: + value = tmp_value + feed_folder += "/" + value + else: + break - if not os.path.exists(feed_folder): + self.feed_folder_path = feed_folder + if not os.path.exists(self.feed_folder_path): os.mkdir(feed_folder) - return os.path.abspath(feed_folder) - - - + return self.feed_folder_path def create_feed_config_file(self, feed_name, feed_type, link_type, feed_url): - feed_config =\ + assert feed_name is not None + assert feed_type is not None + assert link_type is not None + assert feed_url is not None + feed_config = \ { "FeedName": feed_name, "FeedType": feed_type, @@ -43,7 +70,11 @@ class Feed: } return feed_config + def create_feed_config_path(self): + if self.config_path is None: + self.config_path = self.new_feed_folder() + "/" + self.feed_config["FeedName"] + Config["ConfigFileSuffix"] + Config["ConfigFileExtension"] + return self.config_path - def write_feed_config_file(self, feed_folder): - file = JsonFile(feed_folder + self.feed_config["FeedName"] + Config["ConfigFileSuffix"] + Config["ConfigFileExtension"]) + def write_feed_config_file(self): + file = JsonFile(self.create_feed_config_path()) file.write_json_file(self.feed_config) \ No newline at end of file diff --git a/src/utilities/feedfile.py b/src/utilities/feedfile.py index 0271bcf..b879831 100644 --- a/src/utilities/feedfile.py +++ b/src/utilities/feedfile.py @@ -21,7 +21,7 @@ class FeedFile(JsonFile): feed_str = self.read_text_file() return feedparser.parse(feed_str) - def write_feedjson_file(self, feed, serializer=None): + def write_feed_json_file(self, feed, serializer=None): """ method write a feedparpser object to a text file. It use a certain serializer or the default serializer if type of the serializer is none diff --git a/src/utilities/podcastserializer.py b/src/utilities/podcastserializer.py index 89b0c9d..1a55853 100644 --- a/src/utilities/podcastserializer.py +++ b/src/utilities/podcastserializer.py @@ -1,9 +1,13 @@ __author__ = 'dev' import json from utilities.serializer import Serializer +from config.config import Config class PodcastSerializer(Serializer): + def __init__(self, episode_file_type): + self.episode_file_type = episode_file_type + def serialize(self, dict_object): """ method convert i dict to a string. @@ -18,7 +22,7 @@ class PodcastSerializer(Serializer): for episode in dict_object["entries"]: filelink = "" for links in episode["links"]: - if links["type"] == 'application/x-bittorrent': + if links["type"] == self.episode_file_type: filelink = links["href"] tempepisode = { diff --git a/testenv/testfeeds/podcast/sbk-config.json b/testenv/testfeeds/podcast/sbk-config.json deleted file mode 100644 index a792fa2..0000000 --- a/testenv/testfeeds/podcast/sbk-config.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "FeedName": "sbk", - "FeedUrl": "http://www.staatsbuergerkunde-podcast.de/feed/mp3-rss/", - "LinkType": "application/x-bittorrent" -} \ No newline at end of file diff --git a/testenv/testfeeds/podcast/sbk/sbk-config.json b/testenv/testfeeds/podcast/sbk/sbk-config.json new file mode 100644 index 0000000..143f513 --- /dev/null +++ b/testenv/testfeeds/podcast/sbk/sbk-config.json @@ -0,0 +1,6 @@ +{ + "LinkType": "application/x-bittorrent", + "FeedUrl": "http://www.staatsbuergerkunde-podcast.de/feed/mp3-rss/", + "FeedType": "podcast", + "FeedName": "sbk" +} \ No newline at end of file diff --git a/testenv/testfeeds/podcast/sbk.xml b/testenv/testfeeds/podcast/sbk/sbk.xml similarity index 100% rename from testenv/testfeeds/podcast/sbk.xml rename to testenv/testfeeds/podcast/sbk/sbk.xml diff --git a/testenv/tests/feed/testfeed.py b/testenv/tests/feed/testfeed.py index ee4ac70..deea23c 100644 --- a/testenv/tests/feed/testfeed.py +++ b/testenv/tests/feed/testfeed.py @@ -5,14 +5,13 @@ from feed.feed import Feed from utilities.jsonfile import JsonFile from config.config import Config import os.path - +import feedparser class TestFeed(unittest.TestCase): def setUp(self): super().setUp() - self.testFeed = Feed("sbk", "podcast", "application/x-bittorrent", - "http://www.staatsbuergerkunde-podcast.de/feed/mp3-rss/") + self.testFeed = Feed("sbk", "podcast", "audio/mpeg", "testfeeds/podcast/sbk/sbk.xml") def test_load_new_feed(self): self.assertTrue(False) @@ -27,7 +26,19 @@ class TestFeed(unittest.TestCase): self.assertTrue(False) def test_load_feed(self): - self.assertTrue(False) + feed = self.testFeed.load_feed() + self.assertIsInstance(self.testFeed.load_feed(), feedparser.FeedParserDict) + self.assertEqual(0, feed["bozo"]) + + def test_load_feed_error_none_config(self): + self.testFeed.feed_config = None + self.assertRaises(AssertionError, self.testFeed.load_feed) + + def test_load_feed_error_wrong_url(self): + self.testFeed = Feed("sbk", "podcast", "audio/mpeg", "testfeeds/podcast/sbk/sbk.xm") + feed = self.testFeed.load_feed() + self.assertIsInstance(self.testFeed.load_feed(), feedparser.FeedParserDict) + self.assertEqual(1, feed["bozo"]) def test_load_feed_error_loading_failed(self): self.assertTrue(False) @@ -35,18 +46,45 @@ class TestFeed(unittest.TestCase): def test_setup_feed(self): self.assertTrue(False) + def test_setup_feed_error_none_parameter(self): + self.assertRaises(AssertionError, self.testFeed.setup_feed, None, "podcast", "audio/mpeg", + "http://www.staatsbuergerkunde-podcast.de/feed/mp3-rss/") + self.assertRaises(AssertionError, self.testFeed.setup_feed, "sbk", None, "audio/mpeg", + "http://www.staatsbuergerkunde-podcast.de/feed/mp3-rss/") + self.assertRaises(AssertionError, self.testFeed.setup_feed, "sbk", "podcast", None, + "http://www.staatsbuergerkunde-podcast.de/feed/mp3-rss/") + self.assertRaises(AssertionError, self.testFeed.setup_feed, "sbk", "podcast","audio/mpeg", None) + + def test_create_feed_config_path(self): + self.testFeed.config_path = "foo" + self.assertEqual(self.testFeed.create_feed_config_path(), "foo") + def test_new_feed_folder(self): self.assertTrue(os.path.exists(self.testFeed.new_feed_folder())) + def test_new_feed_folder_no_feed_config(self): + self.testFeed.feed_folder_path = None + self.testFeed.feed_config = None + self.assertRaises(AssertionError, self.testFeed.new_feed_folder) + def test_create_feed_config_file(self): - feed_config = self.testFeed.create_feed_config_file("sbk", "podcast", "application/x-bittorrent", + feed_config = self.testFeed.create_feed_config_file("sbk", "podcast", "audio/mpeg", "http://www.staatsbuergerkunde-podcast.de/feed/mp3-rss/") self.assertIsNotNone(feed_config) self.assertEqual("sbk", feed_config["FeedName"]) self.assertEqual("podcast", feed_config["FeedType"]) - self.assertEqual("application/x-bittorrent", feed_config["LinkType"]) + self.assertEqual("audio/mpeg", feed_config["LinkType"]) self.assertEqual("http://www.staatsbuergerkunde-podcast.de/feed/mp3-rss/", feed_config["FeedUrl"]) + def test_create_feed_config_file_error_none_parameter(self): + self.assertRaises(AssertionError, self.testFeed.create_feed_config_file, None, "podcast", + "audio/mpeg", "http://www.staatsbuergerkunde-podcast.de/feed/mp3-rss/") + self.assertRaises(AssertionError, self.testFeed.create_feed_config_file, "sbk", None, + "audio/mpeg", "http://www.staatsbuergerkunde-podcast.de/feed/mp3-rss/") + self.assertRaises(AssertionError, self.testFeed.create_feed_config_file, "sbk", "podcast", None, + "http://www.staatsbuergerkunde-podcast.de/feed/mp3-rss/") + self.assertRaises(AssertionError, self.testFeed.create_feed_config_file, "sbk", "podcast", + "audio/mpeg", None) if __name__ == '__main__': unittest.main() diff --git a/testenv/tests/utilities/testfeedfile.py b/testenv/tests/utilities/testfeedfile.py index 346550e..8cadbc5 100644 --- a/testenv/tests/utilities/testfeedfile.py +++ b/testenv/tests/utilities/testfeedfile.py @@ -17,7 +17,7 @@ class FeedUtilitiesTest(unittest.TestCase): feed = self.__ff.read_feed_file() ff2 = FeedFile("testfeed.xml") serializer = None - ff2.write_feedjson_file(feed, serializer) + ff2.write_feed_json_file(feed, serializer) feed2 = ff2.read_feed_file() self.assertTrue(isinstance(feed2, feedparser.FeedParserDict)) ff2.check_and_remove_file() @@ -27,7 +27,7 @@ class FeedUtilitiesTest(unittest.TestCase): feed = "Fail" ff2 = FeedFile("testfeed.xml") serializer = None - self.assertRaises(AssertionError, ff2.write_feedjson_file, feed, serializer) + self.assertRaises(AssertionError, ff2.write_feed_json_file, feed, serializer) ff2.check_and_remove_file() if __name__ == '__main__': diff --git a/testenv/tests/utilities/testpodcastserializer.py b/testenv/tests/utilities/testpodcastserializer.py index 1207722..c83590a 100644 --- a/testenv/tests/utilities/testpodcastserializer.py +++ b/testenv/tests/utilities/testpodcastserializer.py @@ -7,12 +7,12 @@ from utilities.feedfile import FeedFile class PodCastSerializerUtilitiesTest(unittest.TestCase): def setUp(self): - self.__podcastfeed= FeedFile("testfeeds/podcast/sbk.xml").read_feed_file() - self.__serializer = PodcastSerializer() + self.__podcastfeed= FeedFile("testfeeds/podcast/sbk/sbk.xml").read_feed_file() + self.__serializer = PodcastSerializer("application/x-bittorrent") def test_serialize(self): ff2 = FeedFile("testfeed.json") - ff2.write_feedjson_file(self.__podcastfeed, self.__serializer) + ff2.write_feed_json_file(self.__podcastfeed, self.__serializer) feed = ff2.read_json_file() self.assertIsNotNone(feed)