videoinfo 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -0
- data/README.md +10 -2
- data/lib/videoinfo.rb +7 -0
- data/lib/videoinfo/cli.rb +17 -4
- data/lib/videoinfo/results/tv_result.rb +50 -0
- data/lib/videoinfo/version.rb +1 -1
- data/lib/videoinfo/videos/tv.rb +80 -0
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 33e98615cb1b94110418f42ea3028e4770c1c078
|
4
|
+
data.tar.gz: 4e69fa05d0c0f9639057da5e4e5af7cf738d6732
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1d70fe7bb03a34f7302904d7d948183604a67f353c09da91a60a7d9ad1e65bf74ac006ff1ac5d965f18994afb310f61ee19d36e68e218dff9e2b72bb6def4b9d
|
7
|
+
data.tar.gz: d778dab1561ec8bc158cdf9159c1794662d5e25a8a2e9fd8d462a58abfd982dbdf334e82e542bfdfe18be1b4d2aae660e9f3860c223b099a7be13becfac92e68
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -38,9 +38,10 @@ Videoinfo.interactive = true # defaults to true when using
|
|
38
38
|
|
39
39
|
```
|
40
40
|
$ videoinfo -h
|
41
|
-
Usage: videoinfo [options] "MOVIENAME" file
|
42
|
-
-i, --image-host=IMAGEHOST The
|
41
|
+
Usage: videoinfo [options] "MOVIENAME/SHOWNAME" file
|
42
|
+
-i, --image-host=IMAGEHOST The image host to use for uploading screenshots. Default: Imgur
|
43
43
|
-s, --screenshots=SCREENSHOTS The number of screenshots to create, max 7. Default: 2
|
44
|
+
-e, --episode=EPISODE The TV show episode or season number. Formats: S01E01 or S01
|
44
45
|
-n, --no-prompt Disable interactive mode
|
45
46
|
-h, --help Show this message
|
46
47
|
|
@@ -85,6 +86,13 @@ movie.capture_screenshots # => [#<Tempfile:/var/folders/l1/qf5v1rlj6n99n
|
|
85
86
|
Videoinfo.upload_screenshot(file) # => "https://i.imgur.com/SoBhWfQ.png"
|
86
87
|
```
|
87
88
|
|
89
|
+
It works with TV shows too:
|
90
|
+
|
91
|
+
```ruby
|
92
|
+
result = Videoinfo.analyze_tv('survivor s01e01', 'survivor.s01e01.mkv', 0) # => #<Videoinfo::Results::TvResult>
|
93
|
+
tv = Videoinfo::Videos::Tv.new('survivor s01e01', 'survivor.s01e01.mkv', 3)
|
94
|
+
````
|
95
|
+
|
88
96
|
## Contributing
|
89
97
|
|
90
98
|
You are welcome to submit patches with bug fixes or feature additions. Please
|
data/lib/videoinfo.rb
CHANGED
@@ -11,9 +11,11 @@ require 'videoinfo/image_host'
|
|
11
11
|
require 'videoinfo/image_hosts/imgur'
|
12
12
|
require 'videoinfo/result'
|
13
13
|
require 'videoinfo/results/movie_result'
|
14
|
+
require 'videoinfo/results/tv_result'
|
14
15
|
require 'videoinfo/version'
|
15
16
|
require 'videoinfo/video'
|
16
17
|
require 'videoinfo/videos/movie'
|
18
|
+
require 'videoinfo/videos/tv'
|
17
19
|
|
18
20
|
module Videoinfo
|
19
21
|
|
@@ -22,6 +24,11 @@ module Videoinfo
|
|
22
24
|
Videos::Movie.new(name, file, screenshots).populate_result!
|
23
25
|
end
|
24
26
|
|
27
|
+
# Helper method to analyze a tv episode or season.
|
28
|
+
def self.analyze_tv(name, file, screenshots = 0)
|
29
|
+
Videos::Tv.new(name, file, screenshots).populate_result!
|
30
|
+
end
|
31
|
+
|
25
32
|
# Performs a google search and returns the top 10 results.
|
26
33
|
def self.google(term)
|
27
34
|
uri = URI("https://www.google.com/search?hl=en&q=#{CGI.escape(term)}")
|
data/lib/videoinfo/cli.rb
CHANGED
@@ -10,9 +10,10 @@ module Videoinfo
|
|
10
10
|
Videoinfo.interactive = true
|
11
11
|
image_host = ENV[ENV_IMAGE_HOST] || Videoinfo.image_host.class.to_s.split('::').last
|
12
12
|
screenshots = 2
|
13
|
+
episode = nil
|
13
14
|
option_parser = OptionParser.new do |opts|
|
14
|
-
opts.banner = 'Usage: videoinfo [options] "MOVIENAME" file'
|
15
|
-
opts.on('-i', '--image-host=IMAGEHOST', "The
|
15
|
+
opts.banner = 'Usage: videoinfo [options] "MOVIENAME/SHOWNAME" file'
|
16
|
+
opts.on('-i', '--image-host=IMAGEHOST', "The image host to use for uploading screenshots. Default: #{image_host}") do |host|
|
16
17
|
image_host = host
|
17
18
|
end
|
18
19
|
opts.on('-s', '--screenshots=SCREENSHOTS', "The number of screenshots to create, max 7. Default: #{screenshots}") do |ss|
|
@@ -22,6 +23,14 @@ module Videoinfo
|
|
22
23
|
exit 1
|
23
24
|
end
|
24
25
|
end
|
26
|
+
opts.on('-e', '--episode=EPISODE', 'The TV show episode or season number. Formats: S01E01 or S01') do |ep|
|
27
|
+
if ep =~ /\AS\d{2,3}\z/i || ep =~ /\AS\d{2,3}E\d{2,3}\z/i
|
28
|
+
episode = ep
|
29
|
+
else
|
30
|
+
STDERR.puts opts
|
31
|
+
exit 1
|
32
|
+
end
|
33
|
+
end
|
25
34
|
opts.on('-n', '--no-prompt', 'Disable interactive mode') do
|
26
35
|
Videoinfo.interactive = false
|
27
36
|
end
|
@@ -41,13 +50,17 @@ module Videoinfo
|
|
41
50
|
exit 1
|
42
51
|
end
|
43
52
|
|
44
|
-
if name.to_s == '' || file.to_s == ''
|
53
|
+
if name.to_s.strip == '' || file.to_s.strip == ''
|
45
54
|
STDERR.puts option_parser
|
46
55
|
exit 1
|
47
56
|
end
|
48
57
|
|
49
58
|
begin
|
50
|
-
|
59
|
+
if episode
|
60
|
+
result = Videoinfo.analyze_tv("#{name} #{episode}".strip, file.strip, screenshots)
|
61
|
+
else
|
62
|
+
result = Videoinfo.analyze_movie(name.strip, file.strip, screenshots)
|
63
|
+
end
|
51
64
|
puts result.to_s
|
52
65
|
rescue Error => e
|
53
66
|
STDERR.puts "ERROR: #{e.message}"
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Videoinfo
|
2
|
+
module Results
|
3
|
+
class TvResult < Result
|
4
|
+
|
5
|
+
attr_accessor :imdb_id, :title, :plot, :rating, :genres, :country, :premiered, :season_number, :episode_number, :episode_imdb_id, :episode_title, :episode_url, :episode_rating, :air_date
|
6
|
+
|
7
|
+
def rating_over_ten
|
8
|
+
rating ? "#{rating} / 10" : nil
|
9
|
+
end
|
10
|
+
|
11
|
+
def episode_rating_over_ten
|
12
|
+
episode_rating ? "#{episode_rating} / 10" : nil
|
13
|
+
end
|
14
|
+
|
15
|
+
def imdb_url
|
16
|
+
imdb_id ? "http://www.imdb.com/title/tt#{imdb_id}" : nil
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_s
|
20
|
+
output = ['[b]Description:[/b]', '[quote]', plot, '[/quote]', '']
|
21
|
+
output << '[b]Information:[/b]'
|
22
|
+
output << '[quote]'
|
23
|
+
output << "Show Name: #{title}"
|
24
|
+
output << "Show url: #{imdb_url}"
|
25
|
+
output << "Rating: #{rating_over_ten}"
|
26
|
+
output << "Genres: #{(genres || []).join(' | ')}"
|
27
|
+
output << "Country: #{country}"
|
28
|
+
output << "Premiered: #{premiered}" if premiered
|
29
|
+
output << "Season Number: #{season_number}" if season_number
|
30
|
+
output << "Episode Number: #{episode_number}" if episode_number
|
31
|
+
output << "Episode Name: #{episode_title}" if episode_title
|
32
|
+
output << "Episode url: #{episode_url}" if episode_url
|
33
|
+
output << "Episode Rating: #{episode_rating_over_ten}" if episode_rating_over_ten
|
34
|
+
output << "Air Date: #{air_date}" if air_date
|
35
|
+
output << '[/quote]'
|
36
|
+
|
37
|
+
if screenshot_urls && screenshot_urls.size > 0
|
38
|
+
output += ['', '[b]Screenshots:[/b]', '[quote][align=center]']
|
39
|
+
output += screenshot_urls.map { |url| "[img=#{url}]" }
|
40
|
+
output += ['[/align][/quote]']
|
41
|
+
end
|
42
|
+
|
43
|
+
output += ['', '[mediainfo]', mediainfo, '[/mediainfo]']
|
44
|
+
|
45
|
+
output.join("\n")
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/lib/videoinfo/version.rb
CHANGED
@@ -0,0 +1,80 @@
|
|
1
|
+
module Videoinfo
|
2
|
+
module Videos
|
3
|
+
class Tv < Video
|
4
|
+
|
5
|
+
attr_reader :episode_string, :season_number, :episode_number
|
6
|
+
|
7
|
+
def result
|
8
|
+
@result ||= Results::TvResult.new
|
9
|
+
end
|
10
|
+
|
11
|
+
def populate_result!
|
12
|
+
result.mediainfo = read_mediainfo
|
13
|
+
|
14
|
+
serie = search_imdb.first
|
15
|
+
if serie
|
16
|
+
result.imdb_id = serie.id
|
17
|
+
result.title = serie.title
|
18
|
+
result.plot = serie.plot
|
19
|
+
result.rating = serie.rating
|
20
|
+
result.genres = serie.genres
|
21
|
+
result.country = serie.countries.first
|
22
|
+
result.premiered = serie.year
|
23
|
+
|
24
|
+
if season_number
|
25
|
+
season = serie.season(season_number.to_i)
|
26
|
+
if season
|
27
|
+
result.season_number = season.season_number
|
28
|
+
if episode_number
|
29
|
+
episode = season.episode(episode_number.to_i)
|
30
|
+
if episode
|
31
|
+
result.episode_number = episode.episode
|
32
|
+
result.episode_imdb_id = episode.id
|
33
|
+
result.episode_title = episode.title
|
34
|
+
result.episode_url = episode.url
|
35
|
+
result.episode_rating = episode.rating
|
36
|
+
result.air_date = episode.air_date
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
result.screenshot_urls = capture_screenshots.map { |ss| Videoinfo.upload_screenshot(ss) }
|
44
|
+
|
45
|
+
result
|
46
|
+
end
|
47
|
+
|
48
|
+
def search_imdb
|
49
|
+
series = []
|
50
|
+
begin
|
51
|
+
series = Imdb::Search.new(name).movies
|
52
|
+
rescue => e
|
53
|
+
raise Error, "could not search IMDB. #{e.message}"
|
54
|
+
end
|
55
|
+
|
56
|
+
return series.map { |s| Imdb::Serie.new(s.id) } unless Videoinfo.interactive?
|
57
|
+
|
58
|
+
series.each do |s|
|
59
|
+
STDERR.print "Is your series \"#{s.title}\" (tt#{s.id})? [Y/n] "
|
60
|
+
return [Imdb::Serie.new(s.id)] if STDIN.gets.strip !~ /^(n|no)$/i
|
61
|
+
end
|
62
|
+
|
63
|
+
[]
|
64
|
+
end
|
65
|
+
|
66
|
+
def name=(n)
|
67
|
+
@episode_string = n.slice!(/(\AS\d{2,3}E\d{2,3}\ |\ S\d{2,3}E\d{2,3}\z|\AS\d{2,3}\ |\ S\d{2,3}\z)/i)
|
68
|
+
@name = n
|
69
|
+
|
70
|
+
if @episode_string
|
71
|
+
@episode_string.strip!
|
72
|
+
@season_number, @episode_number = @episode_string.gsub(/[SE]/i, ' ').split
|
73
|
+
end
|
74
|
+
|
75
|
+
@name
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: videoinfo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Johns
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-09-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: imdb
|
@@ -45,9 +45,11 @@ files:
|
|
45
45
|
- lib/videoinfo/image_hosts/imgur.rb
|
46
46
|
- lib/videoinfo/result.rb
|
47
47
|
- lib/videoinfo/results/movie_result.rb
|
48
|
+
- lib/videoinfo/results/tv_result.rb
|
48
49
|
- lib/videoinfo/version.rb
|
49
50
|
- lib/videoinfo/video.rb
|
50
51
|
- lib/videoinfo/videos/movie.rb
|
52
|
+
- lib/videoinfo/videos/tv.rb
|
51
53
|
- videoinfo.gemspec
|
52
54
|
homepage: https://github.com/ryanjohns/videoinfo
|
53
55
|
licenses:
|
@@ -71,7 +73,7 @@ requirements:
|
|
71
73
|
- mediainfo
|
72
74
|
- ffmpeg
|
73
75
|
rubyforge_project:
|
74
|
-
rubygems_version: 2.
|
76
|
+
rubygems_version: 2.4.6
|
75
77
|
signing_key:
|
76
78
|
specification_version: 4
|
77
79
|
summary: Simple tool for aggregating video metadata and capturing screenshots
|