diff --git a/lib/tivohmo/adapters/plex/category.rb b/lib/tivohmo/adapters/plex/category.rb index efcee3c..df098db 100644 --- a/lib/tivohmo/adapters/plex/category.rb +++ b/lib/tivohmo/adapters/plex/category.rb @@ -56,8 +56,14 @@ def children Array(listing).each do |media| if media.is_a?(::Plex::Movie) add_child(Movie.new(media)) + subtitles(media).each do |sub| + add_child(Movie.new(media, sub)) + end elsif media.is_a?(::Plex::Episode) add_child(Episode.new(media)) + subtitles(media).each do |sub| + add_child(Episode.new(media, sub)) + end elsif media.is_a?(::Plex::Show) add_child(Show.new(media)) else @@ -70,6 +76,26 @@ def children super end + def subtitles(item_delegate) + subs = [] + + item_delegate.medias.find do |media| + media.parts.find do |part| + part.streams.find do |stream| + if stream.respond_to?(:codec) && stream.codec == 'srt' + if stream.respond_to?(:language) && stream.respond_to?(:language_code) + subs << {language: stream.language, language_code: stream.language_code} + else + logger.warn "Subtitles not in plex naming standard for #{item_delegate.title}" + end + end + end + end + end + + subs + end + end end diff --git a/lib/tivohmo/adapters/plex/episode.rb b/lib/tivohmo/adapters/plex/episode.rb index cde6d71..f8503e9 100644 --- a/lib/tivohmo/adapters/plex/episode.rb +++ b/lib/tivohmo/adapters/plex/episode.rb @@ -8,15 +8,19 @@ class Episode include TivoHMO::API::Item include GemLogger::LoggerSupport - attr_reader :delegate + attr_reader :delegate, :subtitle - def initialize(delegate) + def initialize(delegate, subtitle=nil) # delegate is a Plex::Episode @delegate = delegate super(delegate.key) + @subtitle = subtitle + self.title = delegate.title + self.title << " [#{subtitle[:language]} subtitled]" if subtitle + self.modified_at = Time.at(delegate.updated_at.to_i) self.created_at = Time.parse(delegate.originally_available_at) rescue nil self.created_at ||= Time.at(delegate.added_at.to_i) @@ -29,7 +33,7 @@ def metadata md.original_air_date = Time.parse(delegate.originally_available_at) rescue nil - rating_name = delegate.content_rating.upcase + rating_name = delegate.content_rating.upcase rescue nil rating_value = TivoHMO::API::Metadata::TV_RATINGS[rating_name] if rating_value md.tv_rating = {name: rating_name, value: rating_value} diff --git a/lib/tivohmo/adapters/plex/movie.rb b/lib/tivohmo/adapters/plex/movie.rb index 174edb7..e3c1dac 100644 --- a/lib/tivohmo/adapters/plex/movie.rb +++ b/lib/tivohmo/adapters/plex/movie.rb @@ -6,15 +6,19 @@ class Movie include TivoHMO::API::Item include GemLogger::LoggerSupport - attr_reader :delegate + attr_reader :delegate, :subtitle - def initialize(delegate) + def initialize(delegate, subtitle=nil) # delegate is a Plex::Movie @delegate = delegate super(delegate.key) + @subtitle = subtitle + self.title = delegate.title + self.title << " [#{subtitle[:language]} subtitled]" if subtitle + self.modified_at = Time.at(delegate.updated_at.to_i) self.created_at = Time.parse(delegate.originally_available_at) rescue nil self.created_at ||= Time.at(delegate.added_at.to_i) @@ -27,7 +31,7 @@ def metadata md.movie_year = Time.parse(delegate.originally_available_at).year rescue nil - rating_name = delegate.content_rating.upcase + rating_name = delegate.content_rating.upcase rescue nil rating_value = TivoHMO::API::Metadata::MPAA_RATINGS[rating_name] if rating_value md.mpaa_rating = {name: rating_name, value: rating_value} diff --git a/lib/tivohmo/adapters/plex/transcoder.rb b/lib/tivohmo/adapters/plex/transcoder.rb index be5c08a..e31aaf4 100644 --- a/lib/tivohmo/adapters/plex/transcoder.rb +++ b/lib/tivohmo/adapters/plex/transcoder.rb @@ -12,6 +12,37 @@ def initialize(item) self.source_filename = CGI.unescape(item.delegate.medias.first.parts.first.file) end + def transcode(writeable_io, format="video/x-tivo-mpeg") + # TODO: mark as watched in plex + super + end + + def transcoder_options(format="video/x-tivo-mpeg") + opts = super + + if item.respond_to?(:subtitle) && item.subtitle + logger.debug "Subtitles present for #{item}" + code = item.subtitle[:language_code].downcase + sub_file_glob = source_filename.chomp(File.extname(source_filename)) + ".*.srt" + + sub_file = Dir[sub_file_glob].find do |f| + file_code = f.split('.')[-2].downcase + file_code == code || file_code.starts_with?(code) || code.starts_with?(file_code) + end + + if sub_file + logger.debug "Using subtitles present at: #{sub_file}" + opts[:custom] ? (opts[:custom] << " ") : (opts[:custom] = "") + opts[:custom] << "-vf subtitles=\"#{sub_file}\"" + else + logger.debug "Could not find subtitles for: #{item}" + end + end + + opts + end + + end end