module AWS
module S3
# Objects on S3 can be distributed via the BitTorrent file sharing protocol.
#
# You can get a torrent file for an object by calling torrent_for:
#
# S3Object.torrent_for 'kiss.jpg', 'marcel'
#
# Or just call the torrent method if you already have the object:
#
# song = S3Object.find 'kiss.jpg', 'marcel'
# song.torrent
#
# Calling grant_torrent_access_to on a object will allow anyone to anonymously
# fetch the torrent file for that object:
#
# S3Object.grant_torrent_access_to 'kiss.jpg', 'marcel'
#
# Anonymous requests to
#
# http://s3.amazonaws.com/marcel/kiss.jpg?torrent
#
# will serve up the torrent file for that object.
module BitTorrent
def self.included(klass) #:nodoc:
klass.extend ClassMethods
end
# Adds methods to S3Object for accessing the torrent of a given object.
module ClassMethods
# Returns the torrent file for the object with the given key.
def torrent_for(key, bucket = nil)
get(path!(bucket, key) << '?torrent').body
end
alias_method :torrent, :torrent_for
# Grants access to the object with the given key to be accessible as a torrent.
def grant_torrent_access_to(key, bucket = nil)
policy = acl(key, bucket)
return true if policy.grants.include?(:public_read)
policy.grants << ACL::Grant.grant(:public_read)
acl(key, bucket, policy)
end
alias_method :grant_torrent_access, :grant_torrent_access_to
end
# Returns the torrent file for the object.
def torrent
self.class.torrent_for(key, bucket.name)
end
# Grants torrent access publicly to anyone who requests it on this object.
def grant_torrent_access
self.class.grant_torrent_access_to(key, bucket.name)
end
end
end
end