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.
-
#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_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
- #movie_file_size ⇒ Object
- #movie_hash ⇒ Object
- #name ⇒ Object
- #needs_audio_conversion? ⇒ Boolean
- #needs_subtitles_conversion? ⇒ Boolean
- #needs_transcoding? ⇒ Boolean
- #needs_video_conversion? ⇒ Boolean
- #plex_format_filename ⇒ Object
- #quality ⇒ Object
- #quality=(value) ⇒ Object
- #resulting_filename ⇒ 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.
8 9 10 |
# File 'lib/apple_tv_converter/media.rb', line 8 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 |
#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
12 |
# File 'lib/apple_tv_converter/media.rb', line 12 def self.ignored_extensions ; ['nfo', 'jpg', 'png', 'bmp', 'sfv', 'imdb'] ; end |
.subtitle_extensions ⇒ Object
10 |
# File 'lib/apple_tv_converter/media.rb', line 10 def self.subtitle_extensions ; ['srt', 'sub', 'ssa', 'ass'] ; end |
Instance Method Details
#artwork_filename ⇒ Object
38 |
# File 'lib/apple_tv_converter/media.rb', line 38 def artwork_filename ; @artwork_filename ||= self.original_filename.gsub(File.extname(self.original_filename), '.jpg') ; end |
#audio_streams ⇒ Object
117 |
# File 'lib/apple_tv_converter/media.rb', line 117 def audio_streams ; streams :audio ; end |
#backup! ⇒ Object
102 |
# File 'lib/apple_tv_converter/media.rb', line 102 def backup! ; FileUtils.cp original_filename, backup_filename ; end |
#backup_filename ⇒ Object
72 |
# File 'lib/apple_tv_converter/media.rb', line 72 def backup_filename ; @backup_filename ||= "#{self.original_filename}.backup" ; end |
#base_location ⇒ Object
46 47 48 49 50 51 52 |
# File 'lib/apple_tv_converter/media.rb', line 46 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
42 |
# File 'lib/apple_tv_converter/media.rb', line 42 def converted_filename ; @converted_filename ||= self.original_filename.gsub(File.extname(self.original_filename), '.mp4') ; end |
#converted_filename=(value) ⇒ Object
44 |
# File 'lib/apple_tv_converter/media.rb', line 44 def converted_filename=(value) ; @converted_filename = value ; end |
#converted_filename_equals_original_filename? ⇒ Boolean
36 |
# File 'lib/apple_tv_converter/media.rb', line 36 def converted_filename_equals_original_filename? ; @converted_filename_equals_original_filename || false ; end |
#converted_filename_with_subtitles ⇒ Object
74 |
# File 'lib/apple_tv_converter/media.rb', line 74 def converted_filename_with_subtitles ; @converted_filename_with_subtitles ||= self.original_filename.gsub(/\.(mkv|avi|m4v)/, '_subtitled.mp4') ;end |
#data_file ⇒ Object
54 |
# File 'lib/apple_tv_converter/media.rb', line 54 def data_file ; @data_file ||= File.join(base_location, '.apple-tv-converter.data') ; end |
#ffmpeg_data ⇒ Object
76 |
# File 'lib/apple_tv_converter/media.rb', line 76 def ffmpeg_data ; @ffmpeg_data ||= FFMPEG::Movie.new(original_filename) ; end |
#genre ⇒ Object
88 |
# File 'lib/apple_tv_converter/media.rb', line 88 def genre ; is_tv_show_episode? ? show : "#{quality} Movies" ; end |
#get_new_subtitle_filename(language, subid = nil) ⇒ Object
152 153 154 155 156 |
# File 'lib/apple_tv_converter/media.rb', line 152 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
55 |
# File 'lib/apple_tv_converter/media.rb', line 55 def has_data_file? ; File.exists?(data_file) ; end |
#has_embedded_subtitles?(languages = []) ⇒ Boolean
104 105 106 107 |
# File 'lib/apple_tv_converter/media.rb', line 104 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
129 |
# File 'lib/apple_tv_converter/media.rb', line 129 def hd? ; ['1080p', '720p'].include?(quality) ; end |
#is_movie? ⇒ Boolean
96 |
# File 'lib/apple_tv_converter/media.rb', line 96 def is_movie? ; !is_tv_show_episode? ; end |
#is_mp4? ⇒ Boolean
98 |
# File 'lib/apple_tv_converter/media.rb', line 98 def is_mp4? ; ffmpeg_data.container =~ /mp4/ rescue File.extname(original_filename) =~ /\.(m4v|mp4)$/ ; end |
#is_tv_show_episode? ⇒ Boolean
94 |
# File 'lib/apple_tv_converter/media.rb', line 94 def is_tv_show_episode? ; !season.nil? && !number.nil? ; end |
#is_valid? ⇒ Boolean
100 |
# File 'lib/apple_tv_converter/media.rb', line 100 def is_valid? ; ffmpeg_data.valid? ; end |
#movie_file_size ⇒ Object
131 |
# File 'lib/apple_tv_converter/media.rb', line 131 def movie_file_size ; @movie_file_size ||= File.size(original_filename) ; end |
#movie_hash ⇒ Object
133 |
# File 'lib/apple_tv_converter/media.rb', line 133 def movie_hash ; @movie_hash ||= AppleTvConverter::MovieHasher.compute_hash(original_filename) ; end |
#name ⇒ Object
92 |
# File 'lib/apple_tv_converter/media.rb', line 92 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
121 |
# File 'lib/apple_tv_converter/media.rb', line 121 def needs_audio_conversion? ; return ffmpeg_data.audio_codec !~ /(?:aac)/i ; end |
#needs_subtitles_conversion? ⇒ Boolean
125 |
# File 'lib/apple_tv_converter/media.rb', line 125 def needs_subtitles_conversion? ; return ffmpeg_data.subtitle_streams.any? ; end |
#needs_transcoding? ⇒ Boolean
127 |
# File 'lib/apple_tv_converter/media.rb', line 127 def needs_transcoding? ; !(is_valid? && is_mp4? && !needs_video_conversion? && !needs_audio_conversion?) ; end |
#needs_video_conversion? ⇒ Boolean
123 |
# File 'lib/apple_tv_converter/media.rb', line 123 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 ; end |
#plex_format_filename ⇒ Object
60 61 62 63 64 65 66 67 68 |
# File 'lib/apple_tv_converter/media.rb', line 60 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
78 79 80 81 82 83 84 85 86 |
# File 'lib/apple_tv_converter/media.rb', line 78 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
90 |
# File 'lib/apple_tv_converter/media.rb', line 90 def quality=(value) ; @quality = value ; end |
#resulting_filename ⇒ Object
70 |
# File 'lib/apple_tv_converter/media.rb', line 70 def resulting_filename ; File.exists?(plex_format_filename) ? plex_format_filename : converted_filename ; end |
#streams(type = nil) ⇒ Object
109 110 111 112 113 |
# File 'lib/apple_tv_converter/media.rb', line 109 def streams(type = nil) @streams ||= ffmpeg_data.streams return @streams.select { |stream| stream.type == type } if type return @streams end |
#subtitle_filename ⇒ Object
40 |
# File 'lib/apple_tv_converter/media.rb', line 40 def subtitle_filename ; @subtitle_filename ||= self.original_filename.gsub(File.extname(self.original_filename), '.srt') ; end |
#subtitle_streams ⇒ Object
119 |
# File 'lib/apple_tv_converter/media.rb', line 119 def subtitle_streams ; streams :subtitle ; end |
#tvdb_episode_number ⇒ Object
58 |
# File 'lib/apple_tv_converter/media.rb', line 58 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
135 136 137 138 |
# File 'lib/apple_tv_converter/media.rb', line 135 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
140 141 142 143 144 145 146 147 148 149 150 |
# File 'lib/apple_tv_converter/media.rb', line 140 def tvdb_movie_poster local_file = AppleTvConverter::TvDbFetcher.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
57 |
# File 'lib/apple_tv_converter/media.rb', line 57 def tvdb_season_number ; @tvdb_season_number ||= media.tvdb_movie_data(@use_absolute_episode_numbering ? '1' : 'SeasonNumber') rescue nil ; end |
#update_data_file! ⇒ Object
158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
# File 'lib/apple_tv_converter/media.rb', line 158 def update_data_file! data = has_data_file? ? YAML.load_file(data_file) : {} data[:tvdb_id] = self.tvdb_id if self.tvdb_id data[:imdb_id] = self.imdb_id if self.imdb_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 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
115 |
# File 'lib/apple_tv_converter/media.rb', line 115 def video_streams ; streams :video ; end |