def testAGenerateP2PNextAtomFeed(self): _log.debug("Generate P2P-Next Atom feeds ------------") if not TestFeedGenerator.run_test: _log.debug("Test avoided.") return feed = P2PNextAtomFeed(title=u"BBC One London", feed_url=u"http://p2pnextfeed1.rad0.net/content/feed/bbc/bbcone", language=u"en", author_name=u"BBC", feed_guid=u"urn:bbc-bbcone", image="http://p2pnextfeed1.rad0.net/images/bbcone.png") feed.add_item(title="Weatherview", link=u"http://p2pnextfeed1.rad0.net/content/info/bbc/bbcone/b00vk4xq", link_type=u"application/atom+xml", unique_id=u"urn:bbc-bbcone-b00vk4xq", description=u"Detailed weather forecast.", image="http://www.bbc.co.uk/iplayer/images/progbrand/b007yy70_150_84.jpg") rmg = RichMetadataGenerator.getInstance() _log.debug(rmg.prettyPrint(feed.writeString(), 'utf-8')) #### Test some changes we have done to the Django feedgenerator # 0.) Default generator self.assertTrue(isinstance(feed, P2PNextAtomFeed)) # 1.) Can generate feed without description and swapped # feed_url and link self.assertTrue(P2PNextAtomFeed(title=u"BBC One London", feed_url=u"http://p2pnextfeed1.rad0.net/content/feed/bbc/bbcone")) # 2.) Without specified link the id is not None self.assertTrue(P2PNextAtomFeed(title=u"BBC One London", feed_url=u"http://p2pnextfeed1.rad0.net/content/feed/bbc/bbcone").feed['id'] != None) # 3.) Specifying an image turns on p2pnext namespace self.assertTrue(feed.root_attributes().has_key("xmlns:p2pnext")) self.assertTrue(feed.feed.has_key("image")) self.assertTrue(feed.feed["image"] != None) self.assertTrue(feed.items[0].has_key("image")) self.assertTrue(feed.items[0]["image"] != None) # 4.) Specifying an image in an item turns on p2pnext namespace feed2 = P2PNextAtomFeed(title=u"BBC One London", feed_url=u"http://p2pnextfeed1.rad0.net/content/feed/bbc/bbcone", language=u"en", author_name=u"BBC", feed_guid=u"urn:bbc-bbcone") feed2.add_item(title="Weatherview", link=u"http://p2pnextfeed1.rad0.net/content/info/bbc/bbcone/b00vk4xq", link_type=u"application/atom+xml", unique_id=u"urn:bbc-bbcone-b00vk4xq", description=u"Detailed weather forecast.", image="http://www.bbc.co.uk/iplayer/images/progbrand/b007yy70_150_84.jpg") self.assertTrue(feed2.root_attributes().has_key("xmlns:p2pnext")) self.assertTrue(feed2.feed.has_key("image")) self.assertTrue(feed2.feed["image"] == None) self.assertTrue(feed2.items[0].has_key("image")) self.assertTrue(feed2.items[0]["image"] != None) # 5.) Only title and description (summary) are needed for an # item, since link || content, id still MUST be provided feed3 = P2PNextAtomFeed(title=u"BBC One London", feed_url=u"http://p2pnextfeed1.rad0.net/content/feed/bbc/bbcone") feed3.add_item(title="Weatherview", description=u"Detailed weather forecast.") # In this case we generate id on the fly from the item link on build self.assertTrue(feed3.items[0]['unique_id'] == None) # 6.) But the build will fail if either link nor content are # available self.assertRaises(FeedGeneratorError, feed3.writeString) # 7.) So try with some content feed4 = P2PNextAtomFeed(title=u"BBC One London", feed_url=u"http://p2pnextfeed1.rad0.net/content/feed/bbc/bbcone") feed4.add_item(title="Weatherview", description=u"Detailed weather forecast.", content="Still need better specification how to be encoded") pf = feedparser.parse(StringIO(feed4.writeString())) self.assertTrue(pf.entries[0]['id'] != None) _log.debug("Unique id generated based on content: %s", pf.entries[0]['id']) # 8.) And with a link feed5 = P2PNextAtomFeed(title=u"BBC One London", feed_url=u"http://p2pnextfeed1.rad0.net/content/feed/bbc/bbcone") feed5.add_item(title="Weatherview", description=u"Detailed weather forecast.", link=u"http://p2pnextfeed1.rad0.net/content/info/bbc/bbcone/b00vk4xq") pf = feedparser.parse(StringIO(feed5.writeString())) self.assertTrue(pf.entries[0]['id'] != None) _log.debug("Unique id generated based on a link: %s", pf.entries[0]['id']) linkBasedId = pf.entries[0]['id'] # 9.) And if we try both, link prevails (content is discarded) feed6 = P2PNextAtomFeed(title=u"BBC One London", feed_url=u"http://p2pnextfeed1.rad0.net/content/feed/bbc/bbcone") feed6.add_item(title="Weatherview", description=u"Detailed weather forecast.", content="Still need better specification how to be encoded", link=u"http://p2pnextfeed1.rad0.net/content/info/bbc/bbcone/b00vk4xq") pf = feedparser.parse(StringIO(feed6.writeString())) self.assertTrue(pf.entries[0]['id'] != None) self.assertTrue(pf.entries[0]['id'] == linkBasedId)
def testBGetItemMetadata(self): _log.info("Get feed items metadata ------------") if not TestMetaGenerator.run_test: _log.debug("Test avoided.") return metagdn = Feed() metaradio4 = Feed() feeds = {"http://www.rtvslo.si/podcasts/gori_doli_naokoli.xml": metagdn, "http://downloads.bbc.co.uk/podcasts/radio4/today/rss.xml": metaradio4} for f, m in feeds.items(): pf = feedparser.parse(f) for i in pf.entries: item = Item() for k in settings.MMM_ITEM.keys(): # Split enables lookup in more complex feedparser # structures, like media_content:type, for # example. Not used at the moment. split = k.split(":") try: v = getattr(i, split[0]) if len(split) > 1: name = k.replace(":", "_") if split[1].startswith("-"): name = name.replace("-", "") setattr(item, name, v[split[1].replace("-", "")]) else: setattr(item, name, v[0][split[1]]) else: setattr(item, k, v) except: pass m._items.append(item) _log.debug(metagdn.toString()) _log.debug(metaradio4.toString())
def testAGetFeedMetadata(self): _log.info("Get feed metadata ------------") if not TestMetaGenerator.run_test: _log.debug("Test avoided.") return metagdn = Feed() metaradio4 = Feed() feeds = {"http://www.rtvslo.si/podcasts/gori_doli_naokoli.xml": metagdn, "http://downloads.bbc.co.uk/podcasts/radio4/today/rss.xml": metaradio4} for f, m in feeds.items(): pf = feedparser.parse(f) for k in settings.MMM_FEED.keys(): # Split enables lookup in more complex feedparser # structures, like image:href, for example. split = k.split(":") # Mark : for settings? try: v = getattr(pf.feed, split[0]) if len(split) > 1: name = k.replace(":", "_") if split[1].startswith("-"): name = name.replace("-", "") setattr(m, name, v[split[1].replace("-", "")]) else: setattr(m, name, v[split[1]]) else: setattr(m, k, v) except: pass _log.debug(metagdn.toString()) _log.debug(metaradio4.toString())
def testAGetChannel(self): _log.info("Get channel metadata and content ------------") if not TestContentSource.run_test: _log.debug("Test avoided.") return feeds = ["http://www.rtvslo.si/podcasts/zapisi_iz_mocvirja.xml", "http://downloads.bbc.co.uk/podcasts/radio4/today/rss.xml"] for f in feeds: channel = Channel.getContentSource(f) feed = feedparser.parse(f) self.assertTrue(channel.metadata != None) self.assertTrue(channel.cstype == settings.CS_TYPE_CHANNEL) self.assertTrue(channel.sourceMeta == None) self.assertTrue(channel.name != None) self.assertTrue(channel.identifier != None) self.assertTrue(channel.location == f) self.assertTrue(os.path.isdir(channel.storage)) self.assertTrue(os.path.exists(os.path.join(channel.storage, channel.metaFile))) self.assertTrue(os.path.exists(os.path.join(channel.storage, settings.CONTENT_SOURCE_PROPERTIES))) self.assertTrue(len(channel.items) == len(feed.entries)) for i, v in channel.items.items(): self.assertTrue(v.name != None) self.assertTrue(v.cutype == settings.CONTENT_VOD) self.assertTrue(v.identifier != None and v.identifier == i) self.assertTrue(v.metadata != None) self.assertTrue(channel.storage == v.feedStore) self.assertTrue(v.stored) self.assertTrue(v.acquire == channel.acquire) self.assertTrue(os.path.exists(os.path.join(channel.storage, v.contentFile))) self.assertTrue(os.path.exists(os.path.join(channel.storage, v.metaFile))) restored = channel.restore(channel.storage) self.assertTrue(restored == channel) new = Channel.getContentSource(f) self.assertTrue(new == channel) channel.remove()
def getMetadata(data, identifyMedia=True): """ Gets metadata from feed url or data like object with a read method. Generates {@link Item} instances if present in the feed. @param data url or file like object with a read method @param identifyMedia identify media as described in the feed items @return Feed instance """ mfeed = Feed() pf = None try: pf = feedparser.parse(data) except Exception, e: _log.error("Failed to read the feed at specified url or data '%s', reason: %s", data, str(e)) return None
def testIWindow(self): _log.info("Window test -----------") if not TestContentSource.run_test: _log.debug("Test avoided.") return feed = "http://downloads.bbc.co.uk/podcasts/radio4/today/rss.xml" channel = Channel.getContentSource(feed) fp = feedparser.parse(feed) osw = len(fp.entries) channel = Channel.getContentSource(feed, None, None, None, None, osw) self.assertTrue(len(channel.items) == osw) channel = Channel.getContentSource(feed, None, None, None, None, osw-1) self.assertTrue(len(channel.items) == osw-1) channel.window = 10 channel.checkWindow() self.assertTrue(len(channel.items) == 10) channel.store(True) channel = Channel.getContentSource(feed) self.assertTrue(len(channel.items) == 10) # Negative value for window restores default - None channel = Channel.getContentSource(feed, None, None, None, None, -1) self.assertTrue(len(channel.items) == osw)
def testCFFMpegIdentify(self): _log.info("Identify media ------------") if not TestMetaGenerator.run_test: _log.debug("Test avoided.") return feed = "http://www.rtvslo.si/podcasts/vreme.xml" pf = feedparser.parse(feed) url = pf.entries[0].id if url != None: tmpFile = tempfile.NamedTemporaryFile() urllib.urlretrieve(url, tmpFile.name) m1 = Media.getMetadata(tmpFile.name) _log.debug(m1.toString()) m2 = Media.getMetadata(url) _log.debug(m2.toString()) self.assertTrue(m1 == m2) oldsize = m1.size m1.size = str(int(m1.size) - 1) self.assertTrue(m1 != m2) m1.size = oldsize self.assertTrue(m1 == m2) if len(m2._items) > 0: m2._items[0].number = "whoknows" self.assertTrue(m1 != m2)