flickrup 1.1.5 → 1.1.7

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: 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
-