fotki-export 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/README.rdoc +14 -0
- data/Rakefile +58 -0
- data/VERSION +1 -0
- data/bin/fotki-export +41 -0
- data/fotki-export.gemspec +62 -0
- data/lib/fotki.rb +106 -0
- metadata +169 -0
data/README.rdoc
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
== Fotki Export -- Tool to download picture from Fotki.com
|
2
|
+
|
3
|
+
== Installing Fotki Export
|
4
|
+
$ gem install fotki-export
|
5
|
+
|
6
|
+
== Usage
|
7
|
+
|
8
|
+
fotki-export -u <fotki username> -p <fotki password> -d </path/to/save/photos> -b [firefox|chrome|ie]
|
9
|
+
-u, --user USER username
|
10
|
+
-p, --pass PASSWORD password
|
11
|
+
-d, --dir DIR directory
|
12
|
+
-b --browser BROWSER (firefox|chrome|ie) browser
|
13
|
+
|
14
|
+
fotki-export -u fotki_user -p fotki_password -d /tmp/fotki -b firefox
|
data/Rakefile
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake/gempackagetask'
|
3
|
+
require 'rake/rdoctask'
|
4
|
+
begin
|
5
|
+
require 'bundler'
|
6
|
+
rescue LoadError
|
7
|
+
puts 'Bundler not available. Install it with: [sudo] gem install bundler'
|
8
|
+
end
|
9
|
+
begin
|
10
|
+
require 'jeweler'
|
11
|
+
rescue LoadError
|
12
|
+
puts 'Jeweler not available. Install it with: [sudo] gem install jeweler'
|
13
|
+
end
|
14
|
+
|
15
|
+
task :default => :gemspec
|
16
|
+
|
17
|
+
Jeweler::Tasks.new do |gemspec|
|
18
|
+
gemspec.name = 'fotki-export'
|
19
|
+
gemspec.summary = 'Fotki.com photo export tool.'
|
20
|
+
gemspec.description = 'Simple command line to to download all your photos from Fotki.com'
|
21
|
+
gemspec.email = 'gene.drabkin@gmail.com'
|
22
|
+
gemspec.homepage = 'https://github.com/cloocher/fotki-exporter'
|
23
|
+
gemspec.authors = ['Gene Drabkin']
|
24
|
+
gemspec.files = FileList['fotki-export.gemspec', 'Rakefile', 'README', 'VERSION', 'lib/**/*', 'bin/**/*']
|
25
|
+
gemspec.add_dependency 'watir-webdriver', '>= 0.2.2'
|
26
|
+
gemspec.executables = ['fotki-export']
|
27
|
+
gemspec.requirements = ['none']
|
28
|
+
gemspec.bindir = 'bin'
|
29
|
+
gemspec.add_bundler_dependencies
|
30
|
+
end
|
31
|
+
|
32
|
+
desc 'Release gem'
|
33
|
+
task :'release:gem' do
|
34
|
+
%x(
|
35
|
+
rake gemspec
|
36
|
+
rake build
|
37
|
+
rake install
|
38
|
+
git add .
|
39
|
+
)
|
40
|
+
puts 'Commit message:'
|
41
|
+
message = STDIN.gets
|
42
|
+
|
43
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ''
|
44
|
+
|
45
|
+
%x(
|
46
|
+
git commit -m '#{message}'
|
47
|
+
git push origin master
|
48
|
+
gem push pkg/fotki-export-#{version}.gem
|
49
|
+
)
|
50
|
+
end
|
51
|
+
|
52
|
+
Rake::RDocTask.new do |rdoc|
|
53
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ''
|
54
|
+
rdoc.rdoc_dir = 'rdoc'
|
55
|
+
rdoc.title = "fotki-export #{version}"
|
56
|
+
rdoc.rdoc_files.include('README*')
|
57
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
58
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.1
|
data/bin/fotki-export
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Copyright 2011 Gene Drabkin
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
|
17
|
+
$:.unshift(File::join(File::dirname(File::dirname(__FILE__)), 'lib'))
|
18
|
+
|
19
|
+
require 'rubygems'
|
20
|
+
require 'optparse'
|
21
|
+
require 'fotki'
|
22
|
+
|
23
|
+
username = password = directory = nil
|
24
|
+
browser = 'firefox'
|
25
|
+
|
26
|
+
opts = OptionParser.new do |opts|
|
27
|
+
opts.banner = 'Usage: fotki-export -u <fotki username> -p <fotki password> -d </path/to/save/photos> -b [firefox|chrome|ie]'
|
28
|
+
opts.on('-u', '--user USER', 'username') {|u| username = u}
|
29
|
+
opts.on('-p', '--pass PASSWORD', 'password') {|p| password = p}
|
30
|
+
opts.on('-d', '--dir DIR', 'directory') {|d| directory = d}
|
31
|
+
opts.on('-b', '--browser BROWSER (firefox|chrome|ie)', 'browser') {|b| browser = b}
|
32
|
+
end
|
33
|
+
|
34
|
+
opts.parse!(ARGV)
|
35
|
+
|
36
|
+
unless username and password and directory
|
37
|
+
puts opts
|
38
|
+
exit 1
|
39
|
+
end
|
40
|
+
|
41
|
+
Fotki.new(username, password, directory, browser.to_sym).export
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{fotki-export}
|
8
|
+
s.version = "0.0.1"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Gene Drabkin"]
|
12
|
+
s.date = %q{2011-04-30}
|
13
|
+
s.description = %q{Simple command line to to download all your photos from Fotki.com}
|
14
|
+
s.email = %q{gene.drabkin@gmail.com}
|
15
|
+
s.executables = ["fotki-export"]
|
16
|
+
s.extra_rdoc_files = [
|
17
|
+
"README.rdoc"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
"Rakefile",
|
21
|
+
"VERSION",
|
22
|
+
"bin/fotki-export",
|
23
|
+
"fotki-export.gemspec",
|
24
|
+
"lib/fotki.rb"
|
25
|
+
]
|
26
|
+
s.homepage = %q{https://github.com/cloocher/fotki-exporter}
|
27
|
+
s.require_paths = ["lib"]
|
28
|
+
s.requirements = ["none"]
|
29
|
+
s.rubygems_version = %q{1.7.2}
|
30
|
+
s.summary = %q{Fotki.com photo export tool.}
|
31
|
+
|
32
|
+
if s.respond_to? :specification_version then
|
33
|
+
s.specification_version = 3
|
34
|
+
|
35
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
36
|
+
s.add_runtime_dependency(%q<watir-webdriver>, [">= 0"])
|
37
|
+
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
38
|
+
s.add_development_dependency(%q<gemcutter>, [">= 0"])
|
39
|
+
s.add_runtime_dependency(%q<watir-webdriver>, [">= 0.2.2"])
|
40
|
+
s.add_runtime_dependency(%q<watir-webdriver>, [">= 0"])
|
41
|
+
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
42
|
+
s.add_development_dependency(%q<gemcutter>, [">= 0"])
|
43
|
+
else
|
44
|
+
s.add_dependency(%q<watir-webdriver>, [">= 0"])
|
45
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
46
|
+
s.add_dependency(%q<gemcutter>, [">= 0"])
|
47
|
+
s.add_dependency(%q<watir-webdriver>, [">= 0.2.2"])
|
48
|
+
s.add_dependency(%q<watir-webdriver>, [">= 0"])
|
49
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
50
|
+
s.add_dependency(%q<gemcutter>, [">= 0"])
|
51
|
+
end
|
52
|
+
else
|
53
|
+
s.add_dependency(%q<watir-webdriver>, [">= 0"])
|
54
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
55
|
+
s.add_dependency(%q<gemcutter>, [">= 0"])
|
56
|
+
s.add_dependency(%q<watir-webdriver>, [">= 0.2.2"])
|
57
|
+
s.add_dependency(%q<watir-webdriver>, [">= 0"])
|
58
|
+
s.add_dependency(%q<jeweler>, [">= 0"])
|
59
|
+
s.add_dependency(%q<gemcutter>, [">= 0"])
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
data/lib/fotki.rb
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
# Copyright 2011 Gene Drabkin
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
|
14
|
+
require 'watir-webdriver'
|
15
|
+
require 'open-uri'
|
16
|
+
|
17
|
+
class Fotki
|
18
|
+
|
19
|
+
def initialize(username, password, directory, browser = :firefox)
|
20
|
+
@username, @password, @directory, @browser = username, password, directory, browser
|
21
|
+
@client = Watir::Browser.new(@browser)
|
22
|
+
end
|
23
|
+
|
24
|
+
def export
|
25
|
+
@client.goto('http://fotki.com')
|
26
|
+
|
27
|
+
# logout if logged in
|
28
|
+
logout_link = @client.link(:title, 'Logout...')
|
29
|
+
logout_link.click if logout_link.exists?
|
30
|
+
|
31
|
+
# login
|
32
|
+
puts 'logging in'
|
33
|
+
@client.goto('http://login.fotki.com/')
|
34
|
+
@client.text_field(:name, 'login').set(@username)
|
35
|
+
@client.text_field(:name, 'password').set(@password)
|
36
|
+
@client.button(:value, 'Login').click
|
37
|
+
|
38
|
+
photo_count = 0
|
39
|
+
puts 'opening all albums'
|
40
|
+
@client.goto('http://public.fotki.com/Lenocheka/')
|
41
|
+
puts 'going through every album folder'
|
42
|
+
folder_links = @client.div(:id, 'dtree').links
|
43
|
+
folder_links.each do |folder_link|
|
44
|
+
# only open folders with photos
|
45
|
+
if folder_link.href.downcase.match(/my-pic\/\w+\//i)
|
46
|
+
puts "opening folder #{folder_link.text}"
|
47
|
+
@client.goto(folder_link.href)
|
48
|
+
picture_folder_url = @client.url
|
49
|
+
|
50
|
+
puts 'going through every album'
|
51
|
+
albums_div = @client.div(:id, 'albums_loop')
|
52
|
+
album_index = 1
|
53
|
+
# loop through all albums
|
54
|
+
loop do
|
55
|
+
album_link = albums_div.link(:class => 'title', :index => album_index)
|
56
|
+
# stop when no more albums left
|
57
|
+
break unless album_link.exists?
|
58
|
+
album_name = album_link.text.gsub(/\//, ' - ')
|
59
|
+
puts "album ##{album_index} \"#{album_name}\""
|
60
|
+
album_link.click
|
61
|
+
|
62
|
+
dir_path = "#{@directory}/#{album_name}"
|
63
|
+
# skip albums that have been downloaded already
|
64
|
+
unless File.exists?(dir_path)
|
65
|
+
puts 'loading first photo in album'
|
66
|
+
first_link = @client.link(:xpath, "//div[@class='thumbnails']//a/img/..")
|
67
|
+
first_link.click
|
68
|
+
|
69
|
+
puts 'downloading all photos within album'
|
70
|
+
# loop through all photos within album
|
71
|
+
loop do
|
72
|
+
download_link = @client.link(:xpath, "//li[@class='single']/a[contains(@href, 'http://images')]")
|
73
|
+
if download_link.exists?
|
74
|
+
photo_url = download_link.href
|
75
|
+
photo_name = photo_url.split(/\//).last
|
76
|
+
|
77
|
+
`mkdir -p "#{dir_path}"`
|
78
|
+
file_path = "#{dir_path}/#{photo_name}"
|
79
|
+
# download photo
|
80
|
+
unless File.exist?(file_path)
|
81
|
+
photo_count += 1
|
82
|
+
puts "[#{photo_count}] downloading photo #{photo_name}"
|
83
|
+
File.open(file_path, 'w') do |output|
|
84
|
+
open(photo_url) do |input|
|
85
|
+
output << input.read
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
count_link = @client.link(:id, 'btn_thumbs')
|
92
|
+
counts = count_link.spans.last.text.split(/\//).map { |e| e.to_i }
|
93
|
+
# go to next photo unless on the last one
|
94
|
+
break if counts.first == counts.last
|
95
|
+
photo_nav_div = @client.div(:id, 'photo_navig')
|
96
|
+
photo_nav_div.link(:text, 'Next').click
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
album_index += 1
|
101
|
+
@client.goto(picture_folder_url)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
metadata
ADDED
@@ -0,0 +1,169 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: fotki-export
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Gene Drabkin
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-04-30 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
22
|
+
none: false
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
hash: 3
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
version: "0"
|
30
|
+
name: watir-webdriver
|
31
|
+
prerelease: false
|
32
|
+
type: :runtime
|
33
|
+
requirement: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
36
|
+
none: false
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
hash: 3
|
41
|
+
segments:
|
42
|
+
- 0
|
43
|
+
version: "0"
|
44
|
+
name: jeweler
|
45
|
+
prerelease: false
|
46
|
+
type: :development
|
47
|
+
requirement: *id002
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
hash: 3
|
55
|
+
segments:
|
56
|
+
- 0
|
57
|
+
version: "0"
|
58
|
+
name: gemcutter
|
59
|
+
prerelease: false
|
60
|
+
type: :development
|
61
|
+
requirement: *id003
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
64
|
+
none: false
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
hash: 19
|
69
|
+
segments:
|
70
|
+
- 0
|
71
|
+
- 2
|
72
|
+
- 2
|
73
|
+
version: 0.2.2
|
74
|
+
name: watir-webdriver
|
75
|
+
prerelease: false
|
76
|
+
type: :runtime
|
77
|
+
requirement: *id004
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
80
|
+
none: false
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
hash: 3
|
85
|
+
segments:
|
86
|
+
- 0
|
87
|
+
version: "0"
|
88
|
+
name: watir-webdriver
|
89
|
+
prerelease: false
|
90
|
+
type: :runtime
|
91
|
+
requirement: *id005
|
92
|
+
- !ruby/object:Gem::Dependency
|
93
|
+
version_requirements: &id006 !ruby/object:Gem::Requirement
|
94
|
+
none: false
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
hash: 3
|
99
|
+
segments:
|
100
|
+
- 0
|
101
|
+
version: "0"
|
102
|
+
name: jeweler
|
103
|
+
prerelease: false
|
104
|
+
type: :development
|
105
|
+
requirement: *id006
|
106
|
+
- !ruby/object:Gem::Dependency
|
107
|
+
version_requirements: &id007 !ruby/object:Gem::Requirement
|
108
|
+
none: false
|
109
|
+
requirements:
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
hash: 3
|
113
|
+
segments:
|
114
|
+
- 0
|
115
|
+
version: "0"
|
116
|
+
name: gemcutter
|
117
|
+
prerelease: false
|
118
|
+
type: :development
|
119
|
+
requirement: *id007
|
120
|
+
description: Simple command line to to download all your photos from Fotki.com
|
121
|
+
email: gene.drabkin@gmail.com
|
122
|
+
executables:
|
123
|
+
- fotki-export
|
124
|
+
extensions: []
|
125
|
+
|
126
|
+
extra_rdoc_files:
|
127
|
+
- README.rdoc
|
128
|
+
files:
|
129
|
+
- Rakefile
|
130
|
+
- VERSION
|
131
|
+
- bin/fotki-export
|
132
|
+
- fotki-export.gemspec
|
133
|
+
- lib/fotki.rb
|
134
|
+
- README.rdoc
|
135
|
+
homepage: https://github.com/cloocher/fotki-exporter
|
136
|
+
licenses: []
|
137
|
+
|
138
|
+
post_install_message:
|
139
|
+
rdoc_options: []
|
140
|
+
|
141
|
+
require_paths:
|
142
|
+
- lib
|
143
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
144
|
+
none: false
|
145
|
+
requirements:
|
146
|
+
- - ">="
|
147
|
+
- !ruby/object:Gem::Version
|
148
|
+
hash: 3
|
149
|
+
segments:
|
150
|
+
- 0
|
151
|
+
version: "0"
|
152
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ">="
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
hash: 3
|
158
|
+
segments:
|
159
|
+
- 0
|
160
|
+
version: "0"
|
161
|
+
requirements:
|
162
|
+
- none
|
163
|
+
rubyforge_project:
|
164
|
+
rubygems_version: 1.7.2
|
165
|
+
signing_key:
|
166
|
+
specification_version: 3
|
167
|
+
summary: Fotki.com photo export tool.
|
168
|
+
test_files: []
|
169
|
+
|