class P3::TV::Settings

Constants

DEFAULTS
DEFAULT_PATH
EPISODES_JSON

Attributes

path[RW]

Public Class Methods

create_default!( path = DEFAULT_PATH ) click to toggle source
# File lib/p3-tv.rb, line 33
def self.create_default!( path = DEFAULT_PATH )
    raise "a settings file already exists. please delete #{path} first" if exists?( path )

    FileUtils::mkdir_p( File::dirname( path ) )
    settings = Settings.new( path )
    DEFAULTS.each do | key, value |
        settings[ key ] = value
    end
    settings.save!
end
exists?( path = DEFAULT_PATH ) click to toggle source
# File lib/p3-tv.rb, line 29
def self.exists?( path = DEFAULT_PATH )
    return File::exists?( path )
end
new( path = DEFAULT_PATH ) click to toggle source
# File lib/p3-tv.rb, line 50
def initialize( path = DEFAULT_PATH )
    @path = path
    @values = {}
    @episodes = {}
    return unless File::exists?( @path )

    FileUtils::mkdir_p( File::dirname( @path ) )

    f = File::open( @path, 'r' )
    @values = JSON::parse( f.read, :symbolize_names => true )
    f.close

    self[:library_path] = File::expand_path( self[:library_path ] )
    FileUtils::mkdir_p( self[:library_path] )

    self[:download_path] = File::expand_path( self[:download_path ] )
    self[:series].uniq!

    if( self[:overwrite_duplicates] and self[:delete_duplicate_downloads] )
        raise "you cannot have 'overwrite_duplicates' and 'delete_duplicate_downloads' both set to true"
    end

end
set!( key, value, path = DEFAULT_PATH ) click to toggle source
# File lib/p3-tv.rb, line 44
def self.set!( key, value, path = DEFAULT_PATH )
    settings = Settings.new( path )
    settings[ key ] = value
    settings.save!
end

Public Instance Methods

[]( key ) click to toggle source
# File lib/p3-tv.rb, line 78
def []( key )
    return @values[ key.to_sym ]
end
[]=( key, value ) click to toggle source
# File lib/p3-tv.rb, line 82
def []=( key, value )
    @values[ key.to_sym ] = value
    self.save!
end
add_series!( series ) click to toggle source
# File lib/p3-tv.rb, line 193
def add_series!( series )
    meta_path = series_dir( series.id )

    hash = series.to_h
    hash[:banners] = {}
    hash[:banners][:poster] = download_banners!( series.posters( self[:language] ),  File::join( meta_path, 'poster.jpg' ) )
    hash[:banners][:banner] = download_banners!( series.series_banners( self[:language] ),  File::join( meta_path, 'banner.jpg' ) )

    download_episodes!( series )

    remove_series!( hash[:id] )
    self[:series] << hash
    leading_the = /^The /
    self[:series].sort!{|a,b| a[:name].gsub(leading_the,'') <=> b[:name].gsub(leading_the,'') }
    self.save!
end
allowed_type?( path ) click to toggle source
# File lib/p3-tv.rb, line 87
def allowed_type?( path )
    return ( self[:allowed_types].include?( File::extname( path ) ) or self[:subtitles].include?( File::extname( path ) ) )
end
download_banners!( banners, path ) click to toggle source
# File lib/p3-tv.rb, line 107
def download_banners!( banners, path )
    FileUtils::mkdir_p( File::dirname( path ) )
    return if banners.empty?
    banner = banners.detect{|b| b.url.length }
    return "" unless banner

    return download_url!( banner.url, path )
end
download_episodes!( series ) click to toggle source
# File lib/p3-tv.rb, line 178
def download_episodes!( series )
    meta_path = series_dir( series.id )
    episodes = []
    series.episodes.each do |episode|
        episode_hash = episode.to_h
        episode_hash[:thumb_path] = download_url!( episode_hash[:thumb], File::join( meta_path, "#{episode.id}.jpg" ) )
        episodes << episode_hash
    end
    f = File::open( File::join( meta_path, EPISODES_JSON ), 'w' )
    f.puts JSON::pretty_generate( episodes )
    f.close()

    @episodes.delete( series.id ) #clear the cache
