apple-tv-converter 0.6.2 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/CHANGELOG CHANGED
@@ -1,3 +1,9 @@
1
+ v0.7.0
2
+ ------
3
+ * Added support for fetching metadata from themoviedb.org
4
+ * Performed some reengineering of the metadata services, in order to simplify adding more providers
5
+ * Fixed some bugs
6
+
1
7
  v0.6.2
2
8
  ------
3
9
  * Added the missing VERSION file
@@ -1,11 +1,12 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- apple-tv-converter (0.6.0)
4
+ apple-tv-converter (0.7.0)
5
5
  httparty (~> 0)
6
6
  imdb (~> 0.6, >= 0.6.8)
7
7
  language_list (~> 0.0, >= 0.0.3)
8
8
  libxml-ruby (~> 2.7, >= 2.7.0)
9
+ rest-client (~> 1.7.2, >= 1.7.2)
9
10
  rubyzip (~> 0.9, >= 0.9.9)
10
11
  streamio-ffmpeg (~> 0.9, >= 0.9.0)
11
12
 
@@ -13,27 +14,32 @@ GEM
13
14
  remote: https://rubygems.org/
14
15
  specs:
15
16
  diff-lcs (1.2.5)
16
- httparty (0.13.0)
17
+ httparty (0.13.1)
17
18
  json (~> 1.8)
18
19
  multi_xml (>= 0.5.2)
19
- imdb (0.8.1)
20
- nokogiri (>= 1.6.0)
20
+ imdb (0.8.2)
21
+ nokogiri (= 1.6.2.1)
21
22
  json (1.8.1)
22
23
  language_list (0.1.0)
23
24
  libxml-ruby (2.7.0)
25
+ mime-types (2.3)
24
26
  mini_portile (0.6.0)
25
27
  multi_xml (0.5.5)
28
+ netrc (0.7.7)
26
29
  nokogiri (1.6.2.1)
27
30
  mini_portile (= 0.6.0)
28
31
  rake (0.9.6)
32
+ rest-client (1.7.2)
33
+ mime-types (>= 1.16, < 3.0)
34
+ netrc (~> 0.7)
29
35
  rspec (2.14.1)
30
36
  rspec-core (~> 2.14.0)
31
37
  rspec-expectations (~> 2.14.0)
32
38
  rspec-mocks (~> 2.14.0)
33
- rspec-core (2.14.7)
39
+ rspec-core (2.14.8)
34
40
  rspec-expectations (2.14.5)
35
41
  diff-lcs (>= 1.1.3, < 2.0)
36
- rspec-mocks (2.14.5)
42
+ rspec-mocks (2.14.6)
37
43
  rubyzip (0.9.9)
38
44
  streamio-ffmpeg (0.9.0)
39
45
 
data/README.md CHANGED
@@ -66,7 +66,8 @@ Common options:
66
66
 
67
67
  ### Metadata
68
68
 
