flickrup 1.1.5 → 1.1.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b679524ad70fe188228c5e7fef9cefceae0c3ae9
4
+ data.tar.gz: d519b914281f79c1b02910c760b6f6a4ac803111
5
+ SHA512:
6
+ metadata.gz: ee89a6391785130f046a79ed747194e91a618f34ac95ec282f64a672ee0b8f62d4b595bb480a4c38a094b33c5300649e9e362aea0e84951287fd6fc94cb48a78
7
+ data.tar.gz: a475d32e8ad4a217e1136fca958e32edddb8f3d60e6bc8a5f51aa9b073b6e502eb10375bc8cede4345002bd21437903b9c7b1c66ddf7ef3ca8e878bec6bf74a3
data/bin/flickrup CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- #require 'rubygems'
3
+ require 'rubygems'
4
4
  require 'flickrup'
5
5
 
6
- Flickrup.run_cmd(ARGV)
6
+ Flickrup.run_cmd(ARGV)
@@ -1,6 +1,7 @@
1
1
  require "fileutils"
2
2
 
3
3
  class Archiver
4
+ include Logging
4
5
 
5
6
  def archive(ctx)
6
7
  archive_file_by_date(ctx.properties[:filename], ctx.properties[:archive_dir], ctx.properties[:date_taken], ctx.properties[:subdir])
@@ -0,0 +1,25 @@
1
+ class AssociatedFiles
2
+
3
+ def initialize(config, delegate, context)
4
+ @delegate = delegate
5
+ @replacements = config[:associated_files].map do |x|
6
+ extract_pair(x)
7
+ end
8
+ end
9
+
10
+ def archive(ctx)
11
+ @delegate.archive(ctx)
12
+ @replacements.map do |x|
13
+ other = ctx.properties[:filename].gsub(*x)
14
+ if File.exist? other
15
+ @delegate.archive(ctx.with_properties({:filename => other}))
16
+ end
17
+ end
18
+ end
19
+
20
+ private
21
+ def extract_pair(pair_string)
22
+ items = pair_string[1..-1].split(pair_string[0])
23
+ [Regexp.new("(?#{items[2]}:#{items[0]})"), items[1]]
24
+ end
25
+ end
@@ -0,0 +1,28 @@
1
+ require 'tempfile'
2
+
3
+ class Sidecar
4
+ def initialize(config, delegate, context)
5
+ @delegate = delegate
6
+ end
7
+
8
+ def archive(ctx)
9
+ @delegate.archive(ctx)
10
+
11
+ if ctx.file.type == TaggedVideo::TYPE
12
+ file = write_sidecar(ctx)
13
+ @delegate.archive(ctx.with_properties({:filename => file}))
14
+ end
15
+
16
+ end
17
+
18
+ def write_sidecar(ctx)
19
+ #write temp file
20
+ to_file = "#{Dir::tmpdir}/#{File.basename(ctx.properties[:filename])}.meta"
21
+ File.open(to_file, "w") do |f|
22
+ f.write({:keywords => ctx.file['keywords']}.to_yaml)
23
+ end
24
+
25
+ return to_file
26
+ end
27
+
28
+ end
@@ -18,7 +18,7 @@ class TagSets < PrefixedExtension
18
18
  unless ctx.properties[UploaderConstants::NO_UPLOAD] == true
19
19
  sets.each do |set|
20
20
  logger.debug("Adding #{ctx.file.filename} to set: #{set}")
21
- @flickr.add_to_set(uploaded, set)
21
+ @flickr.add_to_set(uploaded, set, ctx.file.date_created)
22
22
  end
23
23
  end
24
24
  end
@@ -28,6 +28,8 @@ class TagSets < PrefixedExtension
28
28
 
29
29
  if sets.length == 1
30
30
  ctx.properties[:subdir] = sets[0]
31
+ set_date = @flickr.date_of_set(sets[0])
32
+ ctx.properties[:date_taken] = set_date
31
33
  end
32
34
  @delegate.archive(ctx)
33
35
  end
@@ -59,6 +59,11 @@ class TaggedFile
59
59
  def post_upload
60
60
 
61
61
  end
62
+
63
+ def date_created
64
+ @parsed.date_time_original
65
+ end
66
+
62
67
  end
63
68
 
64
69
  require 'flickrup/filetype/tagged_image'
@@ -6,6 +6,8 @@ require "flickrup/processing_context"
6
6
  class TaggedImage < TaggedFile
7
7
  include Logging
8
8
 
9
+ TYPE = 'image'
10
+
9
11
  attr_reader :filename
10
12
 
11
13
  def initialize(filename)