end
download_url!( url, path ) click to toggle source
# File lib/p3-tv.rb, line 95
def download_url!( url, path )
    # http://stackoverflow.com/questions/2515931/how-can-i-download-a-file-from-a-url-and-save-it-in-rails
    return path if File::exists?( path )
    begin
        download = open( url )
        IO.copy_stream( download, path )
    rescue => e
        return ""
    end
    return path
end
each_series_episode_file_status( seriesid, search, downloads, library ) { |ep_file| ... } click to toggle source
# File lib/p3-tv.rb, line 127
def each_series_episode_file_status( seriesid, search, downloads, library )
    today = Date::today.to_s

    series_hash = self[:series].detect{|s| s[:id] == seriesid}
    return unless series_hash

    episodes( seriesid ).each do | episode_hash |
        next if episode_hash[:season_number] == 0
        ep_file = P3::TV::EpisodeFile.new
        ep_file.series_id = episode_hash[:id]
        ep_file.series = series_hash[:name]
        ep_file.season = episode_hash[:season_number]
        ep_file.episode = episode_hash[:number]
        ep_file.title = episode_hash[:name]
        ep_file.air_date = episode_hash[:air_date]
        ep_file.thumbnail = episode_hash[:thumb_path]

        if( ( ep_file.air_date == nil ) or ( ep_file.air_date > today ) )
            ep_file.percent_done = 0
            ep_file.status = :upcoming
            ep_file.path = ''
        elsif( library.exists?( ep_file ) )
            ep_file.percent_done = 1
            ep_file.status = :cataloged
            ep_file.path = library.episode_path( ep_file )
        elsif( download_path = downloads.get_path_if_exists( ep_file ) )
            ep_file.percent_done = 1
            ep_file.status = :downloaded
            ep_file.path = download_path
        elsif( torrent = downloads.get_torrent_if_exists( ep_file ) )
            ep_file.percent_done = torrent['percentDone']
            ep_file.status = :downloading
            ep_file.path = ''
        elsif( magnet_link = search.get_magnet_link_if_exists( ep_file ) )
            ep_file.percent_done = 0
            ep_file.status = :available
            ep_file.path = magnet_link
        else
            ep_file.percent_done = 0
            ep_file.status = :missing
            ep_file.path = ''
        end
        yield( ep_file )
    end
end
episodes( seriesid ) click to toggle source
# File lib/p3-tv.rb, line 116
def episodes( seriesid )
    unless @episodes.has_key?( seriesid )
        episode_file = File::join( series_dir( seriesid ), EPISODES_JSON )
        if( File::exists?( episode_file ) )
            f = File::open( episode_file )
            @episodes[ seriesid ] = JSON::parse( f.read, :symbolize_names => true )
        end
    end
    return @episodes[ seriesid ]
end
get_series( seriesid ) click to toggle source
# File lib/p3-tv.rb, line 91
def get_series( seriesid )
    return self[:series].detect{|s| s[:id] == seriesid }
end
remove_series!( seriesid ) click to toggle source
# File lib/p3-tv.rb, line 225
def remove_series!( seriesid )
    self[:series].reject!{|s| s[:id] == seriesid }
    self.save!
end
save!() click to toggle source
# File lib/p3-tv.rb, line 230
def save!
    f = File::open( @path, 'w' )
    f.puts( JSON::pretty_generate( @values ) )
    f.close
end
series_dir( seriesid ) click to toggle source
# File lib/p3-tv.rb, line 174
def series_dir( seriesid )
    return File::join( File::dirname( @path ), 'series', seriesid )
end
to_h() click to toggle source
# File lib/p3-tv.rb, line 74
def to_h
    return @values
end
update_series!( series ) click to toggle source
# File lib/p3-tv.rb, line 210
def update_series!( series )
    return unless series.status == "Continuing"

    ep = self.episodes( series.id )
    return unless( ep )

    ep.select!{|e| e[:air_date] }
    ep.sort!{|a,b| b[:air_date] <=> a[:air_date] } #newest episode first

    today = Date::today.to_s
    if( ep.empty? or ( ep[0][:air_date] < today ) )
        download_episodes!( series )
    end
end