class AppleTvConverter::Media

Attributes

episode_number_padding[RW]
episode_title[RW]
first_air_date[RW]
imdb_episode_id[RW]
imdb_id[RW]
imdb_movie[RW]
last_number[RW]
network[RW]
number[RW]
original_filename[R]
release_date[RW]
season[RW]
show[RW]
tmdb_id[RW]
tvdb_episode_id[RW]
tvdb_id[RW]
tvdb_movie[RW]
tvdb_season_id[RW]
use_absolute_episode_numbering[RW]

Public Class Methods

ignored_extensions() click to toggle source
# File lib/apple_tv_converter/media.rb, line 13
def self.ignored_extensions ; ['nfo', 'jpg', 'png', 'bmp', 'sfv', 'imdb'] ; end
subtitle_extensions() click to toggle source
# File lib/apple_tv_converter/media.rb, line 11
def self.subtitle_extensions ; ['srt', 'sub', 'ssa', 'ass'] ; end

Public Instance Methods

artwork_filename() click to toggle source
# File lib/apple_tv_converter/media.rb, line 27
def artwork_filename ; @artwork_filename ||= self.original_filename.gsub(File.extname(self.original_filename), '.jpg') ; end
audio_streams() click to toggle source
# File lib/apple_tv_converter/media.rb, line 106
def audio_streams ; streams :audio ; end
backup!() click to toggle source
# File lib/apple_tv_converter/media.rb, line 91
def backup! ; FileUtils.cp original_filename, backup_filename ; end
backup_filename() click to toggle source
# File lib/apple_tv_converter/media.rb, line 61
def backup_filename ; @backup_filename ||= "#{self.original_filename}.backup" ; end
base_location() click to toggle source
# File lib/apple_tv_converter/media.rb, line 35
def base_location
  unless @base_location
    @base_location = File.dirname(original_filename)
    @base_location = File.dirname(@base_location) if File.basename(@base_location) =~ /^season \d+$/i
  end
  @base_location
end
converted_filename() click to toggle source
# File lib/apple_tv_converter/media.rb, line 31
def converted_filename ; @converted_filename ||= self.original_filename.gsub(File.extname(self.original_filename), '.mp4') ; end
converted_filename=(value) click to toggle source
# File lib/apple_tv_converter/media.rb, line 33
def converted_filename=(value) ; @converted_filename = value ; end
converted_filename_equals_original_filename?() click to toggle source
# File lib/apple_tv_converter/media.rb, line 25
def converted_filename_equals_original_filename? ; @converted_filename_equals_original_filename || false ; end
converted_filename_with_subtitles() click to toggle source
# File lib/apple_tv_converter/media.rb, line 63
def converted_filename_with_subtitles ; @converted_filename_with_subtitles ||= self.original_filename.gsub(/\.(mkv|avi|m4v)/, '_subtitled.mp4') ;end
data_file() click to toggle source
# File lib/apple_tv_converter/media.rb, line 43
def data_file ; @data_file ||= File.join(base_location, '.apple-tv-converter.data') ; end
ffmpeg_data() click to toggle source
# File lib/apple_tv_converter/media.rb, line 65
def ffmpeg_data ; @ffmpeg_data ||= FFMPEG::Movie.new(original_filename) ; end
genre() click to toggle source
# File lib/apple_tv_converter/media.rb, line 77
def genre ; is_tv_show_episode? ? show : "#{quality} Movies" ; end
get_metadata_id(service, type) click to toggle source
# File lib/apple_tv_converter/media.rb, line 179
def get_metadata_id(service, type)
  @metadata_id ||= {}
  @metadata_id[type.to_sym] ||= {}
  return @metadata_id[type.to_sym][service.to_sym] rescue nil
end
get_new_subtitle_filename(language, subid = nil) click to toggle source
# File lib/apple_tv_converter/media.rb, line 173
def get_new_subtitle_filename(language, subid = nil)
  dir_name = File.dirname(original_filename)
  existing_subtitle_counter = subid.nil? ? Dir[File.join(dir_name, '*.srt')].length : subid
  return File.join(dir_name, File.basename(original_filename).gsub(File.extname(original_filename), ".#{existing_subtitle_counter}.#{language}.srt"))
