multistockphoto 0.3.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -4,7 +4,9 @@ include Grep
4
4
 
5
5
  class Fotolia < GenericSite
6
6
 
7
- attr_accessor :ftp_user, :ftp_password
7
+ @@errors = 0
8
+
9
+ attr_accessor :ftp_user, :ftp_password, :max_errors
8
10
 
9
11
  FTP_HOST = 'submit.fotolia.com'
10
12
 
@@ -13,18 +15,16 @@ class Fotolia < GenericSite
13
15
  super
14
16
  if ENV['MSP_CONFIG']
15
17
  @config = YAML.load_file(ENV['MSP_CONFIG'])
16
- #p "meine config: #{ENV['MSP_CONFIG']}"
17
18
  else
18
- #p "standard config"
19
19
  @config = YAML.load_file("config.yaml")
20
20
  end
21
21
  @user = @config[:fotolia][:user]
22
22
  @password = @config[:fotolia][:password]
23
23
  @ftp_user = @config[:fotolia][:ftp_user]
24
24
  @ftp_password = @config[:fotolia][:ftp_password]
25
- # kann vom Client ueberschrieben werden
25
+ @total_per_day = @config[:fotolia][:total_per_day]
26
26
  end
27
-
27
+ # TODO: Bild gedreht senden, falls Hochformat
28
28
  def transfer(photo)
29
29
  # falls nicht in config Datei eingetragen dann nicht senden
30
30
  if @user == nil or @password == nil
@@ -42,11 +42,14 @@ class Fotolia < GenericSite
42
42
  print "fotolia:#{photo.filename} ... "
43
43
  $stdout.flush
44
44
  #g = `grep "fotolia\t#{photo.filename}" sendeliste.dat` #TODO: will not work for windows
