Пример #1
0
 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)
Пример #2
0
 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())
Пример #3
0
 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())
Пример #4
0
 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()
Пример #5
0
    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
Пример #6
0
 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)
Пример #7
0
 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)