| 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 | |