Class: AppleTvConverter::Media

Inherits:
Object
  • Object
show all
Defined in:
lib/apple_tv_converter/media.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#episode_number_paddingObject

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_titleObject

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_dateObject

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_idObject

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_idObject

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_movieObject

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_numberObject

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

#networkObject

Returns the value of attribute network.



6
7
8
# File 'lib/apple_tv_converter/media.rb', line 6

def network
  @network
end

#numberObject

Returns the value of attribute number.



3
4
5
# File 'lib/apple_tv_converter/media.rb', line 3

def number
  @number
end

#original_filenameObject

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_dateObject

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

#seasonObject

Returns the value of attribute season.



3
4
5
# File 'lib/apple_tv_converter/media.rb', line 3

def season
  @season
end

#showObject

Returns the value of attribute show.



3
4
5
# File 'lib/apple_tv_converter/media.rb', line 3

def show
  @show
end

#tmdb_idObject

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_idObject

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_idObject

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_movieObject

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_idObject

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_numberingObject

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_extensionsObject



13
# File 'lib/apple_tv_converter/media.rb', line 13

def self.ignored_extensions ; ['nfo', 'jpg', 'png', 'bmp', 'sfv', 'imdb'] ; end

.subtitle_extensionsObject



11
# File 'lib/apple_tv_converter/media.rb', line 11

def self.subtitle_extensions ; ['srt', 'sub', 'ssa', 'ass'] ; end

Instance Method Details

#artwork_filenameObject



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_streamsObject



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_filenameObject



61
# File 'lib/apple_tv_converter/media.rb', line 61

def backup_filename ; @backup_filename ||= "#{self.original_filename}.backup" ; end

#base_locationObject



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_filenameObject



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

Returns:

  • (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_subtitlesObject



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_fileObject



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_dataObject



65
# File 'lib/apple_tv_converter/media.rb', line 65

def ffmpeg_data ; @ffmpeg_data ||= FFMPEG::Movie.new(original_filename) ; end

#genreObject



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

Returns:

  • (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

Returns:

  • (Boolean)


93
94
95
96
# 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?Boolean

Returns:

  • (Boolean)


132
# File 'lib/apple_tv_converter/media.rb', line 132

def hd? ; ['1080p', '720p'].include?(quality) ; end

#is_movie?Boolean

Returns:

  • (Boolean)


85
# File 'lib/apple_tv_converter/media.rb', line 85

def is_movie? ; !is_tv_show_episode? ; end

#is_mp4?Boolean

Returns:

  • (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

Returns:

  • (Boolean)


83
# File 'lib/apple_tv_converter/media.rb', line 83

def is_tv_show_episode? ; !season.nil? && !number.nil? ; end

#is_valid?Boolean

Returns:

  • (Boolean)


89
# File 'lib/apple_tv_converter/media.rb', line 89

def is_valid? ; ffmpeg_data.valid? ; end

#metadataObject



171
# File 'lib/apple_tv_converter/media.rb', line 171

def  ; @metadata ||= Metadata::Info.new(self) ; end

#movie_file_sizeObject



134
# File 'lib/apple_tv_converter/media.rb', line 134

def movie_file_size ; @movie_file_size ||= File.size(original_filename) ; end

#movie_hashObject



136
# File 'lib/apple_tv_converter/media.rb', line 136

def movie_hash ; @movie_hash ||= AppleTvConverter::MovieHasher.compute_hash(original_filename) ; end

#movie_heightObject



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_widthObject



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

#nameObject



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

Returns:

  • (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

Returns:

  • (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

Returns:

  • (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

Returns:

  • (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

Returns:

  • (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_filenameObject



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

#qualityObject



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_filenameObject



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_filenameObject



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_streamsObject



108
# File 'lib/apple_tv_converter/media.rb', line 108

def subtitle_streams ; streams :subtitle ; end

#tvdb_episode_numberObject



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_posterObject



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_numberObject



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_streamsObject



104
# File 'lib/apple_tv_converter/media.rb', line 104

def video_streams ; streams :video ; end