multistockphoto 0.6.1 → 0.6.2
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +13 -0
- data/README.txt +10 -6
- data/bin/multistockphoto +30 -16
- data/lib/multistockphoto/generic_site.rb +1 -2
- data/lib/multistockphoto/photo.rb +12 -2
- data/lib/multistockphoto/site_fotolia.rb +15 -9
- data/lib/multistockphoto/site_photocase.rb +27 -26
- data/lib/multistockphoto/site_zoonar.rb +20 -12
- data/lib/multistockphoto/version.rb +1 -1
- data/test/test_multistockphoto.rb +30 -40
- data/website/index.html +27 -11
- data/website/index.txt +21 -6
- metadata +2 -2
data/History.txt
CHANGED
@@ -1,19 +1,32 @@
|
|
1
|
+
== 0.6.2 2008-06-14
|
2
|
+
* 3 minor enhancements
|
3
|
+
* new method Sitename.can_handle_orientation?
|
4
|
+
* --tags-only Schalter sendet nur Photos mit .tags Datei
|
5
|
+
* Zoonar: besser abgesichert gegen Site-down
|
6
|
+
* 2 bug fix
|
7
|
+
* an Fotolia wurden die nicht gedrehten, anstatt die gedrehten Bilder gesendet
|
8
|
+
* an Zoonar wurden die nicht gedrehten, anstatt die gedrehten Bilder gesendet
|
9
|
+
|
1
10
|
== 0.6.1 2008-06-13
|
2
11
|
* 1 bug fix
|
3
12
|
* hm, das Schreiben von Keywords scheint nicht aktiviert gewesen zu sein...
|
13
|
+
|
4
14
|
== 0.6.0 2008-06-10
|
5
15
|
* 4 enhancements
|
6
16
|
* Sendedauer fuer jedes Photo beim Senden auflisten
|
7
17
|
* Option --ordered fuer alphabetisches Senden der Files
|
8
18
|
* Option --no-tags erstellt (auch in Verbindung mit --ordered)
|
9
19
|
* neues Sender-Objekt fuer zentrale Upload-Funktionen
|
20
|
+
|
10
21
|
== 0.5.2 2008-05-30
|
11
22
|
* 1 bug fix
|
12
23
|
* Ja ja, Thomas. Erst eine dicke Lippe riskieren, von wegen "fehlerfrei" und dann noch nichtmal die Sprachelemente von Ruby beherrschen... skip -> next
|
13
24
|
* Keine weiteren Sendeversuche, wenn fuer eine Site bereits die maximale Upload-Anzahl / Tag erreicht ist und dieser Schalter in Konfigurationsdatei gesetzt
|
25
|
+
|
14
26
|
== 0.5.1 2008-05-29
|
15
27
|
* 1 bug fix
|
16
28
|
* Fehlerbehandlung wenn Site keine Photos mehr annimmt
|
29
|
+
|
17
30
|
== 0.5.0 2008-05-27
|
18
31
|
* 2 major enhancements:
|
19
32
|
* Schalter in Konfigurationsdatei :total_per_day (pro Site)
|
data/README.txt
CHANGED
@@ -1,26 +1,30 @@
|
|
1
1
|
= multistockphoto
|
2
2
|
|
3
|
-
*
|
3
|
+
* http://multistockphoto.rubyforge.org
|
4
4
|
|
5
5
|
== DESCRIPTION:
|
6
6
|
|
7
|
-
|
7
|
+
Dieses Programm kann eigene Photos an mehrere definierte Photo-Sites (wie
|
8
|
+
fotolia.de, zoonar.de, photocase.de, etc.) hochladen um sie dort zum Verkauf
|
9
|
+
anzubieten.
|
8
10
|
|
9
11
|
== FEATURES/PROBLEMS:
|
10
12
|
|
11
|
-
*
|
13
|
+
* automatisiertes Hochladen an mehrere Sites
|
14
|
+
* automatisches Drehen von Hochformatphotos, falls die Site dies nicht selbstaendig erkennen kann
|
15
|
+
* automatische Verarbeiten von Keywords
|
12
16
|
|
13
17
|
== SYNOPSIS:
|
14
18
|
|
15
|
-
|
19
|
+
ausfuehrliche Dokumentation zur Benutzung, siehe http://multistockphoto.rubyforge.org
|
16
20
|
|
17
21
|
== REQUIREMENTS:
|
18
22
|
|
19
|
-
*
|
23
|
+
* neben den abhaengigen gems muss ImageMagick installiert sein
|
20
24
|
|
21
25
|
== INSTALL:
|
22
26
|
|
23
|
-
*
|
27
|
+
* sudo gem install multistockphoto
|
24
28
|
|
25
29
|
== LICENSE:
|
26
30
|
|
data/bin/multistockphoto
CHANGED
@@ -53,10 +53,19 @@ Choice.options do
|
|
53
53
|
long '--send-all'
|
54
54
|
desc 'Send all files'
|
55
55
|
action do
|
56
|
-
$send_all=true
|
56
|
+
$send_all = true
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
|
+
option :tags_only do
|
61
|
+
short '-1'
|
62
|
+
long '--tags-only'
|
63
|
+
desc 'Send only photos with keywords'
|
64
|
+
action do
|
65
|
+
$tags_only = true
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
60
69
|
option :verbose do
|
61
70
|
short '-y'
|
62
71
|
long '--verbose'
|
@@ -201,8 +210,8 @@ def send_all
|
|
201
210
|
total_transfers = 0
|
202
211
|
total = {}
|
203
212
|
errors = {}
|
204
|
-
sites = [:fotolia, :zoonar, :photocase]
|
205
|
-
|
213
|
+
#sites = [:fotolia, :zoonar, :photocase]
|
214
|
+
$active_sites.each {|site|
|
206
215
|
total[site] = 0
|
207
216
|
errors[site] = 0
|
208
217
|
}
|
@@ -212,11 +221,11 @@ def send_all
|
|
212
221
|
# - true: we do the rotation
|
213
222
|
# - false: the site does the rotation automatically
|
214
223
|
# change to false if a photo site can automatically rotate photos
|
215
|
-
rotate_photos = {
|
216
|
-
:fotolia => true,
|
217
|
-
:zoonar => true,
|
218
|
-
:photocase => true,
|
219
|
-
}
|
224
|
+
# rotate_photos = {
|
225
|
+
# :fotolia => true,
|
226
|
+
# :zoonar => true,
|
227
|
+
# :photocase => true,
|
228
|
+
# }
|
220
229
|
|
221
230
|
done = {
|
222
231
|
:fotolia => false,
|
@@ -228,14 +237,14 @@ def send_all
|
|
228
237
|
:zoonar => 999_999_999,
|
229
238
|
:photocase => 999_999_999,
|
230
239
|
}
|
231
|
-
|
240
|
+
$active_sites.each {|site|
|
232
241
|
# dynamisches Site.new("site")
|
233
242
|
s = eval("#{site.to_s.capitalize}"+".new(#{site.to_s.capitalize})")
|
234
243
|
if s.total_per_day
|
235
244
|
remaining[site] = s.total_per_day - s.heute_schon_gesendet(site)
|
236
245
|
end
|
237
246
|
}
|
238
|
-
allfiles = Dir.glob($upload_dir
|
247
|
+
allfiles = Dir.glob(File.join($upload_dir,'*'))
|
239
248
|
if $ordered
|
240
249
|
allfiles.sort!
|
241
250
|
end
|
@@ -245,15 +254,20 @@ def send_all
|
|
245
254
|
if filename.upcase =~ PICTURE_FILES
|
246
255
|
total_per_site_flag = $total_per_site
|
247
256
|
photo = Photo.new(filename)
|
248
|
-
# [:fotolia, :zoonar, :photocase].each {|site_name|
|
249
257
|
$active_sites.each {|site_name|
|
250
258
|
begin
|
251
259
|
Timeout::timeout(10.0*60.0) do
|
252
260
|
t1 = Time.now
|
253
261
|
site = eval(site_name.to_s.capitalize+".new(#{site_name.to_s.capitalize})")
|
254
|
-
site.rotate_photos = rotate_photos[site_name]
|
262
|
+
# site.rotate_photos = rotate_photos[site_name]
|
255
263
|
done[site_name] = true if remaining[site_name] <= 0
|
256
264
|
next if done[site_name]
|
265
|
+
if $tags_only and ! tagsfile?(photo.filename)
|
266
|
+
if $verbose
|
267
|
+
puts "#{photo.filename}: no tags file. skipped."
|
268
|
+
end
|
269
|
+
next
|
270
|
+
end
|
257
271
|
if $send_all or
|
258
272
|
(total_per_site_flag and
|
259
273
|
total[site_name] < Choice.choices[:total_per_site])
|
@@ -344,7 +358,7 @@ def not_sent
|
|
344
358
|
not_sent[site] = 0
|
345
359
|
}
|
346
360
|
puts "not sent photos:"
|
347
|
-
Dir.glob($upload_dir
|
361
|
+
Dir.glob(File.join($upload_dir,'*')).each {|filename|
|
348
362
|
next if File.basename(filename)[0,4] == 'rot_'
|
349
363
|
if filename.upcase =~ PICTURE_FILES
|
350
364
|
$active_sites.each {|site|
|
@@ -421,7 +435,7 @@ end
|
|
421
435
|
|
422
436
|
# listet Bilddateien auf, die an alle Sites gesendet wurden
|
423
437
|
def list_done
|
424
|
-
Dir.glob($upload_dir
|
438
|
+
Dir.glob(File.join($upload_dir,'*')).each {|filename|
|
425
439
|
photo_sent = {}
|
426
440
|
$active_sites.each {|site|
|
427
441
|
photo_sent[site] = false
|
@@ -460,7 +474,7 @@ end
|
|
460
474
|
# Es schadet aber auch nicht, wenn dieser Schritt nie ausgefuehrt wird.
|
461
475
|
def purge_done
|
462
476
|
puts 'purge_done'
|
463
|
-
Dir.glob($upload_dir
|
477
|
+
Dir.glob(File.join($upload_dir,'*')).each {|filename|
|
464
478
|
photo_sent = {}
|
465
479
|
$active_sites.each {|site|
|
466
480
|
photo_sent[site] = false
|
@@ -492,7 +506,7 @@ end
|
|
492
506
|
|
493
507
|
# Listet alle Photo-Dateien auf, zu denen es keine .tags-Datei gibt
|
494
508
|
def no_tags
|
495
|
-
allfiles = Dir.glob($upload_dir
|
509
|
+
allfiles = Dir.glob(File.join($upload_dir,'*'))
|
496
510
|
if $ordered
|
497
511
|
allfiles.sort!
|
498
512
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
class GenericSite
|
2
2
|
attr_reader :name
|
3
|
-
attr_accessor :user, :password, :max_errors
|
3
|
+
attr_accessor :user, :password, :max_errors
|
4
4
|
|
5
5
|
MAX_ERRORS = 3
|
6
6
|
SENDLIST = 'sendeliste.dat'
|
@@ -8,7 +8,6 @@ class GenericSite
|
|
8
8
|
def initialize(name)
|
9
9
|
@name = name
|
10
10
|
@max_errors = MAX_ERRORS
|
11
|
-
@rotate_photos = true
|
12
11
|
end
|
13
12
|
|
14
13
|
def photos_fuer_heute_uebrig?
|
@@ -4,7 +4,7 @@ require 'RMagick'
|
|
4
4
|
include Magick
|
5
5
|
|
6
6
|
class Photo
|
7
|
-
attr_reader :filename
|
7
|
+
attr_reader :filename, :rotated_filename
|
8
8
|
attr_accessor :tags
|
9
9
|
|
10
10
|
def initialize(filename)
|
@@ -40,6 +40,7 @@ class Photo
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
+
# dreht Bild und schreibt in rot_... Datei
|
43
44
|
def drehen
|
44
45
|
pic = ImageList.new(@filename)
|
45
46
|
if pic.orientation == LeftBottomOrientation
|
@@ -49,7 +50,9 @@ class Photo
|
|
49
50
|
pic.auto_orient!
|
50
51
|
puts "rotating picture, writing to #{tmpname}"
|
51
52
|
pic.write(tmpname)
|
53
|
+
|
52
54
|
end
|
55
|
+
@rotated_filename = tmpname
|
53
56
|
end
|
54
57
|
end
|
55
58
|
|
@@ -101,10 +104,17 @@ class Photo
|
|
101
104
|
if s == ''
|
102
105
|
s = s + tag
|
103
106
|
else
|
104
|
-
s = s + ' ' + tag
|
107
|
+
# s = s + ' ' + tag
|
108
|
+
# lieber durch Komma trennen, da sonst das Formular z.B. bei fotolia nicht
|
109
|
+
# richtig gefüllt wird
|
110
|
+
s = s + ',' + tag
|
105
111
|
end
|
106
112
|
}
|
107
113
|
photo['keywords'] = s
|
114
|
+
|
115
|
+
#TODO:
|
116
|
+
photo['title'] = 'Testtitel'
|
117
|
+
|
108
118
|
photo.save
|
109
119
|
end
|
110
120
|
|
@@ -49,10 +49,8 @@ class Fotolia < GenericSite
|
|
49
49
|
puts "already sent"
|
50
50
|
return :duplicate
|
51
51
|
end
|
52
|
-
if
|
53
|
-
|
54
|
-
photo.drehen
|
55
|
-
end
|
52
|
+
if photo.portrait? and ! Fotolia.can_handle_orientation?
|
53
|
+
photo.drehen
|
56
54
|
end
|
57
55
|
if site_can_handle_keywords?
|
58
56
|
photo.set_keywords
|
@@ -62,7 +60,12 @@ class Fotolia < GenericSite
|
|
62
60
|
ftp = Net::FTP.new(FTP_HOST)
|
63
61
|
ftp.login(@ftp_user,@ftp_password)
|
64
62
|
files=ftp.list('*')
|
65
|
-
|
63
|
+
if photo.portrait?
|
64
|
+
p photo.rotated_filename
|
65
|
+
res = ftp.putbinaryfile(photo.rotated_filename)
|
66
|
+
else
|
67
|
+
res = ftp.putbinaryfile(photo.filename)
|
68
|
+
end
|
66
69
|
files =ftp.list('*')
|
67
70
|
#p files
|
68
71
|
ftp.close
|
@@ -81,18 +84,21 @@ class Fotolia < GenericSite
|
|
81
84
|
true
|
82
85
|
end
|
83
86
|
|
84
|
-
#
|
85
|
-
# @total_per_day
|
86
|
-
# end
|
87
|
-
#
|
87
|
+
# Anzahl heute schon gesendeter Photos
|
88
88
|
def sent_today
|
89
89
|
site = 'fotolia'
|
90
90
|
return sent_today_site(site)
|
91
91
|
end
|
92
92
|
|
93
|
+
# wurde dieses Photo schon gesendet?
|
93
94
|
def already_sent?(photo)
|
94
95
|
already_sent_site?(photo,'fotolia')
|
95
96
|
end
|
97
|
+
|
98
|
+
# can site handle orientation?
|
99
|
+
def self.can_handle_orientation?
|
100
|
+
false
|
101
|
+
end
|
96
102
|
|
97
103
|
private
|
98
104
|
|
@@ -41,12 +41,10 @@ class Photocase < GenericSite
|
|
41
41
|
puts 'already sent'
|
42
42
|
return :duplicate
|
43
43
|
end
|
44
|
-
if
|
45
|
-
|
46
|
-
photo.drehen
|
47
|
-
end
|
44
|
+
if photo.portrait? and ! Photocase.can_handle_orientation?
|
45
|
+
photo.drehen
|
48
46
|
end
|
49
|
-
|
47
|
+
if site_can_handle_keywords?
|
50
48
|
photo.set_keywords
|
51
49
|
end
|
52
50
|
|
@@ -70,11 +68,11 @@ class Photocase < GenericSite
|
|
70
68
|
raise "no Upload a photo" if ! page.body.include?('Upload a photo')
|
71
69
|
form = page.form('Form')
|
72
70
|
if photo.portrait?
|
73
|
-
|
74
|
-
b = File.basename(photo.filename)
|
75
|
-
newfilename = photo.filename.sub(b,'')+'rot_'+b
|
76
|
-
# form.file_uploads.first.file_name = 'r' + photo.filename
|
77
|
-
form.file_uploads.first.file_name = newfilename
|
71
|
+
form.file_uploads.first.file_name = photo.rotated_filename
|
72
|
+
# b = File.basename(photo.filename)
|
73
|
+
# newfilename = photo.filename.sub(b,'')+'rot_'+b
|
74
|
+
# # form.file_uploads.first.file_name = 'r' + photo.filename
|
75
|
+
# form.file_uploads.first.file_name = newfilename
|
78
76
|
else
|
79
77
|
form.file_uploads.first.file_name = photo.filename
|
80
78
|
end
|
@@ -114,31 +112,34 @@ class Photocase < GenericSite
|
|
114
112
|
true
|
115
113
|
end
|
116
114
|
|
117
|
-
#
|
118
|
-
# @total_per_day
|
119
|
-
# end
|
120
|
-
|
115
|
+
# Anzahl heute schon gesendeter Photos
|
121
116
|
def sent_today
|
122
117
|
site = 'photocase'
|
123
118
|
return sent_today_site(site)
|
124
119
|
end
|
125
120
|
|
121
|
+
# wurde dieses Photo schon gesendet?
|
126
122
|
def already_sent?(photo)
|
127
|
-
|
128
|
-
#
|
129
|
-
# unless photo.class == Photo
|
130
|
-
# raise 'not a Photo object'
|
131
|
-
# end
|
132
|
-
# unless File.exist?(photo.filename)
|
133
|
-
# raise "file #{photo.filename} does not exist"
|
134
|
-
# end
|
135
|
-
# g = grep(SENDLIST, /photocase\t#{photo.filename}/)
|
136
|
-
# return g.size > 0
|
123
|
+
already_sent_site?(photo,'photocase')
|
124
|
+
#
|
125
|
+
# unless photo.class == Photo
|
126
|
+
# raise 'not a Photo object'
|
127
|
+
# end
|
128
|
+
# unless File.exist?(photo.filename)
|
129
|
+
# raise "file #{photo.filename} does not exist"
|
130
|
+
# end
|
131
|
+
# g = grep(SENDLIST, /photocase\t#{photo.filename}/)
|
132
|
+
# return g.size > 0
|
133
|
+
end
|
134
|
+
|
135
|
+
# can site handle orientation?
|
136
|
+
def self.can_handle_orientation?
|
137
|
+
false
|
137
138
|
end
|
138
139
|
|
139
140
|
private
|
140
141
|
|
141
142
|
def site_can_handle_keywords?
|
142
|
-
|
143
|
-
end
|
143
|
+
true # TODO: ueberpruefen, ob richtig?
|
144
|
+
end
|
144
145
|
end
|
@@ -37,17 +37,15 @@ class Zoonar < GenericSite
|
|
37
37
|
end
|
38
38
|
print "zoonar:#{photo.filename} ... "
|
39
39
|
$stdout.flush
|
40
|
-
# g = `grep "zoonar\t#{photo.filename}" sendeliste.dat` #TODO: will not work for windows
|
41
40
|
g = grep(SENDLIST, /zoonar\t#{photo.filename}/)
|
42
41
|
if g.size > 0
|
43
42
|
puts 'already sent'
|
44
43
|
return :duplicate
|
45
44
|
end
|
46
|
-
|
47
|
-
|
48
|
-
photo.drehen
|
49
|
-
end
|
45
|
+
if photo.portrait? and ! Zoonar.can_handle_orientation?
|
46
|
+
photo.drehen
|
50
47
|
end
|
48
|
+
|
51
49
|
if site_can_handle_keywords?
|
52
50
|
photo.set_keywords
|
53
51
|
end
|
@@ -55,8 +53,11 @@ class Zoonar < GenericSite
|
|
55
53
|
unless dont_send
|
56
54
|
agent = WWW::Mechanize.new
|
57
55
|
agent.user_agent_alias = 'Linux Mozilla'
|
58
|
-
|
59
|
-
|
56
|
+
begin
|
57
|
+
page = agent.get 'http://www.zoonar.de'
|
58
|
+
rescue WWW::Mechanize::ResponseCodeError
|
59
|
+
raise UploadException
|
60
|
+
end
|
60
61
|
form = page.forms[1] #TODO: besser nach Name
|
61
62
|
form['loginForm[Username]'] = @config[:zoonar][:user]
|
62
63
|
form['loginForm[Password]'] = @config[:zoonar][:password]
|
@@ -66,7 +67,11 @@ class Zoonar < GenericSite
|
|
66
67
|
page = agent.click page.links.text('Bilder hochladen')
|
67
68
|
raise "nicht auf Upload-Seite" if ! page.body.include?('bertragen Sie Ihre Bilder einzeln mit Hilfe Ihres Internet-Browsers,')
|
68
69
|
form = page.form('fUploadResource')
|
69
|
-
|
70
|
+
if photo.portrait?
|
71
|
+
form.file_uploads.first.file_name = photo.rotated_filename
|
72
|
+
else
|
73
|
+
form.file_uploads.first.file_name = photo.filename
|
74
|
+
end
|
70
75
|
# puts "form abgeschickt ..."
|
71
76
|
page = agent.submit form
|
72
77
|
if page.body.include?("Es ist ein Fehler aufgetreten")
|
@@ -115,19 +120,22 @@ Falls wir das Bild ablehnen sollten, werden Sie eine Benachrichtigung per E-Mail
|
|
115
120
|
true
|
116
121
|
end
|
117
122
|
|
118
|
-
#
|
119
|
-
# @total_per_day
|
120
|
-
# end
|
121
|
-
|
123
|
+
# Anzahl heute schon gesendeter Photos
|
122
124
|
def sent_today
|
123
125
|
site = 'zoonar'
|
124
126
|
return sent_today_site(site)
|
125
127
|
end
|
126
128
|
|
129
|
+
# wurde dieses Photo schon gesendet?
|
127
130
|
def already_sent?(photo)
|
128
131
|
already_sent_site?(photo,'zoonar')
|
129
132
|
end
|
130
133
|
|
134
|
+
# can site handle orientation?
|
135
|
+
def self.can_handle_orientation?
|
136
|
+
false
|
137
|
+
end
|
138
|
+
|
131
139
|
private
|
132
140
|
|
133
141
|
def site_can_handle_keywords?
|
@@ -52,11 +52,12 @@ class TestMultistockphoto < Test::Unit::TestCase
|
|
52
52
|
end
|
53
53
|
|
54
54
|
def test_bin_help
|
55
|
-
expected = "Usage: multistockphoto [-
|
55
|
+
expected = "Usage: multistockphoto [-va1yntscrxlpoq]
|
56
56
|
Options:
|
57
57
|
--help Show this message
|
58
58
|
-v, --version Show version
|
59
59
|
-a, --send-all Send all files
|
60
|
+
-1, --tags-only Send only photos with keywords
|
60
61
|
-y, --verbose Verbose output
|
61
62
|
-n, --not-sent Count not sent files per site
|
62
63
|
-t, --total-transfers Dont't send more than N photos in total
|
@@ -70,28 +71,20 @@ Options:
|
|
70
71
|
-q, --no-tags List photos without tags file
|
71
72
|
--dont-send
|
72
73
|
--dont-log \n"
|
73
|
-
|
74
|
-
|
75
|
-
assert_equal expected, result
|
76
|
-
end
|
74
|
+
result = `#{BIN}multistockphoto -h`
|
75
|
+
assert_equal expected, result
|
77
76
|
result = `#{BIN}multistockphoto --help`
|
78
77
|
assert_equal expected, result
|
79
78
|
end
|
80
79
|
|
81
80
|
def test_bin_version
|
82
|
-
expected = "multistockphoto 0.6.
|
81
|
+
expected = "multistockphoto 0.6.1\n"
|
83
82
|
result = `#{BIN}multistockphoto -v`
|
84
83
|
assert_equal expected, result
|
85
84
|
result = `#{BIN}multistockphoto --version`
|
86
85
|
assert_equal expected, result
|
87
86
|
end
|
88
87
|
|
89
|
-
|
90
|
-
def after(d)
|
91
|
-
yield if DateTime.now > d
|
92
|
-
end
|
93
|
-
|
94
|
-
|
95
88
|
def test_fotolia
|
96
89
|
fotolia = Fotolia.new("Fotolia")
|
97
90
|
fotolia.ftp_user = @fotolia_ftp_user
|
@@ -152,17 +145,15 @@ Options:
|
|
152
145
|
end
|
153
146
|
|
154
147
|
def test_config_params_fotolia
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
assert_equal @fotolia_ftp_password, fotolia.ftp_password
|
165
|
-
end
|
148
|
+
fotolia = Fotolia.new("Fotolia Site")
|
149
|
+
assert fotolia.user
|
150
|
+
assert fotolia.password
|
151
|
+
assert fotolia.ftp_user
|
152
|
+
assert fotolia.ftp_password
|
153
|
+
assert_equal @fotolia_user, fotolia.user
|
154
|
+
assert_equal @fotolia_password, fotolia.password
|
155
|
+
assert_equal @fotolia_ftp_user, fotolia.ftp_user
|
156
|
+
assert_equal @fotolia_ftp_password, fotolia.ftp_password
|
166
157
|
end
|
167
158
|
|
168
159
|
def test_config_params_zoonar
|
@@ -176,15 +167,13 @@ Options:
|
|
176
167
|
end
|
177
168
|
|
178
169
|
def test_config_params_photocase
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
#kein ftp assert_equal @photocase_ftp_password, photocase.ftp_password
|
187
|
-
end
|
170
|
+
photocase = Photocase.new("photocase Site")
|
171
|
+
assert photocase.user
|
172
|
+
assert photocase.password
|
173
|
+
assert_equal @photocase_user, photocase.user
|
174
|
+
assert_equal @photocase_password, photocase.password
|
175
|
+
#kein ftp assert_equal @photocase_ftp_user, photocase.ftp_user
|
176
|
+
#kein ftp assert_equal @photocase_ftp_password, photocase.ftp_password
|
188
177
|
end
|
189
178
|
|
190
179
|
def test_grep
|
@@ -288,7 +277,6 @@ Options:
|
|
288
277
|
def test_iptc_file_keywords
|
289
278
|
expected = 'Berlin gwb Blume Biene'
|
290
279
|
photo = Photo.new(File.join('test','IMG_3602.JPG'))
|
291
|
-
|
292
280
|
photo.set_keywords
|
293
281
|
assert_equal expected, photo.file_keywords
|
294
282
|
end
|
@@ -331,15 +319,8 @@ Options:
|
|
331
319
|
assert_equal 0, zoonar.sent_today
|
332
320
|
assert_equal 0, fotolia.sent_today
|
333
321
|
assert_equal 0, photocase.sent_today
|
334
|
-
|
335
|
-
|
336
322
|
end
|
337
323
|
#end
|
338
|
-
# Code Generated by ZenTest v. 3.9.2
|
339
|
-
# classname: asrt / meth = ratio%
|
340
|
-
# GenericSite: 0 / 4 = 0.00%
|
341
|
-
|
342
|
-
#require 'test/unit' unless defined? $ZENTEST and $ZENTEST
|
343
324
|
|
344
325
|
#class Multistockphoto
|
345
326
|
after Date.new(2008,6,13) do
|
@@ -612,5 +593,14 @@ photocase:upload/3.gif ... OK
|
|
612
593
|
assert ret.exited?
|
613
594
|
assert_equal 0, ret.exitstatus
|
614
595
|
end
|
596
|
+
|
597
|
+
def test_can_handle_orientation
|
598
|
+
assert ! Fotolia.can_handle_orientation?
|
599
|
+
assert ! Zoonar.can_handle_orientation?
|
600
|
+
assert ! Photocase.can_handle_orientation?
|
601
|
+
end
|
602
|
+
|
603
|
+
|
604
|
+
|
615
605
|
end
|
616
606
|
|
data/website/index.html
CHANGED
@@ -150,9 +150,11 @@ Funktionsweise dieses Programm nicht notwendig, da die gedrehten Dateien bei
|
|
150
150
|
Bedarf einfach neu angelegt werden.</p>
|
151
151
|
|
152
152
|
|
153
|
-
<p>
|
154
|
-
|
155
|
-
Drehen
|
153
|
+
<p>Ab dem Release 0.6.2 weiß jede der Site-Klassen, ob ein Drehen des Bildes vorab
|
154
|
+
nötig ist, oder ob die Site das Drehen selbständig erkennen kann. Falls eine
|
155
|
+
Site das Drehen beherrscht, wird nicht von diesem Programm vorab gedreht, sondern
|
156
|
+
es wird die originale Datei hochgeladen. Zum jetzigen Zeitpunkt beherrscht
|
157
|
+
jedoch keine der bisher realisierten Sites das Drehen von sich aus.</p>
|
156
158
|
|
157
159
|
|
158
160
|
<p>Das Programm erstellt (im Directory multistockphoto) eine Datei namens
|
@@ -569,6 +571,21 @@ die gedrehte Datei ersetzt.</p>
|
|
569
571
|
Photo-Dateien auf, für die keine tags-Datei exisitiert.</p>
|
570
572
|
|
571
573
|
|
574
|
+
<h3>—tags-only</h3>
|
575
|
+
|
576
|
+
|
577
|
+
<p>Diese Option, in Verbindung mit dem Aufrufparameter—send-all sendet nur Photos,
|
578
|
+
für die eine zugehörige .tags Datei existiert.
|
579
|
+
Diese Option ist arbeitstechnisch nützlich, wenn du mindestens eine Site verwendest,
|
580
|
+
bei der das Vergeben von Keywords obligatorisch ist, bevor ein Bild begutachtet
|
581
|
+
wird (z. B. fotolia). Denn in diesem Fall mußt du die Keywords so oder so (entweder
|
582
|
+
offline oder online) erfassen.
|
583
|
+
Solltest du jedoch z. B. nur zoonar und photocase verwenden, kannst du auf das
|
584
|
+
Erfassen von Keywords vorab gut verzichten, da du nur für die angenommenen
|
585
|
+
Photos Keywords erfassen mußt, was wahrscheinlich bedeutend weniger Aufwand
|
586
|
+
bedeutet.</p>
|
587
|
+
|
588
|
+
|
572
589
|
<h3>—dont-send und—dont-log</h3>
|
573
590
|
|
574
591
|
|
@@ -674,7 +691,8 @@ soll. Erst dann werden deine Bilder begutachtet und entweder angenommen oder
|
|
674
691
|
abgelehnt.</p>
|
675
692
|
|
676
693
|
|
677
|
-
<p>Site unterstützt Keywords in <span class="caps">IPTC</span>-Header: Ja
|
694
|
+
<p>Site unterstützt Keywords in <span class="caps">IPTC</span>-Header: Ja
|
695
|
+
Site unterstützt Hoch-/Querformat: Nein</p>
|
678
696
|
|
679
697
|
|
680
698
|
<h3>zoonar.de</h3>
|
@@ -689,7 +707,8 @@ Mein Shop bei Zoonar ist übrigens unter http://www.zoonar.de/shop/thopre zu
|
|
689
707
|
zu erreichen. Kauft fleißig bei mir ein! ;-)</p>
|
690
708
|
|
691
709
|
|
692
|
-
<p>Site unterstützt Keywords in <span class="caps">IPTC</span>-Header: Ja
|
710
|
+
<p>Site unterstützt Keywords in <span class="caps">IPTC</span>-Header: Ja
|
711
|
+
Site unterstützt Hoch-/Querformat: Nein</p>
|
693
712
|
|
694
713
|
|
695
714
|
<h3>photocase.de</h3>
|
@@ -702,11 +721,8 @@ Gimmick bei photocase kannst du bei deinen Photos sehen, an welchem Platz
|
|
702
721
|
sie sich aktuell in der Warteschlage der zu begutachtenden Photos befinden.</p>
|
703
722
|
|
704
723
|
|
705
|
-
<p>Site unterstützt Keywords in <span class="caps">IPTC</span>-Header: ? noch mal nachschauen! <span class="caps">TODO</span
|
706
|
-
|
707
|
-
|
708
|
-
<p><i>Click on the Browse button to search your computer for the photo you’d like to upload. We accept <span class="caps">JPG</span> and <span class="caps">TIFF</span> files. Please pay close attention to the minimum resolution requirement of 1600×1200 pixels, the image quality (e.g. not overly compressed) and the content of the image itself (e.g. it does not contain any material that you don’t hold the copyright to).
|
709
|
-
</i></p>
|
724
|
+
<p>Site unterstützt Keywords in <span class="caps">IPTC</span>-Header: ? noch mal nachschauen! <span class="caps">TODO</span>:
|
725
|
+
Site unterstützt Hoch-/Querformat: Nein</p>
|
710
726
|
|
711
727
|
|
712
728
|
<h2>Forum</h2>
|
@@ -784,7 +800,7 @@ rake install_gem</pre>
|
|
784
800
|
<p>Comments are welcome. Send an email to <a href="mailto:thopre@gmail.com">Thomas Preymesser</a> email
|
785
801
|
or via the <a href="http://groups.google.com/group/multistockphoto">forum</a></p>
|
786
802
|
<p class="coda">
|
787
|
-
<a href="mailto:thopre@gmail.com">Thomas Preymesser</a>,
|
803
|
+
<a href="mailto:thopre@gmail.com">Thomas Preymesser</a>, 14th June 2008<br>
|
788
804
|
Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
|
789
805
|
</p>
|
790
806
|
</div>
|
data/website/index.txt
CHANGED
@@ -98,9 +98,11 @@ Dateien dürfen gefahrlos gelöscht werden, ist aber im normalen Betrieb für di
|
|
98
98
|
Funktionsweise dieses Programm nicht notwendig, da die gedrehten Dateien bei
|
99
99
|
Bedarf einfach neu angelegt werden.
|
100
100
|
|
101
|
-
|
102
|
-
|
103
|
-
Drehen
|
101
|
+
Ab dem Release 0.6.2 weiß jede der Site-Klassen, ob ein Drehen des Bildes vorab
|
102
|
+
nötig ist, oder ob die Site das Drehen selbständig erkennen kann. Falls eine
|
103
|
+
Site das Drehen beherrscht, wird nicht von diesem Programm vorab gedreht, sondern
|
104
|
+
es wird die originale Datei hochgeladen. Zum jetzigen Zeitpunkt beherrscht
|
105
|
+
jedoch keine der bisher realisierten Sites das Drehen von sich aus.
|
104
106
|
|
105
107
|
Das Programm erstellt (im Directory multistockphoto) eine Datei namens
|
106
108
|
'sendeliste.dat', in der die erfolgreichen Uploads mit Site, Dateiname und
|
@@ -450,6 +452,19 @@ h3. --no-tags
|
|
450
452
|
Ein Aufruf mit dieser Option, auch in Verbindung mit --ordered, listet alle
|
451
453
|
Photo-Dateien auf, für die keine tags-Datei exisitiert.
|
452
454
|
|
455
|
+
h3. --tags-only
|
456
|
+
|
457
|
+
Diese Option, in Verbindung mit dem Aufrufparameter --send-all sendet nur Photos,
|
458
|
+
für die eine zugehörige .tags Datei existiert.
|
459
|
+
Diese Option ist arbeitstechnisch nützlich, wenn du mindestens eine Site verwendest,
|
460
|
+
bei der das Vergeben von Keywords obligatorisch ist, bevor ein Bild begutachtet
|
461
|
+
wird (z. B. fotolia). Denn in diesem Fall mußt du die Keywords so oder so (entweder
|
462
|
+
offline oder online) erfassen.
|
463
|
+
Solltest du jedoch z. B. nur zoonar und photocase verwenden, kannst du auf das
|
464
|
+
Erfassen von Keywords vorab gut verzichten, da du nur für die angenommenen
|
465
|
+
Photos Keywords erfassen mußt, was wahrscheinlich bedeutend weniger Aufwand
|
466
|
+
bedeutet.
|
467
|
+
|
453
468
|
h3. --dont-send und --dont-log
|
454
469
|
|
455
470
|
Diese beiden Optionen sind eigentlich nur für interne Unit-Tests der Programme
|
@@ -535,6 +550,7 @@ soll. Erst dann werden deine Bilder begutachtet und entweder angenommen oder
|
|
535
550
|
abgelehnt.
|
536
551
|
|
537
552
|
Site unterstützt Keywords in IPTC-Header: Ja
|
553
|
+
Site unterstützt Hoch-/Querformat: Nein
|
538
554
|
|
539
555
|
h3. zoonar.de
|
540
556
|
|
@@ -547,6 +563,7 @@ Mein Shop bei Zoonar ist übrigens unter http://www.zoonar.de/shop/thopre zu
|
|
547
563
|
zu erreichen. Kauft fleißig bei mir ein! ;-)
|
548
564
|
|
549
565
|
Site unterstützt Keywords in IPTC-Header: Ja
|
566
|
+
Site unterstützt Hoch-/Querformat: Nein
|
550
567
|
|
551
568
|
h3. photocase.de
|
552
569
|
|
@@ -557,9 +574,7 @@ Gimmick bei photocase kannst du bei deinen Photos sehen, an welchem Platz
|
|
557
574
|
sie sich aktuell in der Warteschlage der zu begutachtenden Photos befinden.
|
558
575
|
|
559
576
|
Site unterstützt Keywords in IPTC-Header: ? noch mal nachschauen! TODO:
|
560
|
-
|
561
|
-
<i>Click on the Browse button to search your computer for the photo you’d like to upload. We accept JPG and TIFF files. Please pay close attention to the minimum resolution requirement of 1600x1200 pixels, the image quality (e.g. not overly compressed) and the content of the image itself (e.g. it does not contain any material that you don’t hold the copyright to).
|
562
|
-
</i>
|
577
|
+
Site unterstützt Hoch-/Querformat: Nein
|
563
578
|
|
564
579
|
h2. Forum
|
565
580
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: multistockphoto
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thomas Preymesser
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-06-
|
12
|
+
date: 2008-06-14 00:00:00 +02:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|