videoinfo 0.2.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 2d9f23008adc1a077641356b4fde1287788ab376
4
+ data.tar.gz: 511ba79416ab3b21e1a953c03d0f608574a156b5
5
+ SHA512:
6
+ metadata.gz: d2c7f16d606e4518facbd133a9692e0b6bde23011e13014ec04ec987dba5c95d15f0f0309bc954b2d53aa20ec363fe41711c0283af1c4e5eac13d25ea1c212ce
7
+ data.tar.gz: bada7f288cacddc5db52c5cdb51bd97b9588944ae83f6fbcbb0baffcd41310da006db0f25fef50e9817cce437c4ccb7bd038fad55d89ca75fd837d86e4b065ee
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ .ruby-version
2
+ .ruby-gemset
3
+ Gemfile.lock
4
+ /tmp
5
+ *.gem
data/CHANGELOG.md ADDED
@@ -0,0 +1,4 @@
1
+ ## CHANGELOG
2
+
3
+ #### Version 0.2.0 (August 8, 2014)
4
+ * Initial release
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/README.md ADDED
@@ -0,0 +1,115 @@
1
+ ## Videoinfo
2
+
3
+ Videoinfo is a simple tool for aggregating video metadata and capturing/uploading screenshots.
4
+
5
+ ## Installation
6
+
7
+ First, you'll want to install the prerequisite binaries and make sure they are in your PATH.
8
+
9
+ * [mediainfo](http://mediaarea.net/en-us/MediaInfo/Download)
10
+ * [ffmpeg](https://www.ffmpeg.org/download.html)
11
+
12
+ Add this line to your application's Gemfile:
13
+
14
+ gem 'videoinfo'
15
+
16
+ And then execute:
17
+
18
+ bundle install
19
+
20
+ Or install it yourself with:
21
+
22
+ $ gem install videoinfo
23
+
24
+ ## Configuration
25
+
26
+ There are only a few configuration options:
27
+
28
+ ```ruby
29
+ Videoinfo.mediainfo_binary = '/path/to/mediainfo' # defaults to 'mediainfo'
30
+ Videoinfo.ffmpeg_binary = '/path/to/ffmpeg' # defaults to 'ffmpeg'
31
+ Videoinfo.image_host = ImageHosts::Imgur.new # can be any object that responds to upload(File)
32
+ Videoinfo.interactive = true # defaults to true when using the command line, false otherwise
33
+ ```
34
+
35
+ ## Usage
36
+
37
+ #### Command Line
38
+
39
+ ```
40
+ $ videoinfo -h
41
+ Usage: videoinfo [options] "MOVIENAME" file
42
+ -i, --image-host=IMAGEHOST The ImageHost to use for uploading screenshots. Default: Imgur
43
+ -s, --screenshots=SCREENSHOTS The number of screenshots to create, max 7. Default: 2
44
+ -n, --no-prompt Disable interactive mode
45
+ -h, --help Show this message
46
+
47
+ $ videoinfo -s 5 -i Imgur 'Hackers' Hackers.1995.mkv > hackers.txt
48
+ Is your movie "Hackers (1995)" (tt0113243)? [Y/n] y
49
+ ```
50
+
51
+ #### In scripts
52
+
53
+ The simpliest way to analyze a movie is with `Videoinfo.analyze_movie()`:
54
+
55
+ ```ruby
56
+ result = Videoinfo.analyze_movie('hackers', 'Hackers.1995.mkv', 0) # => #<Videoinfo::Results::MovieResult>
57
+ result.imdb_id # => "0113243"
58
+ result.title # => "Hackers"
59
+ result.plot_summary # => "A young boy is arrested..."
60
+ result.release_date # => "15 September 1995 (USA)"
61
+ result.rating # => 6.2
62
+ result.rating_over_ten # => "6.2 / 10"
63
+ result.genres # => ["Action", "Crime", "Drama", "Thriller"]
64
+ result.director # => "Iain Softley"
65
+ result.writers # => ["Rafael Moreu"]
66
+ result.runtime # => 107
67
+ result.imdb_url # => "http://www.imdb.com/title/tt0113243"
68
+ result.wiki_url # => "https://en.wikipedia.org/wiki/Hackers_(film)"
69
+ result.trailer_url # => "https://www.youtube.com/watch?v=vCobCU9FfzI"
70
+ result.screenshot_urls # => ["https://i.imgur.com/SoBhWfQ.png", ...]
71
+ result.mediainfo # => "General..."
72
+ ```
73
+
74
+ Or, you can be more explicit:
75
+
76
+ ```ruby
77
+ movie = Videoinfo::Videos::Movie.new('hackers', 'Hackers.1995.mkv', 5)
78
+ movie.populate_result! # => #<Videoinfo::Results::MovieResult>
79
+ movie.result # => #<Videoinfo::Results::MovieResult>
80
+ movie.search_imdb # => [#<Imdb::Movie>, ...]
81
+ movie.search_wiki # => "https://en.wikipedia.org/wiki/Hackers_(film)"
82
+ movie.search_youtube # => "https://www.youtube.com/watch?v=vCobCU9FfzI"
83
+ movie.read_mediainfo # => "General..."
84
+ movie.capture_screenshots # => [#<Tempfile:/var/folders/l1/qf5v1rlj6n99n20_rhwrp_5r0000gn/T/ss_20.20140803-67537-ur85vi.png>, ...]
85
+ Videoinfo.upload_screenshot(file) # => "https://i.imgur.com/SoBhWfQ.png"
86
+ ```
87
+
88
+ ## Contributing
89
+
90
+ You are welcome to submit patches with bug fixes or feature additions. Please
91
+ make sure to test your changes throughly and keep to the style you see throughout
92
+ the rest of the code base. Indent with 2 spaces and no trailing spaces at the end
93
+ of lines. Just follow the steps below.
94
+
95
+ 1. Fork and clone the repository
96
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
97
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
98
+ 4. Push to the branch (`git push origin my-new-feature`)
99
+ 5. Create a Pull Request
100
+
101
+ ## Links
102
+
103
+ * Code: `git clone git@github.com:ryanjohns/videoinfo.git`
104
+ * Home: <https://github.com/ryanjohns/videoinfo>
105
+ * Bugs: <https://github.com/ryanjohns/videoinfo/issues>
106
+ * mediainfo: <http://mediaarea.net/en-us/MediaInfo/Download>
107
+ * ffmpeg: <https://www.ffmpeg.org/download.html>
108
+
109
+ ## Author/Maintainter
110
+
111
+ * [Ryan Johns](https://github.com/ryanjohns)
112
+
113
+ ## License
114
+
115
+ Videoinfo is released under the [MIT License](http://www.opensource.org/licenses/MIT).
data/bin/videoinfo ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'videoinfo'
4
+ require 'videoinfo/cli'
5
+
6
+ trap('TERM') { puts ''; exit 1 }
7
+ trap('INT') { puts ''; exit 1 }
8
+
9
+ Videoinfo::CLI.run(ARGV)
data/lib/videoinfo.rb ADDED
@@ -0,0 +1,82 @@
1
+ require 'tempfile'
2
+ require 'shellwords'
3
+ require 'cgi'
4
+ require 'uri'
5
+ require 'net/https'
6
+ require 'json'
7
+ require 'securerandom'
8
+ require 'imdb'
9
+ require 'videoinfo/errors'
10
+ require 'videoinfo/image_host'
11
+ require 'videoinfo/image_hosts/imgur'
12
+ require 'videoinfo/result'
13
+ require 'videoinfo/results/movie_result'
14
+ require 'videoinfo/version'
15
+ require 'videoinfo/video'
16
+ require 'videoinfo/videos/movie'
17
+
18
+ module Videoinfo
19
+
20
+ # Helper method to analyze a movie.
21
+ def self.analyze_movie(name, file, screenshots = 0)
22
+ Videos::Movie.new(name, file, screenshots).populate_result!
23
+ end
24
+
25
+ # Performs a google search and returns the top 10 results.
26
+ def self.google(term)
27
+ uri = URI("https://www.google.com/search?hl=en&q=#{CGI.escape(term)}")
28
+ begin
29
+ response = Net::HTTP.get_response(uri)
30
+ document = Nokogiri::HTML(response.body.encode('UTF-8', 'binary', :invalid => :replace, :undef => :replace, :replace => ''))
31
+ document.css('cite').map { |node| node.inner_text }
32
+ rescue => e
33
+ raise Error, "could not search google for '#{term}'. #{e.message}"
34
+ end
35
+ end
36
+
37
+ # Uploads a screenshot to the currently configured image_host and returns a URL to the image.
38
+ def self.upload_screenshot(image)
39
+ image_host.upload(image)
40
+ end
41
+
42
+ # Set the path of the mediainfo binary.
43
+ def self.mediainfo_binary=(mediainfo)
44
+ @mediainfo_binary = mediainfo.to_s.shellescape
45
+ end
46
+
47
+ # Get the path to the mediainfo binary, defaulting to 'mediainfo'.
48
+ def self.mediainfo_binary
49
+ @mediainfo_binary ||= 'mediainfo'
50
+ end
51
+
52
+ # Set the path of the ffmpeg binary.
53
+ def self.ffmpeg_binary=(ffmpeg)
54
+ @ffmpeg_binary = ffmpeg.to_s.shellescape
55
+ end
56
+
57
+ # Get the path to the ffmpeg binary, defaulting to 'ffmpeg'.
58
+ def self.ffmpeg_binary
59
+ @ffmpeg_binary ||= 'ffmpeg'
60
+ end
61
+
62
+ # Set the image host class. Must be an object that responds to upload(File) and returns a URL.
63
+ def self.image_host=(host)
64
+ @image_host = host
65
+ end
66
+
67
+ # Get the image host class, defaulting to ImageHosts::Imgur.new.
68
+ def self.image_host
69
+ @image_host ||= ImageHosts::Imgur.new
70
+ end
71
+
72
+ # Set interactive mode to true or false.
73
+ def self.interactive=(value)
74
+ @interactive = value
75
+ end
76
+
77
+ # True if interactive mode is enabled, defaulting to false.
78
+ def self.interactive?
79
+ @interactive ||= false
80
+ end
81
+
82
+ end
@@ -0,0 +1,53 @@
1
+ require 'optparse'
2
+
3
+ module Videoinfo
4
+ class CLI
5
+
6
+ # Analyze a video from command line arguments and print the result to STDOUT.
7
+ def self.run(args)
8
+ Videoinfo.interactive = true
9
+ screenshots = 2
10
+ option_parser = OptionParser.new do |opts|
11
+ opts.banner = 'Usage: videoinfo [options] "MOVIENAME" file'
12
+ opts.on('-i', '--image-host=IMAGEHOST', "The ImageHost to use for uploading screenshots. Default: #{Videoinfo.image_host.class.to_s.split('::').last}") do |host|
13
+ begin
14
+ Videoinfo.image_host = Videoinfo::ImageHosts.const_get(host).new
15
+ rescue
16
+ hosts = Videoinfo::ImageHosts.constants.map(&:to_s).join(', ')
17
+ STDERR.puts "ERROR: '#{host}' is an unknown image host. Available hosts: #{hosts}"
18
+ exit 1
19
+ end
20
+ end
21
+ opts.on('-s', '--screenshots=SCREENSHOTS', "The number of screenshots to create, max 7. Default: #{screenshots}") do |ss|
22
+ screenshots = ss.to_i
23
+ if screenshots > 7
24
+ STDERR.puts opts
25
+ exit 1
26
+ end
27
+ end
28
+ opts.on('-n', '--no-prompt', 'Disable interactive mode') do
29
+ Videoinfo.interactive = false
30
+ end
31
+ opts.on('-h', '--help', 'Show this message') do
32
+ puts opts
33
+ exit
34
+ end
35
+ end
36
+
37
+ name, file = option_parser.parse!(args)
38
+ if name.to_s == '' || file.to_s == ''
39
+ STDERR.puts option_parser
40
+ exit 1
41
+ end
42
+
43
+ begin
44
+ result = Videoinfo.analyze_movie(name, file, screenshots)
45
+ puts result.to_s
46
+ rescue Error => e
47
+ STDERR.puts "ERROR: #{e.message}"
48
+ exit 1
49
+ end
50
+ end
51
+
52
+ end
53
+ end
@@ -0,0 +1,4 @@
1
+ module Videoinfo
2
+ class Error < StandardError
3
+ end
4
+ end
@@ -0,0 +1,9 @@
1
+ module Videoinfo
2
+ class ImageHost
3
+
4
+ def upload(image)
5
+ raise NotImplementedError
6
+ end
7
+
8
+ end
9
+ end
@@ -0,0 +1,37 @@
1
+ module Videoinfo
2
+ module ImageHosts
3
+ class Imgur < ImageHost
4
+
5
+ def initialize
6
+ @boundary = SecureRandom.hex(6)
7
+ @header = { 'Content-Type' => "multipart/form-data, boundary=#{@boundary}" }
8
+ @uri = URI.parse('https://imgur.com/upload')
9
+ @http = Net::HTTP.new(@uri.host, @uri.port)
10
+ @http.use_ssl = true
11
+ end
12
+
13
+ def upload(image)
14
+ begin
15
+ request = Net::HTTP::Post.new(@uri.request_uri, @header)
16
+ request.body = post_body(image)
17
+ response = @http.request(request)
18
+ img_name = JSON.parse(response.body)['data']['hash']
19
+ "https://i.imgur.com/#{img_name}.png"
20
+ rescue => e
21
+ raise Error, "could not upload image #{File.basename(image.path)}. #{e.message}"
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def post_body(image)
28
+ body = "--#{@boundary}\r\n"
29
+ body << "Content-Disposition: form-data; name=\"Filedata\"; filename=\"#{File.basename(image.path)}\"\r\n"
30
+ body << "Content-Type: image/png\r\n\r\n"
31
+ body << image.read
32
+ body << "\r\n\r\n--#{@boundary}--\r\n"
33
+ end
34
+
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,21 @@
1
+ module Videoinfo
2
+ class Result
3
+
4
+ attr_accessor :mediainfo, :screenshot_urls
5
+
6
+ def to_s
7
+ output = []
8
+
9
+ if screenshot_urls && screenshot_urls.size > 0
10
+ output += ['[b]Screenshots:[/b]', '[quote][align=center]']
11
+ output += screenshot_urls.map { |url| "[img=#{url}]" }
12
+ output += ['[/align][/quote]', '']
13
+ end
14
+
15
+ output += ['[mediainfo]', mediainfo, '[/mediainfo]']
16
+
17
+ output.join("\n")
18
+ end
19
+
20
+ end
21
+ end
@@ -0,0 +1,47 @@
1
+ module Videoinfo
2
+ module Results
3
+ class MovieResult < Result
4
+
5
+ attr_accessor :imdb_id, :title, :plot_summary, :release_date, :rating, :genres, :director, :writers, :runtime, :wiki_url, :trailer_url
6
+
7
+ def rating_over_ten
8
+ rating ? "#{rating} / 10" : nil
9
+ end
10
+
11
+ def imdb_url
12
+ imdb_id ? "http://www.imdb.com/title/tt#{imdb_id}" : nil
13
+ end
14
+
15
+ def to_s
16
+ output = ['[b]Description:[/b]', '[quote]', plot_summary, '[/quote]', '']
17
+ output << '[b]Information:[/b]'
18
+ output << '[quote]'
19
+ output << "Title: #{title}"
20
+ output << "Rating: #{rating_over_ten}"
21
+ output << "Release Date: #{release_date}"
22
+ output << "Genres: #{(genres || []).join(' | ')}"
23
+ output << "Director: #{director}" if director
24
+ output << "Writers: #{writers.join(', ')}" if writers && writers.size > 0
25
+ output << "Runtime: #{runtime} minutes" if runtime
26
+ output << "Wikipedia url: #{wiki_url}" if wiki_url
27
+ output << "IDMB url: #{imdb_url}"
28
+ output << '[/quote]'
29
+
30
+ if trailer_url
31
+ output += ['', '[b]Trailer:[/b]', '[quote]', "[center][youtube]#{trailer_url}[/youtube][/center]", '[/quote]']
32
+ end
33
+
34
+ if screenshot_urls && screenshot_urls.size > 0
35
+ output += ['', '[b]Screenshots:[/b]', '[quote][align=center]']
36
+ output += screenshot_urls.map { |url| "[img=#{url}]" }
37
+ output += ['[/align][/quote]']
38
+ end
39
+
40
+ output += ['', '[mediainfo]', mediainfo, '[/mediainfo]']
41
+
42
+ output.join("\n")
43
+ end
44
+
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,3 @@
1
+ module Videoinfo
2
+ VERSION = '0.2.0'
3
+ end
@@ -0,0 +1,59 @@
1
+ module Videoinfo
2
+ class Video
3
+
4
+ attr_accessor :name, :file, :screenshots, :result
5
+
6
+ def initialize(name, file, screenshots = 0)
7
+ self.name = name
8
+ self.file = file
9
+ self.screenshots = screenshots
10
+ end
11
+
12
+ def file=(f)
13
+ @file = File.expand_path(f)
14
+ end
15
+
16
+ def result
17
+ @result ||= Result.new
18
+ end
19
+
20
+ def populate_result!
21
+ result.mediainfo = read_mediainfo
22
+ result.screenshot_urls = capture_screenshots.map { |ss| Videoinfo.upload_screenshot(ss) }
23
+
24
+ result
25
+ end
26
+
27
+ def read_mediainfo
28
+ raise Error, "#{file}: file not found" unless File.file?(file)
29
+
30
+ info = Dir.chdir(File.dirname(file)) { %x(#{Videoinfo.mediainfo_binary} #{File.basename(file).shellescape}) }
31
+ raise Error, 'unable to read mediainfo' unless $?.success?
32
+
33
+ info
34
+ end
35
+
36
+ def capture_screenshots
37
+ return [] unless screenshots > 0
38
+ raise Error, "#{file}: file not found" unless File.file?(file)
39
+
40
+ duration = %x(#{Videoinfo.mediainfo_binary} --Inform="General;%Duration%" #{file.shellescape}).strip.to_f / 1000
41
+ raise Error, 'unable to determine video duration' unless $?.success? && duration > 0
42
+
43
+ images = []
44
+ stepsize = screenshots == 1 ? 100 : 60 / (screenshots - 1)
45
+ (20..80).step(stepsize) do |percent|
46
+ image = Tempfile.new(["ss_#{percent}.", '.png'])
47
+ %x(#{Videoinfo.ffmpeg_binary} -y -ss #{duration * percent / 100} -i #{file.shellescape} -vframes 1 -f image2 #{image.path} -v quiet)
48
+ if $?.success?
49
+ images << image
50
+ else
51
+ raise Error, "ERROR: unable to capture screenshot at #{percent}% into the video"
52
+ end
53
+ end
54
+
55
+ images
56
+ end
57
+
58
+ end
59
+ end
@@ -0,0 +1,62 @@
1
+ module Videoinfo
2
+ module Videos
3
+ class Movie < Video
4
+
5
+ def result
6
+ @result ||= Results::MovieResult.new
7
+ end
8
+
9
+ def populate_result!
10
+ result.mediainfo = read_mediainfo
11
+
12
+ movie = search_imdb.first
13
+ if movie
14
+ result.imdb_id = movie.id
15
+ result.title = movie.title.sub(/\(\d{4}\)/, '').strip
16
+ result.plot_summary = movie.plot_summary
17
+ result.release_date = movie.release_date
18
+ result.rating = movie.rating
19
+ result.genres = movie.genres
20
+ result.director = movie.director.first
21
+ result.writers = movie.writers.compact
22
+ result.runtime = movie.length
23
+ result.wiki_url = search_wiki
24
+ result.trailer_url = search_youtube
25
+ end
26
+
27
+ result.screenshot_urls = capture_screenshots.map { |ss| Videoinfo.upload_screenshot(ss) }
28
+
29
+ result
30
+ end
31
+
32
+ def search_imdb
33
+ movies = []
34
+ begin
35
+ movies = Imdb::Search.new(name).movies
36
+ rescue => e
37
+ raise Error, "could not search IMDB. #{e.message}"
38
+ end
39
+
40
+ return movies unless Videoinfo.interactive?
41
+
42
+ movies.each do |m|
43
+ STDERR.print "Is your movie \"#{m.title}\" (tt#{m.id})? [Y/n] "
44
+ return [m] if STDIN.gets.strip !~ /^(n|no)$/i
45
+ end
46
+
47
+ []
48
+ end
49
+
50
+ def search_wiki
51
+ wiki_url = Videoinfo.google("site:wikipedia.org #{result.title || name} film").first
52
+ wiki_url ? "https://#{wiki_url}" : nil
53
+ end
54
+
55
+ def search_youtube
56
+ youtube_url = Videoinfo.google("site:youtube.com #{result.title || name} trailer").first
57
+ youtube_url ? "https://#{youtube_url}" : nil
58
+ end
59
+
60
+ end
61
+ end
62
+ end
data/videoinfo.gemspec ADDED
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require File.expand_path('../lib/videoinfo/version', __FILE__)
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'videoinfo'
7
+ s.version = Videoinfo::VERSION
8
+ s.summary = 'Simple tool for aggregating video metadata and capturing screenshots'
9
+ s.description = 'Combines metadata from a variety of sources with codec details from mediainfo to produce a marked-up summary for a video file. Also captures screenshots using ffmpeg and uploads them to a configurable image host.'
10
+ s.authors = ['Ryan Johns']
11
+ s.email = 'ryanjohns@gmail.com'
12
+ s.homepage = 'https://github.com/ryanjohns/videoinfo'
13
+ s.license = 'MIT'
14
+
15
+ s.files = `git ls-files`.split("\n")
16
+ s.executables = s.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ s.require_paths = ['lib']
18
+
19
+ s.add_runtime_dependency 'imdb', '~> 0.8'
20
+
21
+ s.requirements << 'mediainfo'
22
+ s.requirements << 'ffmpeg'
23
+ end
metadata ADDED
@@ -0,0 +1,78 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: videoinfo
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Ryan Johns
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-08-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: imdb
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.8'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.8'
27
+ description: Combines metadata from a variety of sources with codec details from mediainfo
28
+ to produce a marked-up summary for a video file. Also captures screenshots using
29
+ ffmpeg and uploads them to a configurable image host.
30
+ email: ryanjohns@gmail.com
31
+ executables:
32
+ - videoinfo
33
+ extensions: []
34
+ extra_rdoc_files: []
35
+ files:
36
+ - ".gitignore"
37
+ - CHANGELOG.md
38
+ - Gemfile
39
+ - README.md
40
+ - bin/videoinfo
41
+ - lib/videoinfo.rb
42
+ - lib/videoinfo/cli.rb
43
+ - lib/videoinfo/errors.rb
44
+ - lib/videoinfo/image_host.rb
45
+ - lib/videoinfo/image_hosts/imgur.rb
46
+ - lib/videoinfo/result.rb
47
+ - lib/videoinfo/results/movie_result.rb
48
+ - lib/videoinfo/version.rb
49
+ - lib/videoinfo/video.rb
50
+ - lib/videoinfo/videos/movie.rb
51
+ - videoinfo.gemspec
52
+ homepage: https://github.com/ryanjohns/videoinfo
53
+ licenses:
54
+ - MIT
55
+ metadata: {}
56
+ post_install_message:
57
+ rdoc_options: []
58
+ require_paths:
59
+ - lib
60
+ required_ruby_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ required_rubygems_version: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ requirements:
71
+ - mediainfo
72
+ - ffmpeg
73
+ rubyforge_project:
74
+ rubygems_version: 2.2.2
75
+ signing_key:
76
+ specification_version: 4
77
+ summary: Simple tool for aggregating video metadata and capturing screenshots
78
+ test_files: []