Class: Budik::Storage

Inherits:
Object
  • Object
show all
Includes:
Singleton
Defined in:
lib/budik/storage.rb

Overview

‘Storage’ class downloads and manages media sources/items.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeStorage

Loads sources, download directory and download method.



16
17
18
19
20
21
# File 'lib/budik/storage.rb', line 16

def initialize
  @sources = Sources.instance.sources
  dir = Config.instance.options['sources']['download']['dir']
  @dir = File.expand_path(dir) + '/'
  @method = Config.instance.options['sources']['download']['method']
end

Instance Attribute Details

#dirObject

Gets sources, download directory and download method.



24
25
26
# File 'lib/budik/storage.rb', line 24

def dir
  @dir
end

#methodObject

Gets sources, download directory and download method.



24
25
26
# File 'lib/budik/storage.rb', line 24

def method
  @method
end

#sourcesObject

Gets sources, download directory and download method.



24
25
26
# File 'lib/budik/storage.rb', line 24

def sources
  @sources
end

Instance Method Details

#download_sources(source = nil) ⇒ Object

Downloads specified source or all sources.

  • Args:

    • source -> Source to download (Hash).



31
32
33
34
35
36
37
38
39
40
# File 'lib/budik/storage.rb', line 31

def download_sources(source = nil)
  if source
    IO.instance.storage_download_info(source)
    source[:path].each do |path|
      download_youtube(YouTubeAddy.extract_video_id(path), path)
    end
  else
    @sources.each { |src| download_sources(src) }
  end
end

#download_youtube(id, address) ⇒ Object

Downloads video from YouTube by ID with specified options.

  • Args:

    • id -> YouTube video ID (String).

    • address -> YouTube video address (String).



48
49
50
51
52
53
54
55
56
57
# File 'lib/budik/storage.rb', line 48

def download_youtube(id, address)
  return unless id && !File.file?(@dir + id + '.mp4')

  # TODO: Update youtube-dl if fail
  # TODO: username + password
  options = { output: @dir + '%(id)s.%(ext)s',
              format: 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4',
              playlist: false }
  YoutubeDL.download '"' + address + '"', options
end

#locate_item(item) ⇒ Object

Gets downloaded item’s location.

  • Args:

    • item -> Item to locate (String).

  • Returns:

    • Path to downloaded file.

    • Unaltered path if streaming or if the item is local.



67
68
69
70
71
# File 'lib/budik/storage.rb', line 67

def locate_item(item)
  return item if @method == 'stream'
  is_url = (item =~ /\A#{URI.regexp(%w(http https))}\z/)
  is_url ? @dir + YouTubeAddy.extract_video_id(item) + '.mp4' : item
end

#remove_sources(source = nil) ⇒ Object

Removes specified source or all sources.

  • Args:

    • source -> Source to remove (Hash).



78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/budik/storage.rb', line 78

def remove_sources(source = nil)
  return unless @method == 'remove'

  if source
    source[:path].each do |path|
      next if locate_item(path) == path
      FileUtils.rm File.expand_path(locate_item(path)), force: true
    end
  else
    @sources.each { |src| remove_sources(src) }
  end
end