@@ -39,5 +41,9 @@ class TaggedImage < TaggedFile
39
41
  @parsed[tag] = val
40
42
  end
41
43
 
44
+ def type
45
+ TYPE
46
+ end
47
+
42
48
  register_reader(%w(jpg JPG jpeg JPEG))
43
49
  end
@@ -6,23 +6,14 @@ class TaggedVideo < TaggedFile
6
6
 
7
7
  attr_reader :filename
8
8
 
9
+ TYPE = 'video'
10
+
9
11
  def initialize(filename)
10
12
  super
11
13
  @filename = filename
12
14
  @properties = PicasaIni.open(filename)
13
15
  end
14
16
 
15
- def archive(to_dir)
16
- super
17
- write_sidecar(File.join(target_dir, "#{File.basename(file)}.meta"))
18
- end
19
-
20
- def write_sidecar(to_file)
21
- File.open(to_file, "w") do |f|
22
- f.write({:keywords => keywords}.to_yaml)
23
- end
24
- end
25
-
26
17
  # Returns the value of a tag.
27
18
  def [] tag
28
19
  @properties[tag]
@@ -33,6 +24,10 @@ class TaggedVideo < TaggedFile
33
24
  @properties[tag] = val
34
25
  end
35
26
 
27
+ def type
28
+ TYPE
29
+ end
30
+
36
31
  register_reader(%w(mp4 MP4 mts MTS))
37
32
 
38
33
  end
@@ -5,6 +5,7 @@ class FlickrClient
5
5
 
6
6
  def initialize(api_key, shared_secret)
7
7
  @set_name_to_id = {}
8
+ @set_id_to_date = {}
8
9
  FlickRaw.api_key= api_key
9
10
  FlickRaw.shared_secret=shared_secret
10
11
 
@@ -32,24 +33,30 @@ class FlickrClient
32
33
  client.upload_photo(image, config)
33
34
  end
34
35
 
35
- def add_to_set(photo_id, set_name)
36
- set_id = get_set_id(set_name, photo_id)
37
- client.photosets.addPhoto(:photoset_id => set_id, :photo_id => photo_id)
36
+ def date_of_set(set_name)
37
+ id = id_from_cache(set_name)
38
+
39
+ unless @set_id_to_date.include? id
40
+ info = client.photosets.getInfo(:photoset_id => id)
41
+ primary = client.photos.getInfo(:photo_id => info.primary)
42
+ @set_id_to_date[id] = DateTime.strptime(primary.dates.taken, '%Y-%m-%d %H:%M:%S')
43
+ end
44
+
45
+ return @set_id_to_date[id]
38
46
  end
39
47
 
40
- def get_set_id(set_name, for_photo_id)
41
- unless @set_name_to_id.include? set_name
42
- sets_response = client.photosets.getList #if we don't have it, refresh
43
- @set_name_to_id = Hash[*sets_response.to_a.map{ |set|
44
- [set['title'], set['id']]
45
- }.flatten]
46
- unless @set_name_to_id.include? set_name #if we still don't, create it
47
- created = client.photosets.create(:title => set_name, :primary_photo_id => for_photo_id)
48
- @set_name_to_id = @set_name_to_id.merge({set_name => created.id})
48
+ def add_to_set(photo_id, set_name, photo_date_taken = nil)
49
+ id = id_from_cache(set_name)
50
+
51
+ if id
52
+ client.photosets.addPhoto(:photoset_id => @set_name_to_id[set_name], :photo_id => photo_id)
53
+ else #if we still don't, create it
54
+ created = client.photosets.create(:title => set_name, :primary_photo_id => photo_id)
55
+ @set_name_to_id = @set_name_to_id.merge({set_name => created.id})
56
+ if photo_date_taken
57
+ @set_id_to_date[created.id] = photo_date_taken
49
58
  end
50
59
  end
51
-
52
- @set_name_to_id[set_name]
53
60
  end
54
61
 
55
62
  def get_token
@@ -73,6 +80,19 @@ class FlickrClient
73
80
  end
74
81
 
75
82
  private
83
+
84
+ def id_from_cache(set_name)
85
+ unless @set_name_to_id.include? set_name
86
+ sets_response = client.photosets.getList #if we don't have it, refresh
87
+ @set_name_to_id = Hash[*sets_response.to_a.map { |set|
88
+ [set['title'], set['id']]
89
+ }.flatten]
90
+
91
+ end
92
+
93
+ @set_name_to_id[set_name]
94
+ end
95
+
76
96
  def set_client(client)
77
97
  @client = client
78
98
  end
@@ -5,7 +5,9 @@ require "flickrup/ext/tag_sets"
5
5
  require "flickrup/ext/replacement_tags"
