class TivoHMO::Adapters::Plex::Category

Attributes

category_type[RW]
category_value[RW]
delegate[R]

Public Class Methods

new(delegate, category_type, category_value=nil, presorted=false) click to toggle source
Calls superclass method TivoHMO::API::Container::new
# File lib/tivohmo/adapters/plex/category.rb, line 20
def initialize(delegate, category_type, category_value=nil, presorted=false)
  # delegate is a Plex::Section
  @delegate = delegate

  super(delegate.key)
  self.presorted = presorted

  self.category_type = category_type
  self.category_value = category_value

  if category_value
    self.title = category_value[:title]
  else
    self.title = category_type.to_s.titleize
  end

  self.modified_at = Time.at(delegate.updated_at.to_i)
  self.created_at = Time.now
  @subtitles = config_get(:enable_subtitles)
end

Public Instance Methods

add_grouped(item_class, item_delegate) click to toggle source
# File lib/tivohmo/adapters/plex/category.rb, line 89
def add_grouped(item_class, item_delegate)
  primary = item_class.new(item_delegate)

  if config_get(:enable_subtitles)
    subs = find_subtitles(item_delegate)

    if subs.size > 0
      group = Group.new(primary.identifier, primary.title)
      add_child(group)
      group.add_child(primary)
      subs.each {|s| group.add_child(item_class.new(item_delegate, s)) }
    else
      add_child(primary)
    end
  else
    add_child(primary)
  end
end
child_count() click to toggle source
# File lib/tivohmo/adapters/plex/category.rb, line 43
def child_count
  super_children.size
end
children() click to toggle source
Calls superclass method
# File lib/tivohmo/adapters/plex/category.rb, line 47
def children
  synchronize do

    # updated_at doesn't get updated for automatic updates, only
    # for updating from within plex media server web ui
    section_id = delegate.key.split('/').last
    new_delegate = delegate.library.section!(section_id)
    new_modified_at = new_delegate.updated_at.to_i
    if new_modified_at > modified_at.to_i
      logger.info "Plex section was updated, refreshing"
      @delegate = new_delegate
      self.modified_at = Time.at(new_modified_at)
      super.clear
    end

    if super.blank? || @subtitles != config_get(:enable_subtitles)
      super.clear
      @subtitles = config_get(:enable_subtitles)

      if category_value
        listing = delegate.send(category_type, category_value[:key])
      else
        listing = delegate.send(category_type)
      end

      Array(listing).each do |media|
        if media.is_a?(::Plex::Movie)
          add_grouped(Movie, media)
        elsif media.is_a?(::Plex::Episode)
          add_grouped(Episode, media)
        elsif media.is_a?(::Plex::Show)
          add_child(Show.new(media))
        else
          logger.error "Unknown type for #{media.class} in #{self.title}"
        end
      end
    end
  end

  super
end
Also aliased as: super_children
find_subtitles(item_delegate) click to toggle source
# File lib/tivohmo/adapters/plex/category.rb, line 108
def find_subtitles(item_delegate)
  subs = []

  source_filename = CGI.unescape(item_delegate.medias.first.parts.first.file)

  # add in the file based subtitles
  subs.concat(SubtitlesUtil.instance.subtitles_for_media_file(source_filename))

  # add in the embedded subtitles
  item_delegate.medias.each do |media|
    media.parts.each do |part|
      prev_stream_count = 0
      part.streams.each do |stream|

        # stream.stream_type 3=subs, 1=video, 2=audio
        # stream.key.present? means file based srt
        # stream.index and no key, means embedded
        if stream.stream_type.to_i == 3
          if stream.respond_to?(:index) && stream.index.present?
            st = TivoHMO::API::Subtitle.new

            lang_code = stream.respond_to?(:language_code) && stream.language_code || "??"
            st.language_code = lang_code

            iso_entry = ISO_639.find_by_code(lang_code.downcase)
            if iso_entry
              st.language = iso_entry.english_name
            else
              logger.warn "Subtitle stream has unknown language code: #{lang_code}"
              st.language = "Unknown"
            end

            st.format = stream.codec
            st.type = :embedded
            # subtitle index should be the index amongst just the embedded subtitle streams
            st.location = stream.index.to_i - prev_stream_count
            subs << st
          end
        end

        prev_stream_count += 1
      end
    end
  end

  subs
end
super_children()
Alias for: children