Class: AppleTvConverter::Media
- Inherits:
-
Object
- Object
- AppleTvConverter::Media
- Defined in:
- lib/apple_tv_converter/media.rb
Instance Attribute Summary collapse
-
#episode_number_padding ⇒ Object
Returns the value of attribute episode_number_padding.
-
#episode_title ⇒ Object
Returns the value of attribute episode_title.
-
#first_air_date ⇒ Object
Returns the value of attribute first_air_date.
-
#imdb_episode_id ⇒ Object
Returns the value of attribute imdb_episode_id.
-
#imdb_id ⇒ Object
Returns the value of attribute imdb_id.
-
#imdb_movie ⇒ Object
Returns the value of attribute imdb_movie.
-
#last_number ⇒ Object
Returns the value of attribute last_number.
-
#network ⇒ Object
Returns the value of attribute network.
-
#number ⇒ Object
Returns the value of attribute number.
-
#original_filename ⇒ Object
Returns the value of attribute original_filename.
-
#release_date ⇒ Object
Returns the value of attribute release_date.
-
#season ⇒ Object
Returns the value of attribute season.
-
#show ⇒ Object
Returns the value of attribute show.
-
#tmdb_id ⇒ Object
Returns the value of attribute tmdb_id.
-
#tvdb_episode_id ⇒ Object
Returns the value of attribute tvdb_episode_id.
-
#tvdb_id ⇒ Object
Returns the value of attribute tvdb_id.
-
#tvdb_movie ⇒ Object
Returns the value of attribute tvdb_movie.
-
#tvdb_season_id ⇒ Object
Returns the value of attribute tvdb_season_id.
-
#use_absolute_episode_numbering ⇒ Object
Returns the value of attribute use_absolute_episode_numbering.
Class Method Summary collapse
Instance Method Summary collapse
- #artwork_filename ⇒ Object
- #audio_streams ⇒ Object
- #backup! ⇒ Object
- #backup_filename ⇒ Object
- #base_location ⇒ Object
- #converted_filename ⇒ Object
- #converted_filename=(value) ⇒ Object
- #converted_filename_equals_original_filename? ⇒ Boolean
- #converted_filename_with_subtitles ⇒ Object
- #data_file ⇒ Object
- #ffmpeg_data ⇒ Object
- #genre ⇒ Object
- #get_metadata_id(service, type) ⇒ Object
- #get_new_subtitle_filename(language, subid = nil) ⇒ Object
- #has_data_file? ⇒ Boolean
- #has_embedded_subtitles?(languages = []) ⇒ Boolean
- #hd? ⇒ Boolean
- #is_movie? ⇒ Boolean
- #is_mp4? ⇒ Boolean
- #is_tv_show_episode? ⇒ Boolean
- #is_valid? ⇒ Boolean
- #metadata ⇒ Object
- #movie_file_size ⇒ Object
- #movie_hash ⇒ Object
- #movie_height ⇒ Object
- #movie_height=(value) ⇒ Object
- #movie_width ⇒ Object
- #movie_width=(value) ⇒ Object
- #name ⇒ Object
- #needs_audio_conversion? ⇒ Boolean
- #needs_subtitles_conversion? ⇒ Boolean
- #needs_transcoding? ⇒ Boolean
- #needs_video_conversion? ⇒ Boolean
- #needs_video_resizing? ⇒ Boolean
- #plex_format_filename ⇒ Object
- #quality ⇒ Object
- #quality=(value) ⇒ Object
- #resulting_filename ⇒ Object
- #set_metadata_id(service, type, id) ⇒ Object
- #set_metadata_id_if_not_set(service, type, id) ⇒ Object
- #streams(type = nil) ⇒ Object
- #subtitle_filename ⇒ Object
- #subtitle_streams ⇒ Object
- #tvdb_episode_number ⇒ Object
- #tvdb_movie_data(key, default = nil) ⇒ Object
- #tvdb_movie_poster ⇒ Object
- #tvdb_season_number ⇒ Object
- #update_data_file! ⇒ Object
- #video_streams ⇒ Object
Instance Attribute Details
#episode_number_padding ⇒ Object
Returns the value of attribute episode_number_padding.
7 8 9 |
# File 'lib/apple_tv_converter/media.rb', line 7 def episode_number_padding @episode_number_padding end |
#episode_title ⇒ Object
Returns the value of attribute episode_title.
6 7 8 |
# File 'lib/apple_tv_converter/media.rb', line 6 def episode_title @episode_title end |
#first_air_date ⇒ Object
Returns the value of attribute first_air_date.
6 7 8 |
# File 'lib/apple_tv_converter/media.rb', line 6 def first_air_date @first_air_date end |
#imdb_episode_id ⇒ Object
Returns the value of attribute imdb_episode_id.
4 5 6 |
# File 'lib/apple_tv_converter/media.rb', line 4 def imdb_episode_id @imdb_episode_id end |
#imdb_id ⇒ Object
Returns the value of attribute imdb_id.
4 5 6 |
# File 'lib/apple_tv_converter/media.rb', line 4 def imdb_id @imdb_id end |
#imdb_movie ⇒ Object
Returns the value of attribute imdb_movie.
4 5 6 |
# File 'lib/apple_tv_converter/media.rb', line 4 def imdb_movie @imdb_movie end |
#last_number ⇒ Object
Returns the value of attribute last_number.
3 4 5 |
# File 'lib/apple_tv_converter/media.rb', line 3 def last_number @last_number end |
#network ⇒ Object
Returns the value of attribute network.
6 7 8 |
# File 'lib/apple_tv_converter/media.rb', line 6 def network @network end |
#number ⇒ Object
Returns the value of attribute number.
3 4 5 |
# File 'lib/apple_tv_converter/media.rb', line 3 def number @number end |
#original_filename ⇒ Object
Returns the value of attribute original_filename.
9 10 11 |
# File 'lib/apple_tv_converter/media.rb', line 9 def original_filename @original_filename end |
#release_date ⇒ Object
Returns the value of attribute release_date.
6 7 8 |
# File 'lib/apple_tv_converter/media.rb', line 6 def release_date @release_date end |
#season ⇒ Object
Returns the value of attribute season.
3 4 5 |
# File 'lib/apple_tv_converter/media.rb', line 3 def season @season end |
#show ⇒ Object
Returns the value of attribute show.
3 4 5 |
# File 'lib/apple_tv_converter/media.rb', line 3 def show @show end |
#tmdb_id ⇒ Object
Returns the value of attribute tmdb_id.
8 9 10 |
# File 'lib/apple_tv_converter/media.rb', line 8 def tmdb_id @tmdb_id end |
#tvdb_episode_id ⇒ Object
Returns the value of attribute tvdb_episode_id.
6 7 8 |
# File 'lib/apple_tv_converter/media.rb', line 6 def tvdb_episode_id @tvdb_episode_id end |
#tvdb_id ⇒ Object
Returns the value of attribute tvdb_id.
6 7 8 |
# File 'lib/apple_tv_converter/media.rb', line 6 def tvdb_id @tvdb_id end |
#tvdb_movie ⇒ Object
Returns the value of attribute tvdb_movie.
5 6 7 |
# File 'lib/apple_tv_converter/media.rb', line 5 def tvdb_movie @tvdb_movie end |
#tvdb_season_id ⇒ Object
Returns the value of attribute tvdb_season_id.
6 7 8 |
# File 'lib/apple_tv_converter/media.rb', line 6 def tvdb_season_id @tvdb_season_id end |
#use_absolute_episode_numbering ⇒ Object
Returns the value of attribute use_absolute_episode_numbering.
7 8 9 |
# File 'lib/apple_tv_converter/media.rb', line 7 def use_absolute_episode_numbering @use_absolute_episode_numbering end |
Class Method Details
.ignored_extensions ⇒ Object
13 |
# File 'lib/apple_tv_converter/media.rb', line 13 def self.ignored_extensions ; ['nfo', 'jpg', 'png', 'bmp', 'sfv', 'imdb'] ; end |
.subtitle_extensions ⇒ Object
11 |
# File 'lib/apple_tv_converter/media.rb', line 11 def self.subtitle_extensions ; ['srt', 'sub', 'ssa', 'ass'] ; end |
Instance Method Details
#artwork_filename ⇒ Object
27 |
# 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 ⇒ Object
106 |
# File 'lib/apple_tv_converter/media.rb', line 106 def audio_streams ; streams :audio ; end |
#backup! ⇒ Object
91 |
# File 'lib/apple_tv_converter/media.rb', line 91 def backup! ; FileUtils.cp original_filename, backup_filename ; end |
#backup_filename ⇒ Object
61 |
# File 'lib/apple_tv_converter/media.rb', line 61 def backup_filename ; @backup_filename ||= "#{self.original_filename}.backup" ; end |
#base_location ⇒ Object
35 36 37 38 39 40 41 |
# 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 ⇒ Object
31 |
# 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) ⇒ Object
33 |
# File 'lib/apple_tv_converter/media.rb', line 33 def converted_filename=(value) ; @converted_filename = value ; end |
#converted_filename_equals_original_filename? ⇒ Boolean
25 |
# 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 ⇒ Object
63 |
# 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 ⇒ Object
43 |
# 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 ⇒ Object
65 |
# File 'lib/apple_tv_converter/media.rb', line 65 def ffmpeg_data ; @ffmpeg_data ||= FFMPEG::Movie.new(original_filename) ; end |
#genre ⇒ Object
77 |
# File 'lib/apple_tv_converter/media.rb', line 77 def genre ; is_tv_show_episode? ? show : "#{quality} Movies" ; end |
#get_metadata_id(service, type) ⇒ Object
179 180 181 182 183 |
# File 'lib/apple_tv_converter/media.rb', line 179 def (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) ⇒ Object
173 174 175 176 177 |
# 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? ⇒ Boolean
44 |
# File 'lib/apple_tv_converter/media.rb', line 44 def has_data_file? ; File.exists?(data_file) ; end |
#has_embedded_subtitles?(languages = []) ⇒ Boolean
93 94 95 96 |
# File 'lib/apple_tv_converter/media.rb', line 93 def (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? ⇒ Boolean
132 |
# File 'lib/apple_tv_converter/media.rb', line 132 def hd? ; ['1080p', '720p'].include?(quality) ; end |
#is_movie? ⇒ Boolean
85 |
# File 'lib/apple_tv_converter/media.rb', line 85 def is_movie? ; !is_tv_show_episode? ; end |
#is_mp4? ⇒ Boolean
87 |
# 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? ⇒ Boolean
83 |
# File 'lib/apple_tv_converter/media.rb', line 83 def is_tv_show_episode? ; !season.nil? && !number.nil? ; end |
#is_valid? ⇒ Boolean
89 |
# File 'lib/apple_tv_converter/media.rb', line 89 def is_valid? ; ffmpeg_data.valid? ; end |
#metadata ⇒ Object
171 |
# File 'lib/apple_tv_converter/media.rb', line 171 def ; @metadata ||= Metadata::Info.new(self) ; end |
#movie_file_size ⇒ Object
134 |
# File 'lib/apple_tv_converter/media.rb', line 134 def movie_file_size ; @movie_file_size ||= File.size(original_filename) ; end |
#movie_hash ⇒ Object
136 |
# File 'lib/apple_tv_converter/media.rb', line 136 def movie_hash ; @movie_hash ||= AppleTvConverter::MovieHasher.compute_hash(original_filename) ; end |
#movie_height ⇒ Object
146 |
# File 'lib/apple_tv_converter/media.rb', line 146 def movie_height ; @movie_height || 0 ; end |
#movie_height=(value) ⇒ Object
147 148 149 150 151 152 |
# 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 ⇒ Object
138 |
# File 'lib/apple_tv_converter/media.rb', line 138 def movie_width ; @movie_width || 0 ; end |
#movie_width=(value) ⇒ Object
139 140 141 142 143 144 |
# 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 ⇒ Object
81 |
# 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? ⇒ Boolean
110 |
# File 'lib/apple_tv_converter/media.rb', line 110 def needs_audio_conversion? ; return ffmpeg_data.audio_codec !~ /(?:aac)/i ; end |
#needs_subtitles_conversion? ⇒ Boolean
128 |
# File 'lib/apple_tv_converter/media.rb', line 128 def needs_subtitles_conversion? ; return ffmpeg_data.subtitle_streams.any? ; end |
#needs_transcoding? ⇒ Boolean
130 |
# 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? ⇒ Boolean
112 113 114 115 116 117 118 119 |
# 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? ⇒ Boolean
121 122 123 124 125 126 |
# 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 |
#plex_format_filename ⇒ Object
49 50 51 52 53 54 55 56 57 |
# 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 ⇒ Object
67 68 69 70 71 72 73 74 75 |
# 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) ⇒ Object
79 |
# File 'lib/apple_tv_converter/media.rb', line 79 def quality=(value) ; @quality = value ; end |
#resulting_filename ⇒ Object
59 |
# 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) ⇒ Object
185 186 187 188 189 |
# File 'lib/apple_tv_converter/media.rb', line 185 def (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) ⇒ Object
191 192 193 194 195 |
# File 'lib/apple_tv_converter/media.rb', line 191 def (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) ⇒ Object
98 99 100 101 102 |
# 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 ⇒ Object
29 |
# 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 ⇒ Object
108 |
# File 'lib/apple_tv_converter/media.rb', line 108 def subtitle_streams ; streams :subtitle ; end |
#tvdb_episode_number ⇒ Object
47 |
# 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) ⇒ Object
154 155 156 157 |
# 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 ⇒ Object
159 160 161 162 163 164 165 166 167 168 169 |
# 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 ⇒ Object
46 |
# 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! ⇒ Object
197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 |
# 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 ⇒ Object
104 |
# File 'lib/apple_tv_converter/media.rb', line 104 def video_streams ; streams :video ; end |