where_to 0.9.6 → 1.0.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 +8 -8
- data/Rakefile +7 -1
- data/bin/whereto +143 -0
- data/lib/where_to/episode_formatter.rb +2 -2
- data/lib/where_to/locator.rb +17 -12
- data/lib/where_to/tvdb.rb +10 -2
- data/lib/where_to/version.rb +1 -1
- data/lib/where_to.rb +4 -6
- data/where_to.gemspec +6 -2
- metadata +34 -4
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NmY0ZmI3NzkxOWZmZjVmYzg3MGZkN2U1NjlhZTU1MjBlNGU2NGU1Zg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ODgwMTY4YjM1ZmIwOTJkZTVhYWQ0ZjE3NmY4YzYwNDBhZDcxMjk4ZQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MGRmNzZkYjY2NTlmMDY1MmE1NmJlNWVkMDVmYTZiMWNmMTdkODcwNmJjNzkw
|
10
|
+
OTA2NTA2MzJiMDExZTE4YzA4Y2QyYTY4ZWZlMzI1NjRlZGI1YTM0NTEzMWY5
|
11
|
+
MjJmMDE1ZWNlNzIwYzE4ZjVlMzM3MGZhOTE0NmNmMzljYzQ5YTk=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MGEyMDJhZTY0MzhkYmFhNGQwZGJlZWZmYWViMjhjNGE5Njg1ODI3MWQxNjk3
|
14
|
+
YmQwMmNiMmNmYmJlZDRkOWM0Yjg1ZDVkYWRiMjM4YzJlNjcyNDlkMWFkNmQw
|
15
|
+
YjI2YjcwZmY5ZTE3MDEzM2M0YTczMzJjMWVmYzQ0YmNmZTEwYjU=
|
data/Rakefile
CHANGED
@@ -5,6 +5,12 @@ RSpec::Core::RakeTask.new(:spec)
|
|
5
5
|
|
6
6
|
task default: :spec
|
7
7
|
|
8
|
+
namespace :parallel do
|
9
|
+
task :spec do
|
10
|
+
sh "parallel_rspec spec/"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
8
14
|
task :watch do
|
9
15
|
folders_to_watch = 'bin lib spec'
|
10
16
|
action_on_change = 'bundle exec rake'
|
@@ -15,4 +21,4 @@ task :watch do
|
|
15
21
|
puts 'You need to have the filewatcher gem installed to perform this task.'
|
16
22
|
puts 'Install with \'gem install filewatcher\''
|
17
23
|
end
|
18
|
-
end
|
24
|
+
end
|
data/bin/whereto
ADDED
@@ -0,0 +1,143 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'gli'
|
3
|
+
require_relative '../lib/where_to'
|
4
|
+
|
5
|
+
include GLI::App
|
6
|
+
|
7
|
+
PROMPT_DESCRIPTORS = Hash.new do |hash, key|
|
8
|
+
hash[key] = "a #{key}"
|
9
|
+
end
|
10
|
+
|
11
|
+
PROMPT_DESCRIPTORS[:episode_number] = 'an episode number'
|
12
|
+
PROMPT_DESCRIPTORS[:episode_title] = 'an episode title'
|
13
|
+
|
14
|
+
# PROMPT_DESCRIPTORS.freeze
|
15
|
+
|
16
|
+
program_desc 'Helps you organize your media library by enforcing a consistent directory structure.'
|
17
|
+
|
18
|
+
version WhereTo::VERSION
|
19
|
+
|
20
|
+
subcommand_option_handling :normal
|
21
|
+
arguments :strict
|
22
|
+
|
23
|
+
desc 'Enforce a file structure on the specified file or directory'
|
24
|
+
arg_name 'location'
|
25
|
+
command :organize do |cmd|
|
26
|
+
|
27
|
+
cmd.desc 'Set the name of the series (will otherwise be prompted to enter)'
|
28
|
+
cmd.arg_name 'series_title'
|
29
|
+
cmd.default_value nil
|
30
|
+
cmd.flag [:s, :series]
|
31
|
+
|
32
|
+
cmd.desc 'Set the season number'
|
33
|
+
cmd.arg_name 'season_number'
|
34
|
+
cmd.default_value nil
|
35
|
+
cmd.flag [:n, :season]
|
36
|
+
|
37
|
+
cmd.desc 'Set the TVDB season id'
|
38
|
+
cmd.arg_name 'series_id'
|
39
|
+
cmd.default_value nil
|
40
|
+
cmd.flag [:i, :series_id]
|
41
|
+
|
42
|
+
# cmd.desc 'Set the series airdate'
|
43
|
+
# cmd.arg_name 'season_airdate'
|
44
|
+
# cmd.default_value nil
|
45
|
+
# cmd.flag [:a, :airdate]
|
46
|
+
|
47
|
+
cmd.desc 'Only look for files with the given extension'
|
48
|
+
cmd.arg_name 'extname'
|
49
|
+
cmd.default_value '.mkv'
|
50
|
+
cmd.flag [:e, :ext]
|
51
|
+
|
52
|
+
cmd.desc "Run normally, but don't actually perform renames"
|
53
|
+
cmd.default_value false
|
54
|
+
cmd.switch :dryrun, negatable: false
|
55
|
+
|
56
|
+
cmd.action do |global_options, options, args|
|
57
|
+
puts ''
|
58
|
+
location = args[0]
|
59
|
+
raise "The location '#{location}' does not exist" unless File.exist? location
|
60
|
+
|
61
|
+
@options = options
|
62
|
+
|
63
|
+
Dir.chdir location
|
64
|
+
files = Dir.glob "*#{options[:ext]}"
|
65
|
+
puts "I found the following files:"
|
66
|
+
files.each { |file| puts file }
|
67
|
+
puts ''
|
68
|
+
|
69
|
+
WhereTo.configure do |config|
|
70
|
+
config.tvdb_api_key = ENV['TVDB_API_KEY']
|
71
|
+
end
|
72
|
+
|
73
|
+
process files
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
def process(files)
|
80
|
+
locator = WhereTo::Locator.new series_id: @options[:series_id]
|
81
|
+
locator.episode_number = 0
|
82
|
+
locator.series_title = prompt_for :series_title, default: locator.series_title
|
83
|
+
|
84
|
+
files.sort.each do |file|
|
85
|
+
puts ''
|
86
|
+
puts "For file #{file}:"
|
87
|
+
|
88
|
+
%i{season episode_number group}.each do |field|
|
89
|
+
locator.send("#{field}=", prompt_for(field, default: locator.send(field)))
|
90
|
+
end
|
91
|
+
|
92
|
+
locator.lookup!
|
93
|
+
locator.episode_title = prompt_for :episode_title, default: locator.episode_title
|
94
|
+
|
95
|
+
new_file = locator.locate.filename
|
96
|
+
puts "New filename: #{new_file}"
|
97
|
+
|
98
|
+
if not @options[:dryrun]
|
99
|
+
rename file, to: new_file
|
100
|
+
else
|
101
|
+
puts 'Skipping rename because of dryrun flag'
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def rename(from, to:)
|
108
|
+
print 'Renaming...'
|
109
|
+
FileUtils.mv from, to unless from == to
|
110
|
+
puts 'success!'
|
111
|
+
end
|
112
|
+
|
113
|
+
def prompt_for(option, default: nil)
|
114
|
+
prompt = "Enter #{PROMPT_DESCRIPTORS[option]}"
|
115
|
+
prompt += " (or press enter for #{default})" unless default.nil?
|
116
|
+
prompt += ': '
|
117
|
+
print prompt
|
118
|
+
input = STDIN.gets.chomp
|
119
|
+
input.empty? ? default : input
|
120
|
+
end
|
121
|
+
|
122
|
+
pre do |global,command,options,args|
|
123
|
+
# Pre logic here
|
124
|
+
# Return true to proceed; false to abort and not call the
|
125
|
+
# chosen command
|
126
|
+
# Use skips_pre before a command to skip this block
|
127
|
+
# on that command only
|
128
|
+
true
|
129
|
+
end
|
130
|
+
|
131
|
+
post do |global,command,options,args|
|
132
|
+
# Post logic here
|
133
|
+
# Use skips_post before a command to skip this
|
134
|
+
# block on that command only
|
135
|
+
end
|
136
|
+
|
137
|
+
on_error do |exception|
|
138
|
+
# Error logic here
|
139
|
+
# return false to skip default error handling
|
140
|
+
true
|
141
|
+
end
|
142
|
+
|
143
|
+
exit run(ARGV)
|
@@ -4,7 +4,7 @@ module WhereTo
|
|
4
4
|
attr_accessor :quality, :extension, :group
|
5
5
|
DEFAULT_EXTENSION = '.mkv'
|
6
6
|
|
7
|
-
def initialize(hash = {}, series_title: hash[:series_title], season_number: hash[:season_number], episode_title: hash[:episode_title], episode_number: hash[:episode_number], extension: hash[:extension], quality: hash[:quality], group: hash[:group])
|
7
|
+
def initialize(hash = {}, series_title: hash[:series_title], season_number: hash[:season_number], episode_title: hash[:episode_title], episode_number: hash[:episode_number], extension: hash[:extension], quality: hash[:quality], group: hash[:group], series_id: hash[:series_id])
|
8
8
|
set_unless_nil :series_title, series_title
|
9
9
|
set_unless_nil :season_number, season_number
|
10
10
|
set_unless_nil :episode_title, episode_title
|
@@ -48,4 +48,4 @@ module WhereTo
|
|
48
48
|
end
|
49
49
|
|
50
50
|
end
|
51
|
-
end
|
51
|
+
end
|
data/lib/where_to/locator.rb
CHANGED
@@ -1,14 +1,17 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
require_relative 'location'
|
2
|
+
require_relative 'configuration'
|
3
3
|
require 'yaml'
|
4
4
|
|
5
5
|
module WhereTo
|
6
6
|
class Locator
|
7
7
|
attr_accessor :series_title, :airdate, :season, :season_airdate
|
8
|
-
attr_accessor :episode_title, :episode_number, :episode_quality, :episode_extension, :group
|
8
|
+
attr_accessor :episode_title, :episode_number, :episode_quality, :episode_extension, :group, :series_id
|
9
9
|
|
10
10
|
def initialize(hash = {})
|
11
11
|
load_values_from hash
|
12
|
+
if series_id
|
13
|
+
@series_title = WhereTo::TVDB.new(params).lookup_series(series_id).name
|
14
|
+
end
|
12
15
|
end
|
13
16
|
|
14
17
|
def locate(hash = {})
|
@@ -48,6 +51,7 @@ module WhereTo
|
|
48
51
|
_params[:quality] = episode_quality
|
49
52
|
_params[:extension] = episode_extension
|
50
53
|
_params[:group] = group
|
54
|
+
_params[:series_id] = series_id
|
51
55
|
_params
|
52
56
|
end
|
53
57
|
|
@@ -58,15 +62,16 @@ module WhereTo
|
|
58
62
|
end
|
59
63
|
|
60
64
|
def load_values_from(hash = {})
|
61
|
-
set_unless_nil :series_title,
|
62
|
-
set_unless_nil :airdate,
|
63
|
-
set_unless_nil :season,
|
64
|
-
set_unless_nil :season_airdate,
|
65
|
-
set_unless_nil :episode_title,
|
66
|
-
set_unless_nil :episode_number,
|
67
|
-
set_unless_nil :episode_quality,
|
65
|
+
set_unless_nil :series_title, hash[:series_title]
|
66
|
+
set_unless_nil :airdate, hash[:airdate]
|
67
|
+
set_unless_nil :season, hash[:season]
|
68
|
+
set_unless_nil :season_airdate, hash[:season_airdate]
|
69
|
+
set_unless_nil :episode_title, hash[:episode_title]
|
70
|
+
set_unless_nil :episode_number, hash[:episode_number]
|
71
|
+
set_unless_nil :episode_quality, hash[:episode_quality]
|
68
72
|
set_unless_nil :episode_extension, hash[:episode_extension]
|
69
|
-
set_unless_nil :group,
|
73
|
+
set_unless_nil :group, hash[:group]
|
74
|
+
set_unless_nil :series_id, hash[:series_id]
|
70
75
|
end
|
71
76
|
end
|
72
|
-
end
|
77
|
+
end
|
data/lib/where_to/tvdb.rb
CHANGED
@@ -11,11 +11,14 @@ module WhereTo
|
|
11
11
|
@db = TvdbParty::Search.new api_key
|
12
12
|
end
|
13
13
|
|
14
|
+
# Probably split into lookup_season, lookup_episode (which lazy instantiate)
|
15
|
+
# and lookup_season!, lookup_episode! (which force db hit):w
|
14
16
|
def lookup!
|
15
17
|
validate!
|
16
18
|
results = @db.search(series_title).first unless series_id
|
17
19
|
series = @db.get_series_by_id (series_id || results['seriesid'])
|
18
20
|
episode = series.get_episode season, episode_number
|
21
|
+
raise "It doesn't look like the series #{series.name} has an episode #{episode_number} for season #{season}" unless episode
|
19
22
|
@episode_title = episode.name
|
20
23
|
@season_airdate = episode.air_date.year
|
21
24
|
|
@@ -27,8 +30,12 @@ module WhereTo
|
|
27
30
|
raise 'You need to configure your TVDB API key before looking up episode information'
|
28
31
|
end
|
29
32
|
|
33
|
+
def lookup_series(series_id)
|
34
|
+
@db.get_series_by_id series_id
|
35
|
+
end
|
36
|
+
|
30
37
|
def validate!
|
31
|
-
raise 'A series title is required to lookup episode information' if series_title.nil?
|
38
|
+
raise 'A series title is required to lookup episode information' if series_title.nil? && series_id.nil?
|
32
39
|
raise 'An episode number is required to lookup episode information' if episode_number.nil?
|
33
40
|
raise 'A season number is required to lookup episode information' if season.nil?
|
34
41
|
true
|
@@ -50,6 +57,7 @@ module WhereTo
|
|
50
57
|
set_unless_nil :episode_number, hash[:episode_number]
|
51
58
|
set_unless_nil :episode_quality, hash[:episode_quality]
|
52
59
|
set_unless_nil :episode_extension, hash[:episode_extension]
|
60
|
+
set_unless_nil :series_id, hash[:series_id]
|
53
61
|
end
|
54
62
|
end
|
55
|
-
end
|
63
|
+
end
|
data/lib/where_to/version.rb
CHANGED
data/lib/where_to.rb
CHANGED
@@ -1,9 +1,7 @@
|
|
1
|
-
require '
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
require 'where_to/episode_formatter'
|
6
|
-
require 'where_to/tvdb'
|
1
|
+
require 'date'
|
2
|
+
|
3
|
+
# Require all the libraries!
|
4
|
+
Dir[File.dirname(__FILE__) + "/where_to/**/*.rb"].each { |f| require_relative f }
|
7
5
|
|
8
6
|
module WhereTo
|
9
7
|
class << self
|
data/where_to.gemspec
CHANGED
@@ -14,16 +14,20 @@ Gem::Specification.new do |spec|
|
|
14
14
|
spec.summary = "Helps preserve a folder structure for mediafiles"
|
15
15
|
spec.homepage = "https://github.com/jutonz/where_to"
|
16
16
|
|
17
|
+
spec.platform = Gem::Platform::RUBY
|
17
18
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
-
spec.bindir = "exe"
|
19
|
-
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
19
|
spec.require_paths = ["lib"]
|
20
|
+
spec.bindir = "bin"
|
21
|
+
spec.executables << "whereto"
|
21
22
|
|
22
23
|
spec.add_development_dependency "bundler", "~> 1.9"
|
23
24
|
spec.add_development_dependency "rake", "~> 10.0"
|
24
25
|
spec.add_development_dependency "simplecov", "~> 0.10.0"
|
25
26
|
spec.add_development_dependency "coveralls", "~> 0.8.1"
|
26
27
|
spec.add_development_dependency "rspec", "~> 3.2"
|
28
|
+
spec.add_development_dependency "parallel_tests", "~> 1.5"
|
27
29
|
|
28
30
|
spec.add_dependency "tvdb_party", "~> 0.8.0"
|
31
|
+
|
32
|
+
spec.add_runtime_dependency "gli", "2.13.1"
|
29
33
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: where_to
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin Toniazzo
|
8
8
|
autorequire:
|
9
|
-
bindir:
|
9
|
+
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-07-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - ~>
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '3.2'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: parallel_tests
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ~>
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.5'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ~>
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '1.5'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: tvdb_party
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,10 +108,25 @@ dependencies:
|
|
94
108
|
- - ~>
|
95
109
|
- !ruby/object:Gem::Version
|
96
110
|
version: 0.8.0
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: gli
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - '='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 2.13.1
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - '='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 2.13.1
|
97
125
|
description:
|
98
126
|
email:
|
99
127
|
- jutonz42@gmail.com
|
100
|
-
executables:
|
128
|
+
executables:
|
129
|
+
- whereto
|
101
130
|
extensions: []
|
102
131
|
extra_rdoc_files: []
|
103
132
|
files:
|
@@ -109,6 +138,7 @@ files:
|
|
109
138
|
- Rakefile
|
110
139
|
- bin/console
|
111
140
|
- bin/setup
|
141
|
+
- bin/whereto
|
112
142
|
- lib/where_to.rb
|
113
143
|
- lib/where_to/configuration.rb
|
114
144
|
- lib/where_to/episode_formatter.rb
|