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.



8
9
10
# File 'lib/apple_tv_converter/media.rb', line 8

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

#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



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

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

.subtitle_extensionsObject



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

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

Instance Method Details

#artwork_filenameObject



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_streamsObject



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_filenameObject



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

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

#base_locationObject



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_filenameObject



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

Returns:

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



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_fileObject



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_dataObject



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

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

#genreObject



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

Returns:

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

Returns:

  • (Boolean)


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

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)


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

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

#is_movie?Boolean

Returns:

  • (Boolean)


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

def is_movie? ; !is_tv_show_episode? ; end

#is_mp4?Boolean

Returns:

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

Returns:

  • (Boolean)


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

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

#is_valid?Boolean

Returns:

  • (Boolean)


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

def is_valid? ; ffmpeg_data.valid? ; end

#movie_file_sizeObject



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

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

#movie_hashObject



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

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

#nameObject



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

Returns:

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

Returns:

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

Returns:

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

Returns:

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



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

#qualityObject



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_filenameObject



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_filenameObject



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_streamsObject



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

def subtitle_streams ; streams :subtitle ; end

#tvdb_episode_numberObject



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_posterObject



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_numberObject



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_streamsObject



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

def video_streams ; streams :video ; end