예제 #1
0
class TestFeedFilter(unittest.TestCase):
  def setUp(self):
    self.filter = FeedFilter() 
#   self.reader = FeedReader('http://manhua.178.com/u/usagidrop/rss.xml')

  def tearDown(self):
    self.filter = None

  def test_filterFeedsExp(self):
    li = [
           MockFeedItem('[枫雪动漫][Hoshizora e Kakaru Hashi 架向星空之桥][12][RMVB+MKV]'),
           MockFeedItem('【旋风字幕组】死神Bleach 第330话「想要活下去!望实的斩魂刀」【RMVB】简体 848x480'), 
           MockFeedItem('动漫之家[DmzJ字幕组][7月新番][Natsume_Yuujinchou_San_夏目友人帐_第三季][02][HDTV][rmvb+mkv]'),
           MockFeedItem('【SOSG字幕团】★4月新番【银魂 Gintama】【第216话】[简体MP4][720p][HDTV]【替代RMVB,享受高清】(RMVB全面停压淘汰)'),
           MockFeedItem('【SOSG字幕團】★4月新番【銀魂 Gintama】【第216話】[繁體MP4][480p][HDTV]【替代RMVB,享受便捷】(RMVB全面停壓淘汰)'),
           MockFeedItem('【异域字幕组】★【7月新番】[夏目友人帐 参][Natsume Yuujinchou San][02][720P][简体][MKV]'),
           MockFeedItem('【AcgmTHK字幕組&K2字幕組】★七月新番【神様のメモ帳 神的記事本】[02][繁體][576P&720P][RV10&Mp4][Http下載、內詳]')
         ]
    result = self.filter.filterFeeds(li)
    errorMsg = listPrint(result)
    self.assertEqual(4, len(result), errorMsg)

  @unittest.skip('reality test skip')
  def test_filterFeeds(self):
    feedRes = FeedRes('popgo.xml', 'tag', 'description', 0, 'Tue, 12 Jul 2011 22:23:26 +0800')
    self.reader = FeedReader(feedRes)
    feeds = self.reader.getFeedItems()
    filtered = self.filter.filterFeeds(feeds)
    filteredLength = len(filtered)
    notFilterLength = len(feeds)
    print('Before: {}\tAfter: {}'.format(notFilterLength, filteredLength))
    f = lambda x:x.title
    print('Filtered -----------\n{}Not filtered ----------\n{}'.format(listPrint(listSub(feeds, filtered), fetchF=f), listPrint(filtered, fetchF=f)))
    self.assertTupleEqual((35, 18), (notFilterLength, filteredLength))
예제 #2
0
 def setUp(self):
   self.filter = FeedFilter() 
예제 #3
0
 def __init__(self):
   self.resOper = ResourceOperator()
   self.feedFilter = FeedFilter()
   self._initCache()
   self.results = None
   self.linkSender = None
예제 #4
0
class Application:
  __version__ = (0, 1, 3)
  def __init__(self):
    self.resOper = ResourceOperator()
    self.feedFilter = FeedFilter()
    self._initCache()
    self.results = None
    self.linkSender = None

  def _initCache(self):
    self.resOper.getFeedResUpdateTime()
    self.resOper.fillCache()

  def openLink(self, index):
    openCmd = 'open'
    platform = sys.platform
    if platform == 'linux2':
      openCmd = 'xdg-open'
    elif platform == 'win32':
      openCmd = 'start'
    try:
      for i in [int(e) for e in index.strip().split(' ')]:
        if self.results[0][i].link.startswith('http'):
          os.system('{} {!r}'.format(openCmd, self.results[0][i].link))
        else:
          print(self.results[0][i].link)
    except IndexError:
      print("Index Error")
    except ValueError:
      print("Value Error")

  def magnetLink(self, index):
    for i in [int(e) for e in index.strip().split(' ')]:
      print(getMagnetLinkFromURL(self.results[0][i].link))

  def sendMagnetLink(self, index):
    if self.linkSender is None:
      self.linkSender = send2Trans()
    for i in [int(e) for e in index.strip().split(' ')]:
      link = getMagnetLinkFromURL(self.results[0][i].link)
      self.linkSender.sendlink(link)

  def showDescription(self, index):
    i = int(index)
    print(self.results[0][i].description)

  def readCommand(self, results):
    def getArg(x):
      return int(x.split(' ')[-1])
    try:
      cmd = input()
      while (cmd != 'exit'):
        if cmd.startswith('c'): # open url
          self.openLink(cmd[2:])
        elif cmd.startswith('d'): # show description
          print('Feed Description:')
          self.showDescription(cmd[2:])
        elif cmd.startswith('m'): # get magnet link
          self.magnetLink(cmd[2:])
        elif cmd.startswith('s'): # send magnet link
          self.sendMagnetLink(cmd[2:])
        elif cmd == 'add filter': # add fileter
          self.addNewFilter()
        elif cmd == 'filtered':  # list fileterd feeds
          self._showResult(results[1])
        elif cmd == 'show': # show feeds
          self._showResult(results[0])
        elif cmd == 'fetch': # fetch from feedRes
          self.fetchAndPrint()
        else:
          print('unrecognized')
        cmd = input()
    except EOFError:
      print('Bye~')


  def addNewFilter(self):
    print('Input reason tag.{tag 1 and 4 is must filter}')
    cmd = input().split(' ')
    reason = cmd[0]
    tag = cmd[1]
    print('Reason: {}\tTag: {}\nconfirm?'.format(reason,int(tag)))
    if input() != 'no':
      self.resOper.addFilterPattern(reason, tag)
    else:
      print('cancled')

  def fetchingRes(self):
#TODO: tmep solution
#    try:
    nodes = []
    for feedRes in self.resOper.getFeedResource():
      reader = FeedReader(feedRes)
      newNodes = reader.getFeedItems(FeedReader.noDuplicate)
      if len(newNodes) == 0:
        print('[Info] skip feeds {}'.format(feedRes.id), end='\t')
        continue
      nodes += newNodes
    #nodes = listUnique(nodes, lambda x:x.title)
    validFeeds = self.feedFilter.filterFeeds(nodes)
    filtered = listSub(nodes, validFeeds)
    self._writeToDB(validFeeds, filtered)
    self.results = (validFeeds, filtered)
#    except:
#      print("Fetching error")

  def _showResult(self, xs):
    print('\n{} feed(s) updated'.format(len(xs)))
    print(listPrint(xs, 'seq', fetchF=lambda x:x.title))

  def _writeToDB(self, valid, filtered):
    self.resOper.writeValid(valid)
    self.resOper.writeFiltered(filtered)

  def run(self, mode='normal'):
    if mode == 'init':
      self.fetchingRes()
    elif mode != 'normal':
      print('Welcom to Charllote Rss Reader. ')
      self.readCommand([])
    else:
      self.fetchAndPrint()
      self.readCommand(self.results)
        
  def fetchAndPrint(self):
    print('Now fetching resources')
    self.fetchingRes()
    if self.results == None:
      print("Fetch Error")
      return
    self._showResult(self.results[0])
    print('Instruction:\nc x:Open browser to check no x\nd x:Direct download specified feed with defualt dowloader\n')