6
6
  require "flickrup/ext/machine_tags"
7
7
  require "flickrup/ext/visibility"
8
+ require "flickrup/ext/sidecar"
8
9
  require "flickrup/archiver"
10
+ require "flickrup/ext/associated_files"
9
11
 
10
12
  class Processor
11
13
  include Logging
@@ -72,21 +74,37 @@ class Processor
72
74
 
73
75
  private
74
76
  def get_uploader
75
- flickr_client = FlickrClient.new(@config[:api_key], @config[:shared_secret])
76
77
 
77
- context = {:flickr_client => flickr_client}
78
+ unless @uploader
78
79
 
79
- uploader = Uploader.new(flickr_client)
80
+ context = get_chain_context()
80
81
 
81
- upload_handlers.reduce(uploader) do |result, clazz|
82
- clazz.new(@config, result, context)
82
+ uploader = Uploader.new(context[:flickr_client])
83
+
84
+ @uploader = upload_handlers.reduce(uploader) do |result, clazz|
85
+ clazz.new(@config, result, context)
86
+ end
83
87
  end
88
+
89
+ return @uploader
84
90
  end
85
91
 
86
92
  def get_archiver
87
- archive_handlers.reduce(Archiver.new) do |result, clazz|
88
- clazz.new(@config, result, {})
93
+ unless @archiver
94
+ @archiver = archive_handlers.reduce(Archiver.new) do |result, clazz|
95
+ clazz.new(@config, result, get_chain_context)
96
+ end
89
97
  end
98
+ return @archiver
99
+ end
100
+
101
+ def get_chain_context
102
+ unless @chain_context
103
+ flickr_client = FlickrClient.new(@config[:api_key], @config[:shared_secret])
104
+ @chain_context = {:flickr_client => flickr_client}
105
+ end
106
+
107
+ return @chain_context
90
108
  end
91
109
 
92
110
  def get_preupload_handlers
@@ -98,7 +116,7 @@ class Processor
98
116
  end
99
117
 
100
118
  def archive_handlers
101
- [TagSets]
119
+ [TagSets, Sidecar, AssociatedFiles]
102
120
  end
103
121
 
104
122
  end
@@ -36,7 +36,7 @@ class SlowListener
36
36
  logger.debug("Watching #{@config[:watch_dir]}...")
37
37
  @listener = Listen.to(@config[:watch_dir])
38
38
  @listener.change(&method(:on_change))
39
- @listener.start(false)
39
+ @listener.start
40
40
 
41
41
  logger.debug("Triggering initial run")
42
42
  schedule
metadata CHANGED
@@ -1,163 +1,140 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: flickrup
3
- version: !ruby/object:Gem::Version
4
- hash: 25
5
- prerelease:
6
- segments:
7
- - 1
8
- - 1
9
- - 5
10
- version: 1.1.5
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.7
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - Jonathan Gilbert
14
8
  autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
-
18
- date: 2012-12-21 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
11
+ date: 2012-12-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
21
14
  name: atomic
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- hash: 23
29
- segments:
30
- - 1
31
- - 0
32
- - 0
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
33
19
  version: 1.0.0
34
20
  type: :runtime
35
- version_requirements: *id001
36
- - !ruby/object:Gem::Dependency
37
- name: listen
38
21
  prerelease: false
39
- requirement: &id002 !ruby/object:Gem::Requirement
40
- none: false
41
- requirements:
42
- - - ">="
43
- - !ruby/object:Gem::Version
44
- hash: 7
45
- segments:
46
- - 0
47
- - 6
48
- - 0
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: 1.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: listen
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
49
33
  version: 0.6.0
50
34
  type: :runtime
51
- version_requirements: *id002
52
- - !ruby/object:Gem::Dependency
53
- name: rufus-scheduler
54
35
  prerelease: false
55
- requirement: &id003 !ruby/object:Gem::Requirement
56
- none: false
57
- requirements:
58
- - - ">="
59
- - !ruby/object:Gem::Version
60
- hash: 15
61
- segments:
62
- - 2
63
- - 0
64
- - 0
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: 0.6.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: rufus-scheduler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
65
47
  version: 2.0.0
66
48
  type: :runtime
67
- version_requirements: *id003
68
- - !ruby/object:Gem::Dependency
69
- name: mini_exiftool
70
49
  prerelease: false
71
- requirement: &id004 !ruby/object:Gem::Requirement
72
- none: false
73
- requirements:
74
- - - ">="
75
- - !ruby/object:Gem::Version
76
- hash: 15
77
- segments:
78
- - 1
79
- - 6
80
- - 0
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: 2.0.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: mini_exiftool
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
81
61
  version: 1.6.0