end
has_data_file?() click to toggle source
# File lib/apple_tv_converter/media.rb, line 44
def has_data_file? ; File.exists?(data_file) ; end
has_embedded_subtitles?(languages = []) click to toggle source
# File lib/apple_tv_converter/media.rb, line 93
def has_embedded_subtitles?(languages = [])
  languages = languages.map { |l| l.downcase.to_sym }
  ffmpeg_data.streams.select { |stream| stream.type == :subtitle && (languages.empty? || languages.include?(stream.language.downcase.to_sym)) }.any?
end
hd?() click to toggle source
# File lib/apple_tv_converter/media.rb, line 132
def hd? ; ['1080p', '720p'].include?(quality) ; end
is_movie?() click to toggle source
# File lib/apple_tv_converter/media.rb, line 85
def is_movie? ; !is_tv_show_episode? ; end
is_mp4?() click to toggle source
# File lib/apple_tv_converter/media.rb, line 87
def is_mp4? ; ffmpeg_data.container =~ /mp4/ rescue File.extname(original_filename) =~ /\.(m4v|mp4)$/ ; end
is_tv_show_episode?() click to toggle source
# File lib/apple_tv_converter/media.rb, line 83
def is_tv_show_episode? ; !season.nil? && !number.nil? ; end
is_valid?() click to toggle source
# File lib/apple_tv_converter/media.rb, line 89
def is_valid? ; ffmpeg_data.valid? ; end
metadata() click to toggle source
# File lib/apple_tv_converter/media.rb, line 171
def metadata ; @metadata ||= Metadata::Info.new(self) ; end
movie_file_size() click to toggle source
# File lib/apple_tv_converter/media.rb, line 134
def movie_file_size ; @movie_file_size ||= File.size(original_filename) ; end
movie_hash() click to toggle source
# File lib/apple_tv_converter/media.rb, line 136
def movie_hash ; @movie_hash ||= AppleTvConverter::MovieHasher.compute_hash(original_filename) ; end
movie_height() click to toggle source
# File lib/apple_tv_converter/media.rb, line 146
def movie_height ; @movie_height || 0 ; end
movie_height=(value) click to toggle source
# File lib/apple_tv_converter/media.rb, line 147
def movie_height=(value)
  @movie_height = value
  assert_movie_dimensions!
  check_filename_clashing
  @movie_height
end
movie_width() click to toggle source
# File lib/apple_tv_converter/media.rb, line 138
def movie_width ; @movie_width || 0 ; end
movie_width=(value) click to toggle source
# File lib/apple_tv_converter/media.rb, line 139
def movie_width=(value)
  @movie_width = value
  assert_movie_dimensions!
  check_filename_clashing
  @movie_width
