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