class Transmission::Model::Torrent
Attributes
Public Class Methods
# File lib/transmission/model/torrent.rb, line 124 def add(options = {}) rpc = options[:connector] || connector body = rpc.add_torrent options[:arguments] raise DuplicateTorrentError if body['torrent-duplicate'] find body['torrent-added']['id'], options end
# File lib/transmission/model/torrent.rb, line 110 def all(options = {}) rpc = options[:connector] || connector body = rpc.get_torrent nil, options[:fields] Torrent.new body['torrents'], rpc end
# File lib/transmission/model/torrent.rb, line 141 def connector Transmission::Config.get_connector end
# File lib/transmission/model/torrent.rb, line 116 def find(id, options = {}) rpc = options[:connector] || connector ids = id.is_a?(Array) ? id : [id] body = rpc.get_torrent ids, options[:fields] raise TorrentNotFoundError if body['torrents'].size.zero? Torrent.new body['torrents'], rpc end
# File lib/transmission/model/torrent.rb, line 11 def initialize(torrent_object, connector) if torrent_object.is_a? Array is_single = torrent_object.size == 1 @attributes = is_single ? torrent_object.first : {} @ids = is_single ? [@attributes['id'].to_i] : [] @torrents = torrent_object.inject([]) do |torrents, torrent| @ids << torrent['id'].to_i torrents << Torrent.new([torrent], connector) end unless is_single end @connector = connector end
# File lib/transmission/model/torrent.rb, line 131 def start_all!(options = {}) rpc = options[:connector] || connector rpc.start_torrent nil end
# File lib/transmission/model/torrent.rb, line 136 def stop_all!(options = {}) rpc = options[:connector] || connector rpc.stop_torrent nil end
Public Instance Methods
Returns torrent biggest file and size.
# File lib/transmission/extensions/torrent_attributes.rb, line 96 def biggest b = attributes['files'].max_by { |f| f['length'] } [File.basename(b['name']), b['length']] end
Returns true if torrent is completed.
# File lib/transmission/extensions/torrent_status.rb, line 35 def completed? attributes['percentDone'] >= 1 end
Returns torrent files names.
# File lib/transmission/extensions/torrent_attributes.rb, line 91 def content files.map { |f| File.basename(f) } end
# File lib/transmission/model/torrent.rb, line 24 def delete!(remove_local_data = false) connector.remove_torrent @ids, remove_local_data @deleted = true end
Returns true if torrent is downloading.
# File lib/transmission/extensions/torrent_status.rb, line 15 def downloading? attributes['status'] == 4 end
Returns torrent error string.
# File lib/transmission/extensions/torrent_attributes.rb, line 123 def error attributes['errorString'] if error? end
Returns true if torrent has errors.
# File lib/transmission/extensions/torrent_status.rb, line 45 def error? attributes['error'] != 0 end
Returns torrent eta (in seconds).
# File lib/transmission/extensions/torrent_attributes.rb, line 68 def eta attributes['eta'] end
Returns true if torrent is a single file.
# File lib/transmission/extensions/torrent_attributes.rb, line 73 def file? name = attributes['name'] files = attributes['files'] files.size == 1 && files.first['name'] == name end
Returns all torrent files full path.
# File lib/transmission/extensions/torrent_attributes.rb, line 85 def files dir = File.absolute_path(attributes['downloadDir']) attributes['files'].map { |f| File.join(dir, f['name']) } end
Returns true if torrent is finished.
# File lib/transmission/extensions/torrent_status.rb, line 30 def finished? attributes['isFinished'] end
Returns true if torrent is a folder.
# File lib/transmission/extensions/torrent_attributes.rb, line 80 def folder? !file? end
Returns torrent hash.
# File lib/transmission/extensions/torrent_attributes.rb, line 21 def hash attributes['hashString'] end
Returns torrent id.
# File lib/transmission/extensions/torrent_attributes.rb, line 16 def id attributes['id'] end
Returns true if torrent is not completed.
# File lib/transmission/extensions/torrent_status.rb, line 40 def incomplete? attributes['percentDone'] < 1 end
Returns true if torrent is isolated.
# File lib/transmission/extensions/torrent_status.rb, line 25 def isolated? attributes['status'] == 7 end
Returns torrent size (in bytes).
# File lib/transmission/extensions/torrent_attributes.rb, line 26 def length attributes['totalSize'] end
Returns torrent magnet link.
# File lib/transmission/extensions/torrent_attributes.rb, line 128 def magnet attributes['magnetLink'] end
# File lib/transmission/model/torrent.rb, line 96 def method_missing(symbol, *args) string = symbol.to_s if string[-1] == '=' string = string[0..-2] key = Transmission::Arguments::TorrentSet.real_key string return @attributes[key] = args.first unless key.nil? else key = Transmission::Fields::TorrentGet.real_key string return @attributes[key] unless key.nil? end super end
# File lib/transmission/model/torrent.rb, line 46 def move_bottom! connector.move_bottom_torrent @ids end
# File lib/transmission/model/torrent.rb, line 38 def move_down! connector.move_down_torrent @ids end
# File lib/transmission/model/torrent.rb, line 42 def move_top! connector.move_top_torrent @ids end
# File lib/transmission/model/torrent.rb, line 34 def move_up! connector.move_up_torrent @ids end
# File lib/transmission/model/torrent.rb, line 74 def multi? @ids.size > 1 end
Returns torrent name.
# File lib/transmission/extensions/torrent_attributes.rb, line 5 def name attributes['name'] end
Returns torrent full download path.
# File lib/transmission/extensions/torrent_attributes.rb, line 10 def path dir = File.expand_path(attributes['downloadDir']) File.join(dir, name) end
Returns true if torrent is paused.
# File lib/transmission/extensions/torrent_status.rb, line 5 def paused? attributes['status'] == 0 end
Returns torrent peers.
# File lib/transmission/extensions/torrent_attributes.rb, line 108 def peers attributes['peersConnected'].size end
Returns torrent leeching peers.
# File lib/transmission/extensions/torrent_attributes.rb, line 118 def peers_leeching attributes['peersGettingFromUs'] end
Returns torrent seeding peers.
# File lib/transmission/extensions/torrent_attributes.rb, line 113 def peers_seeding attributes['peersSendingToUs'] end
Returns torrent downloaded files percent.
# File lib/transmission/extensions/torrent_attributes.rb, line 36 def percent_downloaded (attributes['haveValid'] * 1.0 / attributes['totalSize']).round(2) end
Returns torrent ratio percent if session ratio is set.
# File lib/transmission/extensions/torrent_attributes.rb, line 46 def percent_ratio session = Transmission::Model::Session.get return unless session.seed_ratio_limited (attributes['uploadRatio'] * 1.0 / session.seed_ratio_limit).round(2) end
Returns torrent uploaded files percent.
# File lib/transmission/extensions/torrent_attributes.rb, line 41 def percent_uploaded (attributes['uploadedEver'] * 1.0 / attributes['totalSize']).round(2) end
Returns prettified eta.
# File lib/transmission/extensions/torrent_prettify.rb, line 15 def pretty_eta pretty_time(attributes['eta']) if attributes['eta'] > 0 end
Returns prettified torrent size.
# File lib/transmission/extensions/torrent_prettify.rb, line 5 def pretty_length pretty_size(length) end
Returns prettified downloaded files size.
# File lib/transmission/extensions/torrent_prettify.rb, line 10 def pretty_valid pretty_size(valid) end
Returns true if torrent is queued.
# File lib/transmission/extensions/torrent_status.rb, line 10 def queued? attributes['status'] == 3 end
Returns torrent ratio.
# File lib/transmission/extensions/torrent_attributes.rb, line 63 def ratio (attributes['uploadRatio'] * 1.0).round(2) end
# File lib/transmission/model/torrent.rb, line 66 def re_announce! connector.re_announce_torrent @ids end
# File lib/transmission/model/torrent.rb, line 78 def reload! torrents = Torrent.find @ids, connector: @connector @ids = torrents.ids @attributes = torrents.attributes @torrents = torrents.torrents self end
Removes torrent.
# File lib/transmission/extensions/torrent_actions.rb, line 5 def remove! connector.remove_torrent @ids @deleted = true end
Removes torrent and trashes data files.
# File lib/transmission/extensions/torrent_actions.rb, line 11 def remove_data! connector.remove_torrent @ids, true @deleted = true end
# File lib/transmission/model/torrent.rb, line 29 def save! filtered = Transmission::Arguments::TorrentSet.filter @attributes connector.set_torrent @ids, filtered end
Returns true if torrent is seeding.
# File lib/transmission/extensions/torrent_status.rb, line 20 def seeding? attributes['status'] == 6 end
# File lib/transmission/model/torrent.rb, line 70 def set_location(new_location, move = false) connector.torrent_set_location @ids, location: new_location, move: move end
Returns torrent smallest file and size.
# File lib/transmission/extensions/torrent_attributes.rb, line 102 def smallest b = attributes['files'].min_by { |f| f['length'] } [File.basename(b['name']), b['length']] end
Returns torrent download speed (in bytes).
# File lib/transmission/extensions/torrent_attributes.rb, line 53 def speed_download attributes['rateDownload'] end
Returns torrent upload speed (in bytes).
# File lib/transmission/extensions/torrent_attributes.rb, line 58 def speed_upload attributes['rateUpload'] end
# File lib/transmission/model/torrent.rb, line 50 def start! connector.start_torrent @ids end
# File lib/transmission/model/torrent.rb, line 54 def start_now! connector.start_torrent_now @ids end
# File lib/transmission/model/torrent.rb, line 58 def stop! connector.stop_torrent @ids end
# File lib/transmission/model/torrent.rb, line 86 def to_json if multi? @torrents.inject([]) do |torrents, torrent| torrents << torrent.to_json end else @attributes end end
Returns torrent trackers.
# File lib/transmission/extensions/torrent_attributes.rb, line 133 def trackers url_regex = /([-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b)(?:[-a-zA-Z0-9@:%_\+.~#?&\/=]*)/i attributes['trackers'].map do |r| if (a = r['announce'].match(url_regex)) a[1] end end.compact end
Returns torrent downloaded files size (in bytes).
# File lib/transmission/extensions/torrent_attributes.rb, line 31 def valid attributes['haveValid'] end
# File lib/transmission/model/torrent.rb, line 62 def verify! connector.verify_torrent @ids end
Private Instance Methods
Converts filesize to proper units.
# File lib/transmission/extensions/torrent_prettify.rb, line 22 def pretty_size(size) { 'B' => 1000**1, 'KB' => 1000**2, 'MB' => 1000**3, 'GB' => 1000**4, 'TB' => 1000**5 }.each_pair do |e, s| return "#{(size.to_f / (s / 1000)).round(2)}#{e}" if size < s end end
Convert seconds in seconds/minutes/hours.
# File lib/transmission/extensions/torrent_prettify.rb, line 35 def pretty_time(seconds) mm, ss = seconds.divmod(60) hh, mm = mm.divmod(60) dd, hh = hh.divmod(24) eta = { days: dd, hours: hh, minutes: mm, seconds: ss }.delete_if { |_k, v| v.zero? } eta.to_a.map { |e| e.reverse.join(' ') }.join(', ') end
Converts status code in status name.
# File lib/transmission/extensions/torrent_prettify.rb, line 46 def status_name ['paused', 'check wait', 'check', 'download wait', 'download', 'seed wait', 'seed', 'isolated'].at(status) end
Converts status code in status symbol.
# File lib/transmission/extensions/torrent_prettify.rb, line 52 def status_symbol ['❚❚', '~', '⟳', '⥥', '⬇', '⥣', '⬆', '✘'].at(status) end