45
- g = grep("sendeliste.dat", /fotolia\t#{photo.filename}/)
45
+ g = grep(SENDELISTE, /fotolia\t#{photo.filename}/)
46
46
  if g.size > 0
47
47
  puts "already sent"
48
48
  return :duplicate
49
49
  end
50
+ if photo.portrait
51
+ photo.drehen
52
+ end
50
53
  ftp = Net::FTP.new(FTP_HOST)
51
54
  ftp.login(@ftp_user,@ftp_password)
52
55
  files=ftp.list('*')
@@ -54,11 +57,43 @@ class Fotolia < GenericSite
54
57
  files=ftp.list('*')
55
58
  #p files
56
59
  ftp.close
60
+ #Test auf Fehler?
61
+ # if rand(100) == 42
62
+ # @@errors += 1
63
+ # if @@errors > max_errors
64
+ # raise "too many errors"
65
+ # end
66
+ # end
67
+ @@errors = 0
57
68
  puts 'OK'
58
69
  # `echo "fotolia\t#{photo.filename}\t#{Time.now}" >>sendeliste.dat` #TODO:
59
- File.open('sendeliste.dat','a') {|f|
70
+ File.open(SENDELISTE,'a') {|f|
60
71
  f.puts "fotolia\t#{photo.filename}\t#{Time.now}"
61
72
  }
62
73
  true
63
74
  end
75
+
76
+ def total_per_day
77
+ @total_per_day
78
+ end
79
+
80
+ def sent_today
81
+ site = 'fotolia'
82
+ return sent_today_site(site)
83
+ end
84
+
85
+ def already_sent?(photo)
86
+ unless photo.class == Photo
87
+ raise 'not a Photo object'
88
+ end
89
+ unless File.exist?(photo.filename)
90
+ raise "file #{photo.filename} does not exist"
91
+ end
92
+ g = grep(SENDELISTE, /fotolia\t#{photo.filename}/)
93
+ if g.size > 0
94
+ return true
95
+ else
96
+ return false
97
+ end
98
+ end
64
99
  end
@@ -4,8 +4,8 @@ require 'grep'
4
4
  include Grep
5
5
 
6
6
  class Photocase < GenericSite
7
-
8
- attr_accessor :user, :password
7
+ @@errors = 0
8
+ attr_accessor :user, :password, :max_errors
9
9
 
10
10
  def initialize(name)
11
11
  super
@@ -16,6 +16,7 @@ class Photocase < GenericSite
16
16
  end
17
17
  @user = @config[:photocase][:user]
18
18
  @password = @config[:photocase][:password]
19
+ @total_per_day = @config[:photocase][:total_per_day]
19
20
  end
20
21
 
21
22
  def transfer(photo)
@@ -33,12 +34,12 @@ class Photocase < GenericSite
33
34
  end
34
35
  print "photocase:#{photo.filename} ... "
35
36
  $stdout.flush
36
- g = grep("sendeliste.dat", /photocase\t#{photo.filename}/)
37
+ g = grep(SENDELISTE, /photocase\t#{photo.filename}/)
37
38
  if g.size > 0
38
39
  puts 'already sent'
39
40
  return :duplicate
40
41
  end
41
- if photo.hochformat
42
+ if photo.portrait
42
43
  photo.drehen
43
44
  end
44
45
  agent = WWW::Mechanize.new
@@ -59,11 +60,11 @@ class Photocase < GenericSite
59
60
  page = agent.click page.links.text('Upload')
60
61
  raise "no Upload a photo" if ! page.body.include?('Upload a photo')
61
62
  form = page.form('Form')
62
- if photo.hochformat
63
+ if photo.portrait
63
64
 
64
65
  b = File.basename(photo.filename)
65
66
  newfilename = photo.filename.sub(b,'')+'rot_'+b
66
- # form.file_uploads.first.file_name = 'r' + photo.filename
67
+ # form.file_uploads.first.file_name = 'r' + photo.filename
67
68
  form.file_uploads.first.file_name = newfilename
68
69
  else
69
70
  form.file_uploads.first.file_name = photo.filename
@@ -79,16 +80,47 @@ class Photocase < GenericSite
79
80
  raise "not successfully uploaded"
80
81
  end
81
82
  if page.body.include?('Your photo was uploaded successfully.')
83
+ @@errors = 0
82
84
  puts "OK"
85
+ else
86
+ #Fehler aufgetreten
87
+ @@errors += 1
88
+ if @@errors > 3
89
+ raise "too many errors"
90
+ end
83
91
  end
84
92
  #'Your photo was uploaded successfully.'
85
93
  if sav_photo_filename != photo.filename
86
94
  raise "photo.filenames has been changed!"
87
95
  end
88
96
 
89
- File.open('sendeliste.dat','a') {|f|
97
+ File.open(SENDELISTE,'a') {|f|
90
98
  f.puts "photocase\t#{photo.filename}\t#{Time.now}"
91
99
  }
92
100
  true
93
101
  end
102
+
103
+ def total_per_day
104
+ @total_per_day
105
+ end
106
+
107
+ def sent_today
108
+ site = 'photocase'
109
+ return sent_today_site(site)
110
+ end
111
+
112
+ def already_sent?(photo)
113
+ unless photo.class == Photo
114
+ raise 'not a Photo object'
115
+ end
116
+ unless File.exist?(photo.filename)
117
+ raise "file #{photo.filename} does not exist"
118
+ end
119
+ g = grep(SENDELISTE, /photocase\t#{photo.filename}/)
120
+ if g.size > 0
121
+ return true
122
+ else
123
+ return false
124
+ end
125
+ end
94
126
  end
@@ -7,7 +7,7 @@ class Zoonar < GenericSite
7
7
 
8
8
  @@errors = 0
9
9
 
10
- attr_accessor :user, :password
10
+ attr_accessor :user, :password, :max_errors
11
11
 
12
12
  def initialize(name)
13
13
  super
@@ -18,8 +18,10 @@ class Zoonar < GenericSite
18
18
  end
19
19
  @user = @config[:zoonar][:user]
20
20
  @password = @config[:zoonar][:password]
21
+ @total_per_day = @config[:zoonar][:total_per_day]
21
22
  end
22
23
 
24
+ # TODO: Bild gedreht senden, falls Hochformat
23
25
  def transfer(photo)
24
26
  # falls nicht in config Datei eingetragen dann nicht senden
25
27
  if @user == nil or @password == nil
@@ -35,11 +37,14 @@ class Zoonar < GenericSite
35
37
  print "zoonar:#{photo.filename} ... "
36
38
  $stdout.flush
37
39
  # g = `grep "zoonar\t#{photo.filename}" sendeliste.dat` #TODO: will not work for windows
38
- g = grep("sendeliste.dat", /zoonar\t#{photo.filename}/)
40
+ g = grep(SENDELISTE, /zoonar\t#{photo.filename}/)
39
41
  if g.size > 0
40
42
  puts 'already sent'
41
43
  return :duplicate
42
44
  end
45
+ if photo.portrait
46
+ photo.drehen
47
+ end
43
48
  agent = WWW::Mechanize.new
44
49
  agent.user_agent_alias = 'Linux Mozilla'
45
50
  page = agent.get 'http://www.zoonar.de'
@@ -61,7 +66,7 @@ class Zoonar < GenericSite
61
66
  raise "Bild zu klein. Muss mind. 6 MP sein"
62
67
  else
63
68
  @@errors += 1
64
- if @@errors > 3
69
+ if @@errors > max_errors
65
70
  raise "too many errors"
66
71
  end
67
72
  raise "Fehler beim Upload"
@@ -92,9 +97,33 @@ Falls wir das Bild ablehnen sollten, werden Sie eine Benachrichtigung per E-Mail
92
97
 
93
98
  #`echo "zoonar\t#{photo.filename}\t#{Time.now}" >>sendeliste.dat` #TODO:
94
99
 
95
- File.open('sendeliste.dat','a') {|f|
100
+ File.open(SENDELISTE,'a') {|f|
96
101
  f.puts "zoonar\t#{photo.filename}\t#{Time.now}"
97
102
  }
98
103
  true
99
104
  end
105
+
106
+ def total_per_day
107
+ @total_per_day
108
+ end
109
+
110
+ def sent_today
111
+ site = 'zoonar'
112
+ return sent_today_site(site)
113
+ end
114
+
115
+ def already_sent?(photo)
116
+ unless photo.class == Photo
117
+ raise 'not a Photo object'
118
+ end
119
+ unless File.exist?(photo.filename)
120
+ raise "file #{photo.filename} does not exist"
121
+ end
122
+ g = grep(SENDELISTE, /zoonar\t#{photo.filename}/)
123
+ if g.size > 0
124
+ return true
125
+ else
126
+ return false
127
+ end
128
+ end
100
129
  end
@@ -1,7 +1,7 @@
1
1
  module Multistockphoto #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
- MINOR = 3
4
+ MINOR = 5
5
5
  TINY = 0
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
@@ -2,6 +2,8 @@ require File.dirname(__FILE__) + '/test_helper.rb'
2
2
 
3
3
  require 'grep'
4
4
  include Grep
5
+ #require 'RMagick'
6
+ #include Magick
5
7
 
6
8
  class TestMultistockphoto < Test::Unit::TestCase
7
9
 
@@ -23,7 +25,7 @@ class TestMultistockphoto < Test::Unit::TestCase
23
25
  end
24
26
 
25
27
  def test_bin_help
26
- expected = "Usage: multistockphoto [-vatsor]
28
+ expected = "Usage: multistockphoto [-vayntsorx]
27
29
 
28
30
  Specific options:
29
31
 
@@ -31,10 +33,13 @@ Common options:
31
33
  --help Show this message
32
34
  -v, --version Show version
33
35
  -a, --send-all Send all files
36
+ -y, --verbose Verbose output
37
+ -n, --not-sent Count not sent files per site
34
38
  -t, --total-transfers dont't send more than N photos in total
35
39
  -s, --total-per-site send no more than N photos per site
36
40
  -o, --check-orientation displays the orientiation of photo files
37
- -r, --rotate rotate a photo file 90 degrees to the left\n"
41
+ -r, --rotate rotate a photo file 90 degrees to the left
42
+ -x, --stats Displays statistics\n"
38
43
  result = `#{BIN}multistockphoto -h`
39
44
  assert_equal expected, result
40
45
  result = `#{BIN}multistockphoto --help`
@@ -42,7 +47,7 @@ Common options:
42
47
  end
43
48
 
44
49
  def test_bin_version
45
- expected = "multistockphoto 0.2.0\n"
50
+ expected = "multistockphoto 0.4.0\n"
46
51
  result = `#{BIN}multistockphoto -v`
47
52
  assert_equal expected, result
48
53
  result = `#{BIN}multistockphoto --version`
@@ -68,9 +73,7 @@ sending foto1.jpg ... OK
68
73
  sending foto2.jpg ... OK
69
74
  sending foto3.jpg ... OK
70
75
  "
71
-
72
76
  output = `system bin/multistockphoto --transfer-all`
73
-
74
77
  assert_equal expected, output
75
78
  end
76
79
  end
@@ -191,7 +194,7 @@ sending foto3.jpg ... OK
191
194
  end
192
195
 
193
196
  def test_aldi
194
- after Date.new(2008,5,15) do
197
+ after Date.new(2008,5,30) do
195
198
  site = Aldi.new("ALDI")
196
199
 
197
200
  assert_kind_of Aldi, site
@@ -209,7 +212,7 @@ sending foto3.jpg ... OK
209
212
  end
210
213
 
211
214
  def test_aldi_transfer
212
- after Date.new(2008,5,15) do
215
+ after Date.new(2008,5,30) do
213
216
  site = Aldi.new("ALDI")
214
217
  photo = Photo.new("/media/LACIE/private/CF-Card/DCIM/119CANON/IMG_3267_zugeschnitten_blank_names.jpg")
215
218
  site.transfer(photo)
@@ -254,7 +257,7 @@ sending foto3.jpg ... OK
254
257
  end
255
258
 
256
259
  def test_config_params_pixelio
257
- after Date.new(2008,5,15) do
260
+ after Date.new(2008,5,30) do
258
261
  pixelio = Pixelio.new("Pixelio Site")
259
262
  assert pixelio.user
260
263
  assert pixelio.password
@@ -266,7 +269,101 @@ sending foto3.jpg ... OK
266
269
  end
267
270
 
268
271
 
272
+ def DONT_test_iptc_data
273
+
274
+ pic = ImageList.new("test/IMG_3602.JPG")
275
+ puts pic.orientation
276
+
277
+
278
+ pic.each_iptc_dataset { |dataset, data_field|
279
+ p dataset
280
+ p data_field
281
+ }
282
+
283
+ p pic.get_iptc_dataset(Magick::IPTC::Application::Keywords)
284
+ # assert ['aaa'], rmagicphoto.iptc
285
+ assert true
286
+ end
269
287
 
270
288
  #Shutterstock, iStockphoto , StockXpert , Dreamstime , Bigstockphoto , 123rf und Panthermedia finden Sie auf unserer Partnerseite Fotos kaufen.de
289
+
290
+ def test_max_errors
291
+ site = Fotolia.new('fotolia')
292
+ assert_equal 3, site.max_errors
293
+ site = Zoonar.new('zoonar')
294
+ assert_equal 3, site.max_errors
295
+ site = Photocase.new('photocase')
296
+ assert_equal 3, site.max_errors
297
+ end
298
+
299
+ def test_set_max_errors
300
+ site = Fotolia.new('fotolia')
301
+ site.max_errors = 4
302
+ assert_equal 4, site.max_errors
303
+
304
+ site = Zoonar.new('zoonar')
305
+ site.max_errors = 5
306
+ assert_equal 5, site.max_errors
307
+
308
+ site = Photocase.new('photocase')
309
+ site.max_errors = 6
310
+ assert_equal 6, site.max_errors
311
+ end
271
312
 
313
+ def test_iptc_keywords
314
+ expected = ['Berlin','gwb','Blume','Biene']
315
+ photo = Photo.new(File.join('test','IMG_3602.JPG'))
316
+ photo.set_keywords
317
+ assert_equal expected, photo.keywords
318
+ end
319
+
320
+ def test_iptc_file_keywords
321
+ expected = 'Berlin gwb Blume Biene'
322
+ photo = Photo.new(File.join('test','IMG_3602.JPG'))
323
+
324
+ photo.set_keywords
325
+ assert_equal expected, photo.file_keywords
326
+ end
327
+
328
+ def test_string_to_keyword_array
329
+ s = "Berlin"
330
+ assert_equal ['Berlin'], Photo.to_tags(s)
331
+ s = "Berlin,Graffiti"
332
+ assert_equal ['Berlin','Graffiti'], Photo.to_tags(s)
333
+ s = "Berlin Graffiti"
334
+ assert_equal ['Berlin','Graffiti'], Photo.to_tags(s)
335
+ s = "Berlin Graffiti,Test"
336
+ assert_equal ['Berlin','Graffiti','Test'], Photo.to_tags(s)
337
+ s = "Berlin Graffiti, Test"
338
+ assert_equal ['Berlin','Graffiti','Test'], Photo.to_tags(s)
339
+ s = "Berlin Graffiti, Test\n zweite, dritte"
340
+ assert_equal ['Berlin','Graffiti','Test','zweite','dritte'], Photo.to_tags(s)
341
+ s = "Berlin Graffiti, Test\n zweite\tdritte"
342
+ assert_equal ['Berlin','Graffiti','Test','zweite','dritte'], Photo.to_tags(s)
343
+ s = "Berlin Graffiti, Test\n zweite|dritte"
344
+ assert_equal ['Berlin','Graffiti','Test','zweite','dritte'], Photo.to_tags(s)
345
+ end
346
+
347
+ def test_iptc_file_keywords_non_existing_tag_file
348
+ expected = 'Berlin gwb Blume Biene'
349
+ photo = Photo.new(File.join('test','IMG_9999.JPG'))
350
+
351
+ photo.set_keywords
352
+ assert_equal expected, photo.file_keywords
353
+ end
354
+
355
+ def test_total_per_day_from_config_file
356
+ zoonar = Zoonar.new('zoonar')
357
+ assert_equal 10, zoonar.total_per_day
358
+ fotolia = Fotolia.new('fotolia')
359
+ assert_equal 11, fotolia.total_per_day
360
+ photocase = Photocase.new('photocase')
361
+ assert_equal 12, photocase.total_per_day
362
+
363
+ assert_equal 0, zoonar.sent_today
364
+ assert_equal 0, fotolia.sent_today
365
+ assert_equal 0, photocase.sent_today
366
+
367
+
368
+ end
272
369
  end
data/website/index.html CHANGED
@@ -33,7 +33,7 @@
33
33
  <h1>multistockphoto</h1>
34
34
  <div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/multistockphoto"; return false'>
35
35
  <p>Get Version</p>
36
- <a href="http://rubyforge.org/projects/multistockphoto" class="numbers">0.3.0</a>
36
+ <a href="http://rubyforge.org/projects/multistockphoto" class="numbers">0.5.0</a>
37
37
  </div>
38
38
  <h1>&#x2192; &#8216;multistockphoto&#8217;</h1>
39
39
 
@@ -161,38 +161,6 @@ können.</p>
161
161
  schon vor des Hochladen überprüft werden. Dies ist jedoch noch nicht implementiert.</p>
162
162
 
163
163
 
164
- <h3>fotolia.de</h3>
165
-
166
-
167
- <p>Beispiel: Bei fotolia.de mußt du deine Photos hochladen, dann noch Stichworte
168
- und verschiedene Vertragsbedingungen festlegen. Dann erst werden deine Bilder
169
- geprüft und entweder angenommen oder abgelehnt.</p>
170
-
171
-
172
- <h3>zoonar.de</h3>
173
-
174
-
175
- <p>Bei zoonar.de wiederum läuft es so, daß du erst nur die Bilder hochlädst, dann
176
- werden sie begutachtet; angenommen oder abgelehnt und erst wenn sie
177
- angenommen wurden, kannst du Schlagworte vergeben. Dies hat natürlich den
178
- Vorteil, daß man für abgelehnte Photos erst gar keine Schlagworte vergeben muß
179
- (kann).</p>
180
-
181
-
182
- <h3>photocase.de</h3>
183
-
184
-
185
- <p>Bei photocase.de lädst du ebenfalls zuerst deinen Photos hoch, diese werden
186
- dann entweder angenommen oder abgelehnt. Bei angenommenen Bilder bearbeitest
187
- du diese auf deren Seite weiter (eigentlich wie bei zoonar.de). Als nettes
188
- Gimmick bei photocase kannst du bei deinen Photos sehen, an welchem Platz
189
- sie sich aktuell in der Warteschlage der zu begutachtenden Photos befinden.</p>
190
-
191
-
192
- <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&#215;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).
193
- </i></p>
194
-
195
-
196
164
  <h2>Demonstration of usage</h2>
197
165
 
198
166
 
@@ -237,6 +205,72 @@ Starte dann einfach das Programm am nächsten Tag noch einmal, um den Rest der
237
205
  Photos hochzuladen!</p>
238
206
 
239
207
 
208
+ <p>Statistik über gesendete Photos</p>
209
+
210
+
211
+ <p>Der Schalter&#8212;stats zeigt ein Statistik über die Anzahl der gesendeten Photos
212
+ innerhalb der letzten 10 Tage, aufgeteilt nach Site.
213
+ Außerdem eine Summenzeile über alle bisher gesendeten Photos. Achtung: Diese
214
+ Summen beziehen sich nicht auf die letzen zuvor aufgelisteten Tage sondern auf
215
+ sämtliche bisher gesendeten Photos.</p>
216
+
217
+
218
+ <pre>
219
+ $ multistockphoto --stats
220
+ Statistics
221
+ | fotolia | zoonar | photocase | total
222
+ 2008-05-23 | 0 | 0 | 0 | 0
223
+ 2008-05-22 | 7 | 7 | 7 | 21
224
+ 2008-05-21 | 4 | 4 | 3 | 11
225
+ 2008-05-20 | 7 | 6 | 6 | 19
226
+ 2008-05-19 | 5 | 9 | 5 | 19
227
+ 2008-05-18 | 6 | 6 | 6 | 18
228
+ 2008-05-17 | 7 | 7 | 7 | 21
229
+ 2008-05-16 | 7 | 7 | 6 | 20
230
+ 2008-05-15 | 6 | 6 | 6 | 18
231
+ 2008-05-14 | 0 | 1 | 1 | 2
232
+
233
+ total | 251 | 174 | 250 | 675
234
+ </pre>
235
+
236
+ <p>Auflisten aller komplett gesendeten Photos</p>
237
+
238
+
239
+ <p>Um Photos aufzulisten, die bereits an alle Photo-Sites gesendet wurden, gibt
240
+ es den Schalter&#8212;list-done</p>
241
+
242
+
243
+ <p>Verschieben aller komplett gesendeten Photos ins done-Directory</p>
244
+
245
+
246
+ <p>Falls du Photos aus dem Arbeitsdirectory löschen möchtest (aus Platzgründen oder
247
+ weil du alte Dateien dort nicht mehr haben willst), die bereits an alle
248
+ definierten Sites gesendet wurden, rufe</p>
249
+
250
+
251
+ <pre>
252
+ multistockphoto --purge-done
253
+ </pre>
254
+
255
+ <p>auf!</p>
256
+
257
+
258
+ <p>Daraufhin werden alle komplett gesendeten Photos ins Directory &#8216;done&#8217; verschoben.
259
+ Das done-Directory wird automatisch angelegt, falls es noch nicht existiert.</p>
260
+
261
+
262
+ <p>Die Dateien im done-Directory kannst du nun entweder löschen oder, je nach
263
+ Bedarf irgendwie archivieren.</p>
264
+
265
+
266
+ <p>Bitte beachte aber, daß, falls du später eine weitere Photo-Site definierst,
267
+ diese alten Bilder nicht mehr an die neue Photo-Site geschickt werden. Falls
268
+ du sie jedoch im Arbeitsverzeichnis beläßt, werden auch diese alten Bilder
269
+ an eventuelle neue Photo-Sites versendet.
270
+ Du kannst aber jederzeit die verschobenen oder archivierten Bilder wieder ins
271
+ Arbeitsverzeichnis kopieren. Bereits erfolgte Uploads werden davon nicht beeinflußt.</p>
272
+
273
+
240
274
  <h3>Hoch- und Querformat</h3>
241
275
 
242
276
 
@@ -278,6 +312,53 @@ wurde, dann drehe das Bild vor dem Hochladen mit dem Schalter &#8216;&#8212;rota
278
312
  einen anderen Programm, welches Bilde drehen kann!</p>
279
313
 
280
314
 
315
+ <h2>Bisher realisierte Sites</h2>
316
+
317
+
318
+ <p>Diese Programm arbeitet zum gegenwärtigen Zeitpunkt mit den im folgenden
319
+ beschriebenen Photo-Sites zusammen. Weitere sind geplant. Wenn du weitere Sites
320
+ realisiert haben möchtest, schreib mir!</p>
321
+
322
+
323
+ <p>Ebenso bin ich auch bereit (exklusive) kommerzielle Entwicklung für weitere Sites
324
+ anzubieten.</p>
325
+
326
+
327
+ <h3>fotolia.de</h3>
328
+
329
+
330
+ <p>Bei fotolia.de lädst du deine Fotos hoch. Anschließend mußt du noch Stichworte
331
+ vergeben und zu jedem Bild angeben, mit welcher Lizenz dieses angeboten werden
332
+ soll. Erst dann werden deine Bilder begutachtet und entweder angenommen oder
333
+ abgelehnt.</p>
334
+
335
+
336
+ <h3>zoonar.de</h3>
337
+
338
+
339
+ <p>Bei zoonar.de wiederum läuft es so, daß du zuerst nur die Bilder hochlädst, dann
340
+ werden sie begutachtet; angenommen oder abgelehnt und erst wenn sie
341
+ angenommen wurden, kannst du Schlagworte vergeben. Dies hat natürlich den
342
+ Vorteil, daß man für abgelehnte Photos erst gar keine Schlagworte vergeben muß
343
+ (kann).
344
+ Mein Shop bei Zoonar ist übrigens unter http://www.zoonar.de/shop/thopre zu
345
+ zu erreichen. Kauft fleißig bei mir ein! ;-)</p>
346
+
347
+
348
+ <h3>photocase.de</h3>
349
+
350
+
351
+ <p>Bei photocase.de lädst du ebenfalls zuerst deine Photos hoch, diese werden
352
+ dann entweder angenommen oder abgelehnt. Bei angenommenen Bilder bearbeitest
353
+ du diese auf deren Seite weiter (eigentlich wie bei zoonar.de). Als nettes
354
+ Gimmick bei photocase kannst du bei deinen Photos sehen, an welchem Platz
355
+ sie sich aktuell in der Warteschlage der zu begutachtenden Photos befinden.</p>
356
+
357
+
358
+ <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&#215;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).
359
+ </i></p>
360
+
361
+
281
362
  <h2>Forum</h2>
282
363
 
283
364
 
@@ -345,7 +426,7 @@ rake install_gem</pre>
345
426
  <p>Comments are welcome. Send an email to <a href="mailto:thopre@gmail.com">Thomas Preymesser</a> email
346
427
  or via the <a href="http://groups.google.com/group/multistockphoto">forum</a></p>
347
428
  <p class="coda">
348
- <a href="FIXME email">FIXME full name</a>, 10th May 2008<br>
429
+ <a href="FIXME email">FIXME full name</a>, 26th May 2008<br>
349
430
  Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
350
431
  </p>
351
432
  </div>