69
- Metadata can be obtained automatically from IMDB.com(http://www.imdb.com) (for movies) or from TheTVDB.com(http://www.thetvdb.com) (for TV show episodes). The latter also falls back to IMDB for necessary information. Most metadata will be filled, including the file's artwork, so it displays a nice image on iTunes library.
69
+ Metadata can be obtained automatically from themoviedb.org(http://www.themoviedb.org) (for movies) or from TheTVDB.com(http://www.thetvdb.com) (for TV show episodes).
70
+ Both fall back to IMDB.com(http://www.imdb.com) for necessary information. Most metadata will be filled, including the file's artwork, so it displays a nice image on iTunes library.
70
71
 
71
72
  #### Fallbacks
72
73
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.6.2
1
+ 0.7.0
@@ -15,6 +15,7 @@ require 'net/http'
15
15
  require 'uri'
16
16
  require 'base64'
17
17
  require 'zlib'
18
+ require 'rest_client'
18
19
 
19
20
  module AppleTvConverter
20
21
 
@@ -113,6 +114,7 @@ module AppleTvConverter
113
114
  # ice - Icelandic -> isl
114
115
  # ita - Italian
115
116
  # jpn - Japanese
117
+ # jap - Japanese -> jpn
116
118
  # kor - Korean
117
119
  # lav - Latvian
118
120
  # lit - Lithuanian
@@ -139,6 +141,7 @@ module AppleTvConverter
139
141
  'gre' => 'ell',
140
142
  'ice' => 'isl',
141
143
  'rum' => 'ron',
144
+ 'jap' => 'jpn',
142
145
  'may' => nil
143
146
  }
144
147
 
@@ -161,7 +164,10 @@ require 'apple_tv_converter/media_converter'
161
164
  require 'apple_tv_converter/media'
162
165
  require 'apple_tv_converter/movie_hasher'
163
166
  require 'apple_tv_converter/subtitles_fetcher/opensubtitles'
164
- require 'apple_tv_converter/tv_db_fetcher'
167
+ require 'apple_tv_converter/metadata/info'
168
+ require 'apple_tv_converter/metadata/imdb'
169
+ require 'apple_tv_converter/metadata/tv_db'
170
+ require 'apple_tv_converter/metadata/movie_db'
165
171
  require 'apple_tv_converter/media_converter_adapter'
166
172
  require 'apple_tv_converter/media_converter_windows_adapter' if RUBY_PLATFORM =~ /(win|w)(32|64)$/
167
173
  require 'apple_tv_converter/media_converter_mac_adapter' if RUBY_PLATFORM =~ /(darwin)/
@@ -44,6 +44,7 @@ module AppleTvConverter
44
44
  options.interactive = true
45
45
  options.imdb_id = nil
46
46
  options.tvdb_id = nil
47
+ options.tmdb_id = nil
47
48
  options.use_absolute_numbering = false
48
49
  options.episode_number_padding = nil
49
50
  options.languages = []
@@ -58,31 +59,40 @@ module AppleTvConverter
58
59
  " [file] must be provided unless the -d (--dir) switch is present.\n"
59
60
 
60
61
  opts.on('-i', '--id id', "Set a specific id for fetching metadata from online services") do |id|
61
- raise ArgumentError.new("Can't supply both --id and --imdb_id or --tvdb_id at the same time!") if id_switch > 0
62
+ raise ArgumentError.new("Can't supply both --id and --imdb_id, --tvdb_id, or --tmdb_id at the same time!") if id_switch > 0
62
63
 
63
- id_switch = 3
64
+ id_switch = 7
64
65
  options.imdb_id = id
65
66
  options.tvdb_id = id
67
+ options.tmdb_id = id
66
68
  end
67
69
 
68
70
  opts.on('--imdb_id id', "Set a specific id for fetching metadata from IMDB") do |id|
69
- raise ArgumentError.new("Can't supply both --id and --imdb_id or --tvdb_id at the same time!") if id_switch & 1 > 0
71
+ raise ArgumentError.new("Can't supply both --id and --imdb_id, --tvdb_id, or --tmdb_id at the same time!") if id_switch & 1 > 0
70
72
 
71
73
  id_switch |= 1
72
74
  options.imdb_id = id
73
75
  end
74
76
 
75
77
  opts.on('--tvdb_id id', "Set a specific id for fetching metadata from TheTVDB") do |id|
76
- raise ArgumentError.new("Can't supply both --id and --imdb_id or --tvdb_id at the same time!") if id_switch & 2 > 0
78
+ raise ArgumentError.new("Can't supply both --id and --imdb_id, --tvdb_id, or --tmdb_id at the same time!") if id_switch & 2 > 0
77
79
 
78
80
  id_switch |= 2
79
81
  options.tvdb_id = id
80
82
  end
81
83
 
84
+ opts.on('--tmdb_id id', "Set a specific id for fetching metadata from TheTVDB") do |id|
85
+ raise ArgumentError.new("Can't supply both --id and --imdb_id, --tvdb_id, or --tmdb_id at the same time!") if id_switch & 4 > 0
86
+
87
+ id_switch |= 4
88
+ options.tmdb_id = id
89
+ end
90
+
82
91
  opts.on('-l', '--languages eng,por,...', Array, "Only keep audio and subtitles in the specified languages") do |languages|
83
92
  options.languages.push *languages
84
93
  # If filtering by languages, always include the undetermined language
85
94
  options.languages.push 'und' unless options.languages.include?('und')
95
+ options.languages.map!(&:to_sym)
86
96
  end
87
97
 
88
98
  opts.on('-d', '--dir DIRECTORY', 'Process all files in DIRECTORY recursively') do |dir|
@@ -5,6 +5,7 @@ module AppleTvConverter
5
5
  attr_accessor :tvdb_movie
6
6
  attr_accessor :network, :tvdb_id, :tvdb_season_id, :tvdb_episode_id, :first_air_date, :release_date, :episode_title
7
7
  attr_accessor :use_absolute_episode_numbering, :episode_number_padding
8
+ attr_accessor :tmdb_id
8
9
  attr_reader :original_filename
9
10
 
10
11
  def self.subtitle_extensions ; ['srt', 'sub', 'ssa', 'ass'] ; end
@@ -156,7 +157,7 @@ module AppleTvConverter
156
157
  end
157
158
 
158
159
  def tvdb_movie_poster
159
- local_file = AppleTvConverter::TvDbFetcher.get_poster(self)
160
+ local_file = AppleTvConverter::Metadata::TvDb.get_poster(self)
160
161
 
161
162
  unless File.exists?(local_file)
162
163
  artwork_filename = imdb_movie.poster if imdb_movie && imdb_movie.poster
@@ -167,19 +168,41 @@ module AppleTvConverter
167
168
  local_file
168
169
  end
169
170
 
171
+ def metadata ; @metadata ||= Metadata::Info.new(self) ; end
172
+
170
173
  def get_new_subtitle_filename(language, subid = nil)
171
174
  dir_name = File.dirname(original_filename)
172
175
  existing_subtitle_counter = subid.nil? ? Dir[File.join(dir_name, '*.srt')].length : subid
173
176
  return File.join(dir_name, File.basename(original_filename).gsub(File.extname(original_filename), ".#{existing_subtitle_counter}.#{language}.srt"))
174
177
  end
175
178
 
179
+ def get_metadata_id(service, type)
180
+ @metadata_id ||= {}
181
+ @metadata_id[type.to_sym] ||= {}
182
+ return @metadata_id[type.to_sym][service.to_sym] rescue nil
183
+ end
184
+
185
+ def set_metadata_id(service, type, id)
186
+ @metadata_id ||= {}
187
+ @metadata_id[type.to_sym] ||= {}
188
+ @metadata_id[type.to_sym].store service.to_sym, id.to_s.gsub(/\D+/, '')
189
+ end
190
+
191
+ def set_metadata_id_if_not_set(service, type, id)
192
+ @metadata_id ||= {}
193
+ @metadata_id[type.to_sym] ||= {}
194
+ @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)
195
+ end
196
+
176
197
  def update_data_file!
177
198
  data = has_data_file? ? YAML.load_file(data_file) : {}
178
199
 
179
- data[:tvdb_id] = self.tvdb_id if self.tvdb_id
180
- data[:imdb_id] = self.imdb_id if self.imdb_id
200
+ data.delete :tvdb_id
201
+ data.delete :imdb_id
202
+ data.delete :tmdb_id
181
203
  data[:episode_number_padding] = self.episode_number_padding if self.episode_number_padding
182
204
  data[:use_absolute_episode_numbering] = self.use_absolute_episode_numbering if self.use_absolute_episode_numbering
205
+ data[:metadata_id] = @metadata_id
183
206
 
184
207
  if self.is_tv_show_episode?
185
208
  episode_data = {}
@@ -202,11 +225,21 @@ module AppleTvConverter
202
225
  begin
203
226
  if has_data_file?
204
227
  data = YAML.load_file(data_file)
205
- self.tvdb_id = data[:tvdb_id] if !self.tvdb_id && data.has_key?(:tvdb_id)
206
- self.imdb_id = data[:imdb_id] if !self.imdb_id && data.has_key?(:imdb_id)
228
+ self.tvdb_id ||= data[:tvdb_id] if !self.tvdb_id && data.has_key?(:tvdb_id)
229
+ self.imdb_id ||= data[:imdb_id] if !self.imdb_id && data.has_key?(:imdb_id)
230
+ self.tmdb_id ||= data[:tmdb_id] if !self.tmdb_id && data.has_key?(:tmdb_id)
207
231
  @episode_number_padding = data[:episode_number_padding] if !@episode_number_padding && data.has_key?(:episode_number_padding)
208
232
  @use_absolute_episode_numbering = data[:use_absolute_episode_numbering] if !@use_absolute_episode_numbering && data.has_key?(:use_absolute_episode_numbering)
233
+
234
+ @metadata_id = data[:metadata_id] if data.has_key?(:metadata_id)
209
235
  end
236
+
237
+ @metadata_id ||= { :show => {} }
238
+ @metadata_id[:show][:imdb] ||= self.imdb_id
239
+ @metadata_id[:show][:tvdb] ||= self.tvdb_id
240
+ @metadata_id[:show][:tmdb] ||= self.tmdb_id
241
+
242
+ puts @metadata_id
210
243
  rescue => e
211
244
  ap ['e', e]
212
245
  end
@@ -68,7 +68,7 @@ module AppleTvConverter
68
68
  end
69
69
  end
70
70
 
71
- if @options.skip_subtitles != true && @options.download_subtitles && media.subtitle_streams.select { |s| @options.languages.include?(s.language.to_s) }.empty? && @adapter.list_files(media.original_filename.gsub(/.{4}$/, '.*srt')).empty?
71
+ if @options.skip_subtitles != true && @options.download_subtitles && media.subtitle_streams.select { |s| @options.languages.include?(s.language.to_sym) }.empty? && @adapter.list_files(media.original_filename.gsub(/.{4}$/, '.*srt')).empty?
72
72
  @adapter.search_subtitles(media, @options.languages)
73
73
  @adapter.download_subtitles(media, @options.languages)
74
74
  end
@@ -96,9 +96,14 @@ module AppleTvConverter
96
96
  private
97
97
 
98
98
  def apply_options_to_media!(media)
99
- # Load IMDB id from options
99
+ # Load metadata service id's from options
100
100
  media.imdb_id ||= @options.imdb_id
101
101
  media.tvdb_id ||= @options.tvdb_id
102
+ media.tmdb_id ||= @options.tmdb_id
103
+
104
+ media.set_metadata_id :imdb, :show, @options.imdb_id if @options.imdb_id
105
+ media.set_metadata_id :tvdb, :show, @options.tvdb_id if @options.tvdb_id
106
+ media.set_metadata_id :tmdb, :show, @options.tmdb_id if @options.tmdb_id
102
107
 
103
108
  media.season = @options.season if @options.season
104
109
  media.number = @options.episode if @options.episode
@@ -190,102 +190,9 @@ module AppleTvConverter
190
190
  end
191
191
 
192
192
  def get_metadata(media)
193
- if media.is_tv_show_episode?
194
- get_tv_show_db_info media
195
- else
196
- get_imdb_info media
197
- end
198
- end
199
-
200
- def get_tv_show_db_info(media)
201
- printf "* Getting info from TheTVDB"
202
-
203
- media.tvdb_movie = TvDbFetcher.search(media, conversion_options.interactive)
204
- if media.tvdb_movie
205
- media.imdb_id = media.tvdb_movie[:show][:series]['IMDB_ID'] if media.tvdb_movie.has_key?(:show) && media.tvdb_movie[:show].has_key?(:series)
206
- media.imdb_id = media.imdb_id.gsub(/\D+/, '') if media.imdb_id
207
-
208
- # Update the episode name, if available
209
- media.episode_title = media.tvdb_movie_data('EpisodeName')
210
- media.tvdb_id = media.tvdb_movie_data('seriesid')
211
- media.tvdb_season_id = media.tvdb_movie_data('seasonid')
212
- media.tvdb_episode_id = media.tvdb_movie_data('id')
213
- media.imdb_episode_id = media.tvdb_movie_data('IMDB_ID')
214
- media.imdb_episode_id = media.imdb_episode_id.gsub(/\D+/, '') if media.imdb_episode_id
215
-
216
- unless media.imdb_id.nil? || media.imdb_id.blank?
217
- puts "" # Line break just for output layout
218
- get_imdb_info(media, false)
219
- end
220
-
221
- puts " [DONE]"
222
- else
223
- puts " [NOT FOUND]"
224
- end
225
- end
226
-
227
- def get_imdb_info(media, feedback = true)
228
- printf "* Getting info from IMDB" if feedback
229
-
230
- if media.imdb_id
231
- media.imdb_movie = Imdb::Movie.new(media.imdb_id)
232
- elsif Dir[File.join(File.dirname(media.original_filename), '*.imdb')].any?
233
- media.imdb_movie = Imdb::Movie.new(File.basename(Dir[File.join(File.dirname(media.original_filename), '*.imdb')].first).gsub(/\.imdb$/i, ''))
234
- else
235
-
236
- search = Imdb::Search.new(media.show)
237
-
238
- search.movies.delete_if do |item|
239
- item.title.strip =~ /(?:(?:\(TV\s*(?:Movie|(?:Mini.?)?Series|Episode))|(?:Video(?:\s*Game)?))/i
240
- end
241
-
242
- media.imdb_id = if search.movies.length > 1 && conversion_options.interactive
243
- choice = 0
244
- puts "\n *"
245
- while true
246
- puts %Q[ | Several movies found, choose the intended one#{" (showing only the first 20 of #{search.movies.length} results)" if search.movies.length > 20}:]
247
-
248
- search.movies[0...20].each_with_index do |item, index|
249
- puts " | #{(index + 1).to_s.rjust(search.movies.length.to_s.length)} - #{item.title.strip} (id: #{item.id})"
250
- if item.also_known_as.any?
251
- akas = item.also_known_as[0...5].each do |aka|
252
- puts " | #{' '.rjust(search.movies.length.to_s.length)} AKA: #{(aka.is_a?(Hash) ? aka[:title] : aka).strip}"
253
- end
254
- end
255
- end
256
-
257
- printf " |\n *- What's your choice (1..#{[search.movies.length, 20].min})? "
258
- choice = STDIN.gets.chomp.to_i
259
-
260
- break if choice.between?(1, [search.movies.length, 20].min)
261
-
262
- puts " | Invalid choice!"
263
- puts " |"
264
- end
265
-
266
- printf " * Getting info from IMDB"
267
- search.movies[choice - 1].id
268
- else
269
- search.movies.first.id rescue nil
270
- end
271
-
272
- media.imdb_movie = Imdb::Movie.new(media.imdb_id) if media.imdb_id
273
- end
274
-
275
- begin
276
- media.imdb_movie.year
277
- puts " [DONE]" if feedback
278
- rescue OpenURI::HTTPError => e
279
- media.imdb_id = nil
280
- media.imdb_movie = nil
281
- puts (e.message =~ /404/ ? " [NOT FOUND]" : " [ERROR]") if feedback
282
- rescue
283
- if media.imdb_id.nil?
284
- puts " [NOT FOUND]" if feedback
285
- else
286
- raise e
287
- end
288
- end
193
+ has_metadata = Metadata::TvDb.search(media, conversion_options.interactive) if media.is_tv_show_episode?
194
+ has_metadata = Metadata::MovieDb.get_metadata(media, conversion_options.interactive) unless media.is_tv_show_episode?
195
+ has_metadata ||= Metadata::Imdb.get_metadata(media, conversion_options.interactive)
289
196
  end
290
197
 
291
198
  def tag(media)
@@ -43,72 +43,29 @@ module AppleTvConverter
43
43
  def tag(media)
44
44
  metadata = {}
45
45
 
46
- if media.is_tv_show_episode? && media.tvdb_movie
47
- # ap [media.tvdb_movie[:show][:series], media.tvdb_movie[:episode]]
48
- metadata['Name'] = media.tvdb_movie_data('EpisodeName')
49
- metadata['Name'] ||= "#{media.show} S#{media.season.to_s.rjust(2, '0')}E#{media.number.to_s.rjust(2, '0')}"
50
- metadata['Genre'] = media.tvdb_movie[:show][:series]['Genre'].gsub(/(?:^\|)|(?:\|$)/, '').split('|').first rescue nil
51
- metadata['Description'] = media.tvdb_movie_data('Overview')
52
- metadata['Release Date'] = media.tvdb_movie_data('FirstAired')
53
- metadata['Director'] = media.tvdb_movie_data('Director')
54
- metadata['TV Show'] = media.tvdb_movie[:show][:series]['SeriesName']
55
- metadata['TV Show'] ||= media.show
56
- metadata['TV Season'] = media.tvdb_season_number || media.season
57
- metadata['TV Episode #'] = media.tvdb_episode_number || media.number
58
- metadata['TV Network'] ||= media.tvdb_movie[:show][:series]['Network']
59
- metadata['Screenwriters'] = media.tvdb_movie_data('Writer').gsub(/(?:^\|)|(?:\|$)/, '').split('|').join(', ') if media.tvdb_movie_data('Writer')
60
-
61
- # Set Sort metadata fields for iOS 5
62
- metadata['Sort Name'] = media.name
63
- metadata['Sort Album'] = media.show
64
- metadata['Sort Album Artist'] = media.show
65
- metadata['Sort Composer'] = media.show
66
- metadata['Sort Show'] = "#{media.show} Season #{(media.tvdb_season_number || media.season).to_s.rjust(2, '0')}"
67
-
68
- if media.imdb_movie
69
- # Fallback to IMDB data if present
70
- metadata['Genre'] ||= media.imdb_movie.genres.first if media.imdb_movie.genres && media.imdb_movie.genres.any?
71
- metadata['Description'] ||= media.imdb_movie.plot if media.imdb_movie.plot
72
- metadata['Release Date'] ||= media.imdb_movie.year if media.imdb_movie.year > 0
73
- metadata['Director'] ||= media.imdb_movie.director.first
74
- end
46
+ metadata['Name'] = media.metadata.name
47
+ metadata['Genre'] = media.metadata.genre
48
+ metadata['Description'] = media.metadata.description
49
+ metadata['Release Date'] = media.metadata.release_date
50
+ metadata['Director'] = media.metadata.director
51
+ metadata['Screenwriters'] = media.metadata.screenwriters
52
+ metadata['Artwork'] = media.metadata.artwork
53
+ metadata['Sort Name'] = media.metadata.sort_name
54
+ metadata['HD Video'] = true if media.hd?
55
+ metadata['Media Kind'] = media.is_tv_show_episode? ? 'TV Show' : 'Movie'
75
56
 
76
- if File.exists?(media.tvdb_movie_poster)
77
- AppleTvConverter.copy media.tvdb_movie_poster, media.artwork_filename
78
- metadata['Artwork'] = media.artwork_filename
79
- end
80
- else
81
- if media.imdb_movie
82
- unless media.is_tv_show_episode?
83
- metadata['Name'] = media.imdb_movie.title.gsub(/"/, '"')
84
- end
85
- metadata['Genre'] = media.imdb_movie.genres.first.gsub(/"/, '"') if media.imdb_movie.genres.any?
86
- metadata['Description'] = media.imdb_movie.plot.gsub(/"/, '"') if media.imdb_movie.plot
87
- metadata['Release Date'] = media.imdb_movie.year if media.imdb_movie.year
88
- metadata['Director'] = (media.imdb_movie.director.first || '').gsub(/"/, '"') if media.imdb_movie.director.any?
89
- metadata['Codirector'] = media.imdb_movie.director[1].gsub(/"/, '"') if media.imdb_movie.director.length > 1
90
-
91
- if media.imdb_movie.poster
92
- AppleTvConverter.copy media.imdb_movie.poster, media.artwork_filename
93
- metadata['Artwork'] = media.artwork_filename
94
- end
95
- end
57
+ if media.is_tv_show_episode?
58
+ metadata['TV Show'] = media.metadata.tv_show
59
+ metadata['TV Season'] = media.metadata.tv_show_season
60
+ metadata['TV Episode #'] = media.metadata.tv_show_episode
61
+ metadata['TV Network'] = media.metadata.tv_network
96
62
 
97
- # Overwrite the name and genre to group the episode correctly
98
- if media.is_tv_show_episode?
99
- metadata['Name'] = "#{media.show} S#{media.season.to_s.rjust(2, '0')}E#{media.number.to_s.rjust(2, '0')}"
100
- # metadata['Genre'] = media.genre
101
- metadata['TV Show'] = media.show
102
- metadata['TV Season'] = media.season
103
- metadata['TV Episode #'] = media.number
104
- elsif !media.imdb_movie
105
- metadata['Name'] = media.show
106
- metadata['Genre'] = media.genre
107
- end
63
+ metadata['Sort Album'] = media.metadata.sort_album
64
+ metadata['Sort Album Artist'] = media.metadata.sort_album_artist
65
+ metadata['Sort Composer'] = media.metadata.sort_composer
66
+ metadata['Sort TV Show'] = media.metadata.sort_show
108
67
  end
109
68
 
110
- metadata['HD Video'] = true if media.hd?
111
- metadata['Media Kind'] = media.is_tv_show_episode? ? 'TV Show' : 'Movie'
112
69
 
113
70
  metadata = metadata.map do |key, value|
114
71
  value.nil? ? nil : %Q[{#{key}: #{value.to_s.gsub(/"/, '\\"')}}]