end
name() click to toggle source
# File lib/apple_tv_converter/media.rb, line 81
def name ; %Q[#{show}#{" S#{season.to_s.rjust(2, '0')}E#{number.to_s.rjust(episode_number_padding || 2, '0')}" if is_tv_show_episode?}] ; end
needs_audio_conversion?() click to toggle source
# File lib/apple_tv_converter/media.rb, line 110
def needs_audio_conversion? ; return ffmpeg_data.audio_codec !~ /(?:aac)/i ; end
needs_subtitles_conversion?() click to toggle source
# File lib/apple_tv_converter/media.rb, line 128
def needs_subtitles_conversion? ; return ffmpeg_data.subtitle_streams.any? ; end
needs_transcoding?() click to toggle source
# File lib/apple_tv_converter/media.rb, line 130
def needs_transcoding? ; !(is_valid? && is_mp4? && !needs_video_conversion? && !needs_audio_conversion?) ; end
needs_video_conversion?() click to toggle source
# File lib/apple_tv_converter/media.rb, line 112
def needs_video_conversion?
  return [
    ffmpeg_data.video_codec !~ /(?:.*?h264|^mpeg4).*/i,
    ffmpeg_data.video_codec =~ /.*(?:xvid|divx).*/i,
    ffmpeg_data.video_stream =~ /h264.*?yuv420p10le/i,
    needs_video_resizing?
  ].any?
end
needs_video_resizing?() click to toggle source
# File lib/apple_tv_converter/media.rb, line 121
def needs_video_resizing?
  return [
    movie_width > 0 && movie_width != ffmpeg_data.width,
    movie_height > 0 && movie_height != ffmpeg_data.height
  ].any?
end
original_filename=(value) click to toggle source
# File lib/apple_tv_converter/media.rb, line 15
def original_filename=(value)
  @original_filename = value

  check_filename_clashing

  load_data_file

  @original_filename
end
plex_format_filename() click to toggle source
# File lib/apple_tv_converter/media.rb, line 49
def plex_format_filename
  filename = if is_tv_show_episode?
    %Q[#{show} - s#{season.to_s.rjust(2, '0')}e#{number.to_s.rjust(episode_number_padding || 2, '0')}#{"-e#{last_number.to_s.rjust(episode_number_padding || 2, '0')}" if last_number}#{" - #{episode_title.gsub(/\\|\//, '-').gsub(/\:/, '.').gsub(/&/, '&').strip}" if !episode_title.nil? && !episode_title.blank?}.mp4]
  else
    "#{show} (#{release_date || imdb_movie.year}).mp4"
  end

  File.join(File.dirname(converted_filename), filename)
end
quality() click to toggle source
# File lib/apple_tv_converter/media.rb, line 67
def quality
  if !@quality
    @quality = '1080p' if ffmpeg_data.height == 1080 || ffmpeg_data.width == 1920
    @quality = '720p' if ffmpeg_data.height == 720 || ffmpeg_data.width == 1280
    @quality = 'Xvid' if !@quality
  end

  @quality
end
quality=(value) click to toggle source
# File lib/apple_tv_converter/media.rb, line 79
def quality=(value) ; @quality = value ; end
resulting_filename() click to toggle source
# File lib/apple_tv_converter/media.rb, line 59
def resulting_filename ; File.exists?(plex_format_filename) ? plex_format_filename : converted_filename ; end
set_metadata_id(service, type, id) click to toggle source
# File lib/apple_tv_converter/media.rb, line 185
def set_metadata_id(service, type, id)
  @metadata_id ||= {}
  @metadata_id[type.to_sym] ||= {}
  @metadata_id[type.to_sym].store service.to_sym, id.to_s.gsub(/\D+/, '')
end
set_metadata_id_if_not_set(service, type, id) click to toggle source
# File lib/apple_tv_converter/media.rb, line 191
def set_metadata_id_if_not_set(service, type, id)
  @metadata_id ||= {}
  @metadata_id[type.to_sym] ||= {}
  @metadata_id[type.to_sym].store(service.to_sym, id.to_s.gsub(/\D+/, '')) unless @metadata_id[type.to_sym].has_key?(service.to_sym)
end
streams(type = nil) click to toggle source
# File lib/apple_tv_converter/media.rb, line 98
def streams(type = nil)
  @streams ||= ffmpeg_data.streams
  return @streams.select { |stream| stream.type == type } if type
  return @streams
end
subtitle_filename() click to toggle source
# File lib/apple_tv_converter/media.rb, line 29
def subtitle_filename ; @subtitle_filename ||= self.original_filename.gsub(File.extname(self.original_filename), '.srt') ; end
subtitle_streams() click to toggle source
# File lib/apple_tv_converter/media.rb, line 108
def subtitle_streams ; streams :subtitle ; end
tvdb_episode_number() click to toggle source
# File lib/apple_tv_converter/media.rb, line 47
def tvdb_episode_number ; @tvdb_episode_number ||= media.tvdb_movie_data(@use_absolute_episode_numbering ? 'absolute_number' : 'EpisodeNumber') rescue nil ; end
tvdb_movie_data(key, default = nil) click to toggle source
# File lib/apple_tv_converter/media.rb, line 154
def tvdb_movie_data(key, default = nil) ;
  return tvdb_movie[:episode][key].gsub(/`/, '') if tvdb_movie && tvdb_movie.has_key?(:episode) && tvdb_movie[:episode].has_key?(key) && !tvdb_movie[:episode][key].blank? rescue default
  return default
end
tvdb_movie_poster() click to toggle source
# File lib/apple_tv_converter/media.rb, line 159
def tvdb_movie_poster
  local_file = AppleTvConverter::Metadata::TvDb.get_poster(self)

  unless File.exists?(local_file)
    artwork_filename = imdb_movie.poster if imdb_movie && imdb_movie.poster

    AppleTvConverter.copy artwork_filename, local_file unless artwork_filename.blank?
  end

  local_file
end
tvdb_season_number() click to toggle source
# File lib/apple_tv_converter/media.rb, line 46
def tvdb_season_number ; @tvdb_season_number ||= media.tvdb_movie_data(@use_absolute_episode_numbering ? '1' : 'SeasonNumber') rescue nil ; end
update_data_file!() click to toggle source
# File lib/apple_tv_converter/media.rb, line 197
def update_data_file!
  data = has_data_file? ? YAML.load_file(data_file) : {}

  data.delete :tvdb_id
  data.delete :imdb_id
  data.delete :tmdb_id
  data[:episode_number_padding] = self.episode_number_padding if self.episode_number_padding
  data[:use_absolute_episode_numbering] = self.use_absolute_episode_numbering if self.use_absolute_episode_numbering
  data[:metadata_id] = @metadata_id

  if self.is_tv_show_episode?
    episode_data = {}
    episode_data[:tvdb_episode_id] = self.tvdb_episode_id if self.tvdb_episode_id
    episode_data[:tvdb_season_id] = self.tvdb_season_id if self.tvdb_season_id
    episode_data[:imdb_episode_id] = self.imdb_episode_id if self.imdb_episode_id

    data[:episodes] ||= {}
    data[:episodes][:"s#{self.season}e#{self.number}"] = episode_data
  end

  File.open(self.data_file, 'w') do |f|
    f.write data.to_yaml
  end
end
video_streams() click to toggle source
# File lib/apple_tv_converter/media.rb, line 104
def video_streams ; streams :video ; end

Private Instance Methods

assert_movie_dimensions!() click to toggle source
# File lib/apple_tv_converter/media.rb, line 246
def assert_movie_dimensions!
  if movie_width > 0 && movie_height <= 0
    @movie_height = ffmpeg_data.height.to_f * (movie_width.to_f / ffmpeg_data.width.to_f)
    @movie_height -= @movie_height % 2
    @movie_height = @movie_height.to_i
  elsif movie_width <= 0 && movie_height > 0
    @movie_width = ffmpeg_data.width.to_f * (movie_height.to_f / ffmpeg_data.height.to_f)
    @movie_width -= movie_width % 2
    @movie_width = @movie_width.to_i
  end
end
check_filename_clashing() click to toggle source
# File lib/apple_tv_converter/media.rb, line 258
def check_filename_clashing
  if @original_filename =~ /.*?\.mp4$/
    Dir[@original_filename.gsub(File.extname(@original_filename), '*')].each do |file|
      if @original_filename != file && !(Media.subtitle_extensions + Media.ignored_extensions).include?(file.downcase.gsub(/.*\./, ''))
        @original_filename = file
        break
      end
    end
  end

  if converted_filename == original_filename && needs_transcoding?
    @converted_filename = original_filename.gsub(File.extname(original_filename), "_2#{File.extname(original_filename)}")
    @converted_filename_equals_original_filename = true
  end
end
load_data_file() click to toggle source
# File lib/apple_tv_converter/media.rb, line 224
def load_data_file
  begin
    if has_data_file?
      data = YAML.load_file(data_file)
      self.tvdb_id ||= data[:tvdb_id] if !self.tvdb_id && data.has_key?(:tvdb_id)
      self.imdb_id ||= data[:imdb_id] if !self.imdb_id && data.has_key?(:imdb_id)
      self.tmdb_id ||= data[:tmdb_id] if !self.tmdb_id && data.has_key?(:tmdb_id)
      @episode_number_padding = data[:episode_number_padding] if !@episode_number_padding && data.has_key?(:episode_number_padding)
      @use_absolute_episode_numbering = data[:use_absolute_episode_numbering] if !@use_absolute_episode_numbering && data.has_key?(:use_absolute_episode_numbering)

      @metadata_id = data[:metadata_id] if data.has_key?(:metadata_id)
    end

    @metadata_id ||= { :show => {} }
    @metadata_id[:show][:imdb] ||= self.imdb_id
    @metadata_id[:show][:tvdb] ||= self.tvdb_id
    @metadata_id[:show][:tmdb] ||= self.tmdb_id
  rescue => e
    ap ['e', e]
  end
end