82
62
  type: :runtime
83
- version_requirements: *id004
84
- - !ruby/object:Gem::Dependency
85
- name: flickraw
86
63
  prerelease: false
87
- requirement: &id005 !ruby/object:Gem::Requirement
88
- none: false
89
- requirements:
90
- - - ">="
91
- - !ruby/object:Gem::Version
92
- hash: 55
93
- segments:
94
- - 0
95
- - 9
96
- - 6
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: 1.6.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: flickraw
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
97
75
  version: 0.9.6
98
76
  type: :runtime
99
- version_requirements: *id005
100
- - !ruby/object:Gem::Dependency
101
- name: json
102
77
  prerelease: false
103
- requirement: &id006 !ruby/object:Gem::Requirement
104
- none: false
105
- requirements:
106
- - - ">="
107
- - !ruby/object:Gem::Version
108
- hash: 11
109
- segments:
110
- - 1
111
- - 7
112
- - 0
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: 0.9.6
83
+ - !ruby/object:Gem::Dependency
84
+ name: json
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
113
89
  version: 1.7.0
114
90
  type: :runtime
115
- version_requirements: *id006
116
- - !ruby/object:Gem::Dependency
117
- name: trollop
118
91
  prerelease: false
119
- requirement: &id007 !ruby/object:Gem::Requirement
120
- none: false
121
- requirements:
122
- - - ">="
123
- - !ruby/object:Gem::Version
124
- hash: 15
125
- segments:
126
- - 2
127
- - 0
128
- - 0
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: 1.7.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: trollop
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
129
103
  version: 2.0.0
130
104
  type: :runtime
131
- version_requirements: *id007
132
- - !ruby/object:Gem::Dependency
133
- name: inifile
134
105
  prerelease: false
135
- requirement: &id008 !ruby/object:Gem::Requirement
136
- none: false
137
- requirements:
138
- - - ">="
139
- - !ruby/object:Gem::Version
140
- hash: 15
141
- segments:
142
- - 2
143
- - 0
144
- - 0
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: 2.0.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: inifile
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '>='
116
+ - !ruby/object:Gem::Version
145
117
  version: 2.0.0
146
118
  type: :runtime
147
- version_requirements: *id008
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '>='
123
+ - !ruby/object:Gem::Version
124
+ version: 2.0.0
148
125
  description: Flickr auto uploading script
149
126
  email: bb..jgilbert@xoxy.net
150
- executables:
127
+ executables:
151
128
  - flickrup
152
129
  extensions: []
153
-
154
130
  extra_rdoc_files: []
155
-
156
- files:
131
+ files:
157
132
  - lib/flickrup/archiver.rb
133
+ - lib/flickrup/ext/associated_files.rb
158
134
  - lib/flickrup/ext/machine_tags.rb
159
135
  - lib/flickrup/ext/prefixed_extension.rb
160
136
  - lib/flickrup/ext/replacement_tags.rb
137
+ - lib/flickrup/ext/sidecar.rb
161
138
  - lib/flickrup/ext/tag_sets.rb
162
139
  - lib/flickrup/ext/visibility.rb
163
140
  - lib/flickrup/filetype/inifile.rb
@@ -178,36 +155,25 @@ files:
178
155
  - README.md
179
156
  homepage: http://bitbucket.org/jgilbert/flickrup
180
157
  licenses: []
181
-
158
+ metadata: {}
182
159
  post_install_message:
183
160
  rdoc_options: []
184
-
185
- require_paths:
161
+ require_paths:
186
162
  - lib
187
- required_ruby_version: !ruby/object:Gem::Requirement
188
- none: false
189
- requirements:
190
- - - ">="
191
- - !ruby/object:Gem::Version
192
- hash: 3
193
- segments:
194
- - 0
195
- version: "0"
196
- required_rubygems_version: !ruby/object:Gem::Requirement
197
- none: false
198
- requirements:
199
- - - ">="
200
- - !ruby/object:Gem::Version
201
- hash: 3
202
- segments:
203
- - 0
204
- version: "0"
163
+ required_ruby_version: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - '>='
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
168
+ required_rubygems_version: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - '>='
171
+ - !ruby/object:Gem::Version
172
+ version: '0'
205
173
  requirements: []
206
-
207
174
  rubyforge_project:
208
- rubygems_version: 1.8.24
175
+ rubygems_version: 2.0.3
209
176
  signing_key:
210
- specification_version: 3
177
+ specification_version: 4
211
178
  summary: Flickr Uploader!
212
179
  test_files: []
213
-