Changeset 722

Show
Ignore:
Timestamp:
07/01/09 20:17:22 (14 months ago)
Author:
gazpachoking
Message:

Added deluge 1.2 support to deluge plugin.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/flexget/plugins/output_deluge.py

    r705 r722  
    11import logging 
    2 import time, os, sys 
     2import time, os, sys, base64 
    33from flexget.manager import Base 
    44from flexget.plugin import * 
     
    88 
    99log = logging.getLogger('deluge') 
    10  
    11 class DelugeEpisode(Base): 
    12      
    13     __tablename__ = 'deluge_episodes' 
    14  
    15     id = Column(Integer, primary_key=True) 
    16      
    17     torrentid = Column(Integer) 
    18     episode_id = Column(Integer, ForeignKey('series_episodes.id')) 
    19  
    20     def __repr__(self): 
    21         return '<DelugeEpisode(identifier=%s)>' % (self.identifier) 
    2210 
    2311class OutputDeluge: 
     
    8270                        log.error('The server couldn\'t fulfill the request. Error code: %s' % e.code) 
    8371 
    84  
    8572    def feed_output(self, feed): 
     73        """Add torrents to deluge at exit.""" 
     74        config = self.get_config(feed) 
     75        # don't add when learning 
     76        if feed.manager.options.learn: 
     77            return 
     78        if not feed.accepted or not config['enabled']: 
     79            return 
     80        #TODO: Figure out better way to detect version 
     81        try: 
     82            from deluge.ui.client import sclient 
     83        except: 
     84            log.info("Using deluge 1.2 api") 
     85            self.add_to_deluge12(feed, config) 
     86        else: 
     87            log.info("Using deluge 1.1 api") 
     88            self.add_to_deluge11(feed, config) 
     89 
     90    def add_to_deluge11(self, feed, config): 
    8691        """Add torrents to deluge at exit.""" 
    8792        try: 
     
    8994        except: 
    9095            raise PluginError('Deluge module required', log) 
    91         config = self.get_config(feed) 
    92  
    93         # don't add when learning 
    94         if feed.manager.options.learn: 
    95             return 
    96         if not feed.accepted or not config['enabled']: 
    97             return 
    9896 
    9997        sclient.set_core_uri() 
     
    148146            else: 
    149147                log.info("%s is already loaded in deluge. Cannot change label, movedone, or queuetotop" % entry['title']) 
    150     #TODO: Activate once propers are detected or another use is thought of. 
    151     """ 
    152     def feed_exit(self, feed): 
    153         #Remember torrentid of series torrents for future control 
    154         for entry in feed.accepted: 
    155             if not 'deluge_torrentid' in entry: 
    156                 continue 
    157             parser = entry.get('series_parser') 
    158             if parser: 
    159                 from filter_series import Episode, Series 
    160                 log.debug('storing deluge torrentid for %s' % parser) 
    161                 episode = feed.session.query(Episode).select_from(join(Episode, Series)).\ 
    162                     filter(Series.name==parser.name).filter(Episode.identifier==parser.identifier()).first() 
    163                 if episode: 
    164                     # if does not exist in database, add new 
    165                     delugeepisode = feed.session.query(DelugeEpisode).filter(DelugeEpisode.episode_id==episode.id).first() 
    166                     if not delugeepisode: 
    167                         delugeepisode = DelugeEpisode() 
    168                         delugeepisode.episode_id = episode.id 
    169                         delugeepisode.torrentid = entry['deluge_torrentid'] 
    170                         feed.session.add(delugeepisode) 
    171     """ 
     148                 
     149    def add_to_deluge12(self, feed, config): 
     150        try: 
     151            from twisted.internet import reactor, defer 
     152            from deluge.ui.client import client 
     153        except: 
     154            raise PluginError('Deluge and twisted module required', log) 
     155 
     156        d = client.connect() 
     157        def on_connect_success(result): 
     158            if not result: 
     159                #TODO: connect failed, do something 
     160                pass 
     161            def on_success(torrent_id, entry, config): 
     162                if not torrent_id: 
     163                    log.info("%s is already loaded in deluge, cannot set movedone, label, or queuetotop." % entry['title']) 
     164                    return 
     165                log.info("%s successfully added to deluge." % entry['title']) 
     166                movedone = entry.get('movedone', config['movedone']) 
     167                label = entry.get('label', config['label']).lower() 
     168                queuetotop = entry.get('queuetotop', config['queuetotop']) 
     169                if movedone: 
     170                    if not os.path.isdir(movedone): 
     171                        log.debug("movedone path %s doesn't exist, creating" % movedone) 
     172                        os.mkdir(movedone) 
     173                    log.debug("%s move on complete set to %s" % (entry['title'], movedone % entry)) 
     174                    client.core.set_torrent_move_completed(torrent_id, True) 
     175                    client.core.set_torrent_move_completed_path(torrent_id, movedone % entry) 
     176                if label: 
     177                    #TODO: check if label plugin is enabled 
     178                    client.label.add(label) 
     179                    client.label.set_torrent(torrent_id, label) 
     180                    log.debug("%s label set to '%s'" % (entry['title'], label)) 
     181                if queuetotop: 
     182                    log.debug("%s moved to top of queue" % entry['title']) 
     183                    client.core.queue_top([torrent_id]) 
     184            def on_fail(result, entry, feed): 
     185                log.info("%s was not added to deluge! %s" % (entry['title'], result)) 
     186                feed.fail(entry, "Could not be added to deluge") 
     187            #add the torrents 
     188            dlist = [] 
     189            for entry in feed.accepted: 
     190                opts = {} 
     191                path = entry.get('path', config['path']) 
     192                if path: 
     193                    opts['download_location'] = path % entry 
     194                # see that temp file is present 
     195                if not os.path.exists(entry['file']): 
     196                    tmp_path = os.path.join(feed.manager.config_base, 'temp') 
     197                    log.debug('entry: %s' % entry) 
     198                    log.debug('temp: %s' % ', '.join(os.listdir(tmp_path))) 
     199                    raise PluginError("Downloaded temp file '%s' doesn't exist!?" % entry['file'], log) 
     200                filedump = base64.encodestring(open(entry['file']).read()) 
     201                addresult = client.core.add_torrent_file(entry['title'], filedump, opts) 
     202                addresult.addCallback(on_success, entry, config).addErrback(on_fail, entry, feed) 
     203                dlist.append(addresult) 
     204                #clean up temp file if download plugin is not configured for this feed 
     205                if not 'download' in feed.config: 
     206                    os.remove(entry['file']) 
     207                    del(entry['file']) 
     208 
     209            def on_complete(result): 
     210                def on_disconnect(result): 
     211                    reactor.stop() 
     212                client.disconnect().addCallback(on_disconnect).addErrback(on_disconnect) 
     213            defer.DeferredList(dlist).addCallback(on_complete) 
     214             
     215        def on_connect_fail(result): 
     216            #clean up temp files 
     217            for entry in feed.accepted: 
     218                os.remove(entry['file']) 
     219                del(entry['file']) 
     220            #TODO: is aborting the feed the best course of action? 
     221            log.info('Connect failed: %s' % result) 
     222            feed.abort() 
     223            reactor.stop() 
     224 
     225        d.addCallback(on_connect_success).addErrback(on_connect_fail) 
     226        reactor.run() 
     227 
    172228register_plugin(OutputDeluge, 'deluge', priorities=dict(output=1))