Class: Raindrops::Download

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
app/models/raindrops/download.rb

Overview

Modèle identifiant un téléchargement planifié, en cours ou terminé.

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#verboseObject

Returns the value of attribute verbose


14
15
16
# File 'app/models/raindrops/download.rb', line 14

def verbose
  @verbose
end

Instance Method Details

#bytes_downloadedInteger

Retourne le nombre d'octets téléchargés du fichier.

Returns:

  • (Integer)

19
20
21
# File 'app/models/raindrops/download.rb', line 19

def bytes_downloaded
  File.exist?(destination_path) ? File.size(destination_path) : 0
end

#progressInteger

Retourne le pourcentage actuel de progression de téléchargement du fichier.

Returns:

  • (Integer)

26
27
28
# File 'app/models/raindrops/download.rb', line 26

def progress
  (bytes_downloaded.to_f / file_size.to_f * 100).round 2
end

#startObject

Démarre le téléchargement.


31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'app/models/raindrops/download.rb', line 31

def start
  require 'net/http'

  # Requête de base de récupération du fichier
  begin
    Net::HTTP.new(source_uri.host, source_uri.port).request_get(source_uri.path) do |response|
      puts "File found @#{source_uri}." if verbose

      # Tentative d'ouverture du fichier de destination en vue d'ecrire les chunks reçus
      file = open_destination_file
      break unless file

      get_and_update_file_size response

      self.update_attributes! status: Raindrops::Download.statuses[:downloading]
      puts 'Starting download' if verbose

      # Récupération des données du fichier par chunks
      response.read_body do |chunk|
        file.write chunk
      end

      self.update_attributes! status: Raindrops::Download.statuses[:completed]
      close_destination_file file
    end
  rescue => e
    self.update_attributes! status: Raindrops::Download.statuses[:error_downloading_source_file],
                            error_content: e.message
  end
end