flickr_sync 0.0.1

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.
data/.gemtest ADDED
File without changes
data/HISTORY.rdoc ADDED
@@ -0,0 +1,9 @@
1
+ == 0.0.1
2
+
3
+ First release.
4
+
5
+ Issues:
6
+
7
+ * Relies on 'find' rather than a pure ruby path iteration
8
+ * Paths are not dealt with very well at all.
9
+ * Everything works but cli is a massive and awful class.
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Mark Ryall
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,27 @@
1
+ = flickr sync
2
+
3
+ This is a command line utility to synchronise a folder containing images with flickr.
4
+
5
+ = Usage
6
+
7
+ Here you sit expectantly in front of a computer at the command line.
8
+
9
+ == Install
10
+
11
+ gem install flickr_synch_
12
+
13
+ == Launch
14
+
15
+ flickr_sync --help
16
+
17
+ By default, this will check whether a photo with the same title already exists. If you specify the --optimistic flag, the duplicate check will be skipped.
18
+
19
+ All photos will be uploaded with visibility limited to family and titles will be the same as the file name.
20
+
21
+ The past uploads will be stored in a file called written.txt and any duplicates (ie. more than one copy of the same image found on flickr) will be stored in a file called duplicates.txt.
22
+
23
+ = Future plans for world domination
24
+
25
+ * Perhaps use absolute paths for file names
26
+ * Replace hideous find command with a path iterator
27
+ * Handle videos
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ begin
2
+ require 'gemesis/rake'
3
+ rescue Exception
4
+ puts "gemesis related tasks will only be available if you 'gem install gemesis'"
5
+ end
6
+
7
+ desc 'execute specifications'
8
+ task :test do
9
+ sh 'rspec spec'
10
+ end
data/bin/flickr_sync ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH << File.dirname(__FILE__)+'/../lib'
4
+ require 'flickr_sync'
5
+ FlickrSync::Cli.run
@@ -0,0 +1,6 @@
1
+ module FlickrSync
2
+ end
3
+
4
+ require 'flickr_sync/preferences'
5
+ require 'flickr_sync/prompt'
6
+ require 'flickr_sync/cli'
@@ -0,0 +1,75 @@
1
+ require 'clamp'
2
+ require 'fleakr'
3
+ require 'pathname'
4
+ require 'splat'
5
+
6
+ module FlickrSync
7
+ class Cli < Clamp::Command
8
+ option "--optimistic", :flag, "assume there are no duplicates"
9
+ parameter "DIRECTORY_PATH", "the folder containing images"
10
+
11
+ def execute
12
+ preferences = FlickrSync::Preferences.new
13
+ prompt = FlickrSync::Prompt.new STDIN, STDOUT
14
+
15
+ preferences[:api_key] ||= prompt.answer 'What is your Flickr API key'
16
+ preferences[:shared_secret] ||= prompt.answer 'What is your Flickr Shared Secret'
17
+ preferences[:auth_token] ||= prompt.answer 'What is your Flickr Auth'
18
+ preferences[:username] ||= prompt.answer 'What is your Flickr username'
19
+
20
+ Fleakr.api_key = preferences[:api_key]
21
+ Fleakr.shared_secret = preferences[:shared_secret]
22
+ Fleakr.auth_token = preferences[:auth_token]
23
+ user = Fleakr.user preferences[:username]
24
+
25
+ written_path = File.join directory_path, 'written.txt'
26
+ duplicates_path = File.join directory_path, 'duplicates.txt'
27
+
28
+ allfiles = `find #{directory_path}/*`.split("\n").select {|p| ['.jpg', '.gif'].include? File.extname(p).downcase}
29
+ puts "Found #{allfiles.count} image files"
30
+ writtenfiles = load_list written_path
31
+ puts "Found #{writtenfiles.count} previously sent files"
32
+ newfiles = allfiles - writtenfiles
33
+ puts "Found #{newfiles.count} files to send"
34
+
35
+ newfiles.each_with_index do |file, index|
36
+ path = Pathname.new file
37
+ puts "#{path} (#{index+1}/#{newfiles.count})"
38
+ unless optimistic?
39
+ results = Fleakr.search :user_id => user.id, :text => path.basename.to_s.split('.').first
40
+ skip_upload = false
41
+ unless results.empty?
42
+ ids = results.map {|r| r.id }.join ','
43
+ puts "Found #{results.size} results on flickr: #{ids}"
44
+ results.each {|r| r.small.url.to_launcher }
45
+ file.to_launcher
46
+ if prompt.ask('Had the photo already been uploaded', true)
47
+ skip_upload = true
48
+ if results.size > 1
49
+ File.open(duplicates_path, 'a') {|f| f.puts "#{file},#{ids}"} if prompt.ask('Are these all duplicates', true)
50
+ end
51
+ end
52
+ end
53
+ end
54
+ if skip_upload
55
+ puts "skipping upload"
56
+ else
57
+ puts "uploading photo"
58
+ Fleakr.upload file, :viewable_by => :family, :hide? => true
59
+ end
60
+ File.open(written_path, 'a') {|f| f.puts file }
61
+ end
62
+ end
63
+ private
64
+ def load_list path
65
+ return [] unless File.exist? path
66
+ lines = []
67
+ File.open path do |file|
68
+ while line = file.gets
69
+ lines << line.chomp
70
+ end
71
+ end
72
+ lines
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,31 @@
1
+ require 'yaml'
2
+
3
+ module FlickrSync
4
+ class Preferences
5
+ def initialize
6
+ @preference_path = home_path '.flickr_sync'
7
+ if File.exists? @preference_path
8
+ @preferences = YAML.load File.read(@preference_path)
9
+ else
10
+ @preferences = {}
11
+ end
12
+ end
13
+
14
+ def [] key
15
+ @preferences[key]
16
+ end
17
+
18
+ def []= key, value
19
+ @preferences[key] = value
20
+ persist
21
+ end
22
+ private
23
+ def home_path *paths
24
+ File.join File.expand_path('~'), *paths
25
+ end
26
+
27
+ def persist
28
+ File.open(@preference_path, 'w') {|f| f.puts @preferences.to_yaml}
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,19 @@
1
+ module FlickrSync
2
+ class Prompt
3
+ def initialize inio, outio
4
+ @inio, @outio = inio, outio
5
+ end
6
+
7
+ def ask prompt, default
8
+ default_answer = default ? 'y' : 'n'
9
+ response = answer prompt, default_answer
10
+ response = default_answer if response.empty?
11
+ response.start_with? 'y'
12
+ end
13
+
14
+ def answer prompt, default=nil
15
+ @outio.print default ? "#{prompt} [#{default}] ? " : "#{prompt} ? "
16
+ @inio.gets.chomp.strip
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,39 @@
1
+ require File.expand_path '../../spec_helper.rb', __FILE__
2
+
3
+ describe FlickrSync::Prompt do
4
+ before do
5
+ @inio = stub 'inio', :gets => ''
6
+ @outio = stub 'outio', :print => nil
7
+ @prompt = FlickrSync::Prompt.new @inio, @outio
8
+ end
9
+
10
+ describe '#ask' do
11
+ it 'should write prompt with true default' do
12
+ @outio.should_receive(:print).with 'Is this it [y] ? '
13
+ @prompt.ask 'Is this it', true
14
+ end
15
+
16
+ it 'should write prompt with false default' do
17
+ @outio.should_receive(:print).with 'Is this it [n] ? '
18
+ @prompt.ask 'Is this it', false
19
+ end
20
+
21
+ it 'should return true when true is default and nothing is entered' do
22
+ @prompt.ask('anything', true).should be_true
23
+ end
24
+
25
+ it 'should return false when false is default and nothing is entered' do
26
+ @prompt.ask('anything', false).should be_false
27
+ end
28
+
29
+ it 'should return false when true is default and n is entered' do
30
+ @inio.should_receive(:gets).and_return 'n'
31
+ @prompt.ask('anything', true).should be_false
32
+ end
33
+
34
+ it 'should return true when false is default and y is entered' do
35
+ @inio.should_receive(:gets).and_return 'y'
36
+ @prompt.ask('anything', true).should be_true
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,6 @@
1
+ require 'rubygems'
2
+ require 'rspec'
3
+
4
+ $LOAD_PATH << File.dirname(__FILE__)+'/../lib'
5
+
6
+ require 'flickr_sync'
metadata ADDED
@@ -0,0 +1,136 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: flickr_sync
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.0.1
6
+ platform: ruby
7
+ authors:
8
+ - Mark Ryall
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-06-05 00:00:00 +10:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: clamp
18
+ prerelease: false
19
+ requirement: &id001 !ruby/object:Gem::Requirement
20
+ none: false
21
+ requirements:
22
+ - - ~>
23
+ - !ruby/object:Gem::Version
24
+ version: "0"
25
+ type: :runtime
26
+ version_requirements: *id001
27
+ - !ruby/object:Gem::Dependency
28
+ name: fleakr
29
+ prerelease: false
30
+ requirement: &id002 !ruby/object:Gem::Requirement
31
+ none: false
32
+ requirements:
33
+ - - ~>
34
+ - !ruby/object:Gem::Version
35
+ version: "0"
36
+ type: :runtime
37
+ version_requirements: *id002
38
+ - !ruby/object:Gem::Dependency
39
+ name: splat
40
+ prerelease: false
41
+ requirement: &id003 !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ~>
45
+ - !ruby/object:Gem::Version
46
+ version: "0"
47
+ type: :runtime
48
+ version_requirements: *id003
49
+ - !ruby/object:Gem::Dependency
50
+ name: rake
51
+ prerelease: false
52
+ requirement: &id004 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ~>
56
+ - !ruby/object:Gem::Version
57
+ version: "0.8"
58
+ type: :development
59
+ version_requirements: *id004
60
+ - !ruby/object:Gem::Dependency
61
+ name: gemesis
62
+ prerelease: false
63
+ requirement: &id005 !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: "0"
69
+ type: :development
70
+ version_requirements: *id005
71
+ - !ruby/object:Gem::Dependency
72
+ name: rspec
73
+ prerelease: false
74
+ requirement: &id006 !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ~>
78
+ - !ruby/object:Gem::Version
79
+ version: "2"
80
+ type: :development
81
+ version_requirements: *id006
82
+ description: |
83
+ Flickr is a very effective way to backup lots of images but the upload tools are all pretty awful.
84
+
85
+ Hopefully this is marginally less painful
86
+
87
+ email: mark@ryall.name
88
+ executables:
89
+ - flickr_sync
90
+ extensions: []
91
+
92
+ extra_rdoc_files: []
93
+
94
+ files:
95
+ - lib/flickr_sync/cli.rb
96
+ - lib/flickr_sync/preferences.rb
97
+ - lib/flickr_sync/prompt.rb
98
+ - lib/flickr_sync.rb
99
+ - spec/flickr_sync/prompt_spec.rb
100
+ - spec/spec_helper.rb
101
+ - bin/flickr_sync
102
+ - README.rdoc
103
+ - MIT-LICENSE
104
+ - HISTORY.rdoc
105
+ - Rakefile
106
+ - .gemtest
107
+ has_rdoc: true
108
+ homepage: http://github.com/markryall/flickr_sync
109
+ licenses: []
110
+
111
+ post_install_message:
112
+ rdoc_options: []
113
+
114
+ require_paths:
115
+ - lib
116
+ required_ruby_version: !ruby/object:Gem::Requirement
117
+ none: false
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ version: "0"
122
+ required_rubygems_version: !ruby/object:Gem::Requirement
123
+ none: false
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ version: "0"
128
+ requirements: []
129
+
130
+ rubyforge_project:
131
+ rubygems_version: 1.5.2
132
+ signing_key:
133
+ specification_version: 3
134
+ summary: command line utility to synch a folder with flickr
135
+ test_files: []
136
+