shoeset

Hex Artifact Content
Login

Artifact c4e1e45645bde13b555d7419162ff86a26dfd5fb373afea85ebbdc2b632463d3:


0000: 53 68 6f 65 73 2e 73 65 74 75 70 20 64 6f 0a 09  Shoes.setup do..
0010: 67 65 6d 20 27 66 6c 69 63 6b 72 61 77 27 0a 65  gem 'flickraw'.e
0020: 6e 64 0a 0a 72 65 71 75 69 72 65 20 27 66 6c 69  nd..require 'fli
0030: 63 6b 72 61 77 27 0a 72 65 71 75 69 72 65 20 27  ckraw'.require '
0040: 79 61 6d 6c 27 0a 72 65 71 75 69 72 65 20 27 63  yaml'.require 'c
0050: 6c 6f 75 64 27 0a 0a 09 0a 53 68 6f 65 73 2e 61  loud'....Shoes.a
0060: 70 70 20 3a 74 69 74 6c 65 20 3d 3e 20 22 53 68  pp :title => "Sh
0070: 6f 65 73 65 74 22 20 64 6f 0a 0a 09 0a 09 4b 45  oeset" do.....KE
0080: 59 46 49 4c 45 20 3d 20 22 6b 65 79 73 2e 79 6d  YFILE = "keys.ym
0090: 6c 22 0a 09 4b 45 59 53 20 3d 20 59 41 4d 4c 3a  l"..KEYS = YAML:
00a0: 3a 6c 6f 61 64 28 46 69 6c 65 2e 72 65 61 64 28  :load(File.read(
00b0: 4b 45 59 46 49 4c 45 29 29 0a 09 46 6c 69 63 6b  KEYFILE))..Flick
00c0: 52 61 77 2e 61 70 69 5f 6b 65 79 3d 4b 45 59 53  Raw.api_key=KEYS
00d0: 5b 22 61 70 69 5f 6b 65 79 22 5d 0a 09 46 6c 69  ["api_key"]..Fli
00e0: 63 6b 52 61 77 2e 73 68 61 72 65 64 5f 73 65 63  ckRaw.shared_sec
00f0: 72 65 74 3d 4b 45 59 53 5b 22 73 68 61 72 65 64  ret=KEYS["shared
0100: 5f 73 65 63 72 65 74 22 5d 0a 09 54 4f 4b 45 4e  _secret"]..TOKEN
0110: 46 49 4c 45 20 3d 20 45 4e 56 5b 27 48 4f 4d 45  FILE = ENV['HOME
0120: 27 5d 2b 22 5c 5c 2e 73 68 6f 65 73 65 74 2e 79  ']+"\\.shoeset.y
0130: 6d 6c 22 0a 0a 0a 0a 09 23 4e 65 65 64 20 74 6f  ml".....#Need to
0140: 20 69 6d 70 72 6f 76 65 20 47 55 49 20 66 65 65   improve GUI fee
0150: 64 62 61 63 6b 2f 72 65 73 70 6f 6e 73 69 76 65  dback/responsive
0160: 20 6f 6e 20 6f 70 65 6e 69 6e 67 2e 20 54 68 72   on opening. Thr
0170: 65 61 64 3f 3f 0a 09 64 65 66 20 6c 6f 67 69 6e  ead??..def login
0180: 0a 09 09 69 66 20 46 69 6c 65 2e 65 78 69 73 74  ...if File.exist
0190: 73 3f 28 54 4f 4b 45 4e 46 49 4c 45 29 20 23 4c  s?(TOKENFILE) #L
01a0: 6f 61 64 20 74 6f 6b 65 6e 20 69 66 20 69 74 20  oad token if it 
01b0: 65 78 69 73 74 73 0a 09 09 09 09 09 24 53 45 54  exists......$SET
01c0: 54 49 4e 47 53 20 3d 20 59 41 4d 4c 3a 3a 6c 6f  TINGS = YAML::lo
01d0: 61 64 28 46 69 6c 65 2e 72 65 61 64 28 54 4f 4b  ad(File.read(TOK
01e0: 45 4e 46 49 4c 45 29 29 0a 09 09 09 09 09 40 74  ENFILE))......@t
01f0: 6f 6b 65 6e 20 3d 20 24 53 45 54 54 49 4e 47 53  oken = $SETTINGS
0200: 5b 22 54 6f 6b 65 6e 22 5d 0a 09 09 09 09 09 40  ["Token"]......@
0210: 61 75 74 68 20 3d 20 66 6c 69 63 6b 72 2e 61 75  auth = flickr.au
0220: 74 68 2e 63 68 65 63 6b 54 6f 6b 65 6e 20 3a 61  th.checkToken :a
0230: 75 74 68 5f 74 6f 6b 65 6e 20 3d 3e 20 40 74 6f  uth_token => @to
0240: 6b 65 6e 0a 09 09 09 09 09 40 6c 6f 67 69 6e 20  ken......@login 
0250: 3d 20 66 6c 69 63 6b 72 2e 74 65 73 74 2e 6c 6f  = flickr.test.lo
0260: 67 69 6e 0a 09 09 09 09 09 40 63 6f 6e 74 61 69  gin......@contai
0270: 6e 65 72 2e 63 6c 65 61 72 7b 75 69 7d 20 23 64  ner.clear{ui} #d
0280: 72 61 77 20 75 69 20 09 09 0a 09 09 65 6c 73 65  raw ui .....else
0290: 0a 09 09 09 66 72 6f 62 20 3d 20 66 6c 69 63 6b  ....frob = flick
02a0: 72 2e 61 75 74 68 2e 67 65 74 46 72 6f 62 0a 09  r.auth.getFrob..
02b0: 09 09 61 75 74 68 5f 75 72 6c 20 3d 20 46 6c 69  ..auth_url = Fli
02c0: 63 6b 52 61 77 2e 61 75 74 68 5f 75 72 6c 20 3a  ckRaw.auth_url :
02d0: 66 72 6f 62 20 3d 3e 20 66 72 6f 62 2c 20 3a 70  frob => frob, :p
02e0: 65 72 6d 73 20 3d 3e 20 27 72 65 61 64 27 0a 09  erms => 'read'..
02f0: 09 0a 09 09 09 70 61 72 61 20 22 43 6c 69 63 6b  .....para "Click
0300: 20 74 6f 20 22 2c 20 6c 69 6e 6b 28 22 61 75 74   to ", link("aut
0310: 68 6f 72 69 73 65 22 2c 20 3a 63 6c 69 63 6b 20  horise", :click 
0320: 3d 3e 61 75 74 68 5f 75 72 6c 29 2c 20 22 20 77  =>auth_url), " w
0330: 69 74 68 20 46 6c 69 63 6b 72 2e 22 0a 09 09 09  ith Flickr."....
0340: 70 61 72 61 20 22 43 6c 69 63 6b 20 4f 4b 20 77  para "Click OK w
0350: 68 65 6e 20 79 6f 75 20 61 72 65 20 66 69 6e 69  hen you are fini
0360: 73 68 65 64 2e 22 0a 09 09 09 40 6f 6b 62 75 74  shed."....@okbut
0370: 74 6f 6e 20 3d 20 62 75 74 74 6f 6e 20 22 4f 4b  ton = button "OK
0380: 22 20 64 6f 0a 09 09 09 09 62 65 67 69 6e 0a 09  " do.....begin..
0390: 09 09 09 09 40 61 75 74 68 20 3d 20 66 6c 69 63  ....@auth = flic
03a0: 6b 72 2e 61 75 74 68 2e 67 65 74 54 6f 6b 65 6e  kr.auth.getToken
03b0: 20 3a 66 72 6f 62 20 3d 3e 20 66 72 6f 62 0a 09   :frob => frob..
03c0: 09 09 09 09 24 53 45 54 54 49 4e 47 53 20 3d 20  ....$SETTINGS = 
03d0: 7b 20 22 54 6f 6b 65 6e 22 20 3d 3e 20 40 61 75  { "Token" => @au
03e0: 74 68 2e 74 6f 6b 65 6e 20 7d 0a 09 09 09 09 09  th.token }......
03f0: 66 20 3d 20 46 69 6c 65 2e 6f 70 65 6e 28 54 4f  f = File.open(TO
0400: 4b 45 4e 46 49 4c 45 2c 20 27 77 27 29 0a 09 09  KENFILE, 'w')...
0410: 09 09 09 66 2e 77 72 69 74 65 28 59 41 4d 4c 2e  ...f.write(YAML.
0420: 64 75 6d 70 20 24 53 45 54 54 49 4e 47 53 29 0a  dump $SETTINGS).
0430: 09 09 09 09 09 66 2e 63 6c 6f 73 65 0a 09 09 09  .....f.close....
0440: 09 09 40 6c 6f 67 69 6e 20 3d 20 66 6c 69 63 6b  ..@login = flick
0450: 72 2e 74 65 73 74 2e 6c 6f 67 69 6e 0a 09 09 09  r.test.login....
0460: 09 09 40 63 6f 6e 74 61 69 6e 65 72 2e 63 6c 65  ..@container.cle
0470: 61 72 7b 75 69 7d 20 23 64 72 61 77 20 75 69 0a  ar{ui} #draw ui.
0480: 09 09 09 09 72 65 73 63 75 65 20 46 6c 69 63 6b  ....rescue Flick
0490: 52 61 77 3a 3a 46 61 69 6c 65 64 52 65 73 70 6f  Raw::FailedRespo
04a0: 6e 73 65 20 3d 3e 20 65 0a 09 09 09 09 09 70 61  nse => e......pa
04b0: 72 61 20 22 41 75 74 68 65 6e 74 69 63 61 74 69  ra "Authenticati
04c0: 6f 6e 20 66 61 69 6c 65 64 20 3a 20 23 7b 65 2e  on failed : #{e.
04d0: 6d 73 67 7d 22 0a 09 09 09 09 65 6e 64 0a 09 09  msg}".....end...
04e0: 09 65 6e 64 0a 09 09 65 6e 64 0a 09 65 6e 64 0a  .end...end..end.
04f0: 0a 0a 09 64 65 66 20 75 69 0a 09 09 66 6c 6f 77  ...def ui...flow
0500: 20 64 6f 0a 09 09 09 70 61 72 61 20 22 59 6f 75   do....para "You
0510: 20 61 72 65 20 6c 6f 67 67 65 64 20 69 6e 20 61   are logged in a
0520: 73 20 22 0a 09 09 09 70 61 72 61 20 6c 69 6e 6b  s "....para link
0530: 28 40 6c 6f 67 69 6e 2e 75 73 65 72 6e 61 6d 65  (@login.username
0540: 29 7b 40 74 6f 6b 65 6e 2e 74 6f 67 67 6c 65 7d  ){@token.toggle}
0550: 0a 09 09 09 62 75 74 74 6f 6e 20 22 4c 6f 67 6f  ....button "Logo
0560: 75 74 22 2c 20 3a 64 69 73 70 6c 61 63 65 5f 6c  ut", :displace_l
0570: 65 66 74 20 3d 3e 20 31 30 20 64 6f 0a 09 09 09  eft => 10 do....
0580: 09 6c 6f 67 6f 75 74 0a 09 09 09 65 6e 64 0a 09  .logout....end..
0590: 09 65 6e 64 0a 09 09 40 74 6f 6b 65 6e 20 3d 20  .end...@token = 
05a0: 70 61 72 61 20 22 54 6f 6b 65 6e 3a 20 23 7b 40  para "Token: #{@
05b0: 61 75 74 68 2e 74 6f 6b 65 6e 7d 22 0a 09 09 40  auth.token}"...@
05c0: 74 6f 6b 65 6e 2e 68 69 64 65 0a 09 09 40 73 65  token.hide...@se
05d0: 74 6c 69 73 74 20 3d 20 5b 5d 0a 09 09 40 6c 6f  tlist = []...@lo
05e0: 61 64 69 6e 67 73 65 74 6c 69 73 74 20 3d 20 70  adingsetlist = p
05f0: 61 72 61 20 22 4c 6f 61 64 69 6e 67 20 73 65 74  ara "Loading set
0600: 73 2e 2e 2e 22 0a 09 09 40 61 6e 69 6d 61 74 65  s..."...@animate
0610: 6c 69 73 74 20 3d 20 61 6e 69 6d 61 74 65 28 35  list = animate(5
0620: 29 20 64 6f 20 7c 66 72 61 6d 65 7c 0a 09 09 09  ) do |frame|....
0630: 77 65 69 67 68 74 20 3d 20 5b 22 62 6f 6c 64 22  weight = ["bold"
0640: 2c 20 22 6e 6f 72 6d 61 6c 22 5d 0a 09 09 09 40  , "normal"]....@
0650: 6c 6f 61 64 69 6e 67 73 65 74 6c 69 73 74 2e 73  loadingsetlist.s
0660: 74 79 6c 65 28 3a 77 65 69 67 68 74 20 3d 3e 20  tyle(:weight => 
0670: 77 65 69 67 68 74 5b 66 72 61 6d 65 26 31 5d 29  weight[frame&1])
0680: 0a 09 09 65 6e 64 0a 09 09 40 70 68 6f 74 6f 73  ...end...@photos
0690: 65 74 6c 69 73 74 20 3d 20 66 6c 69 63 6b 72 2e  etlist = flickr.
06a0: 70 68 6f 74 6f 73 65 74 73 2e 67 65 74 4c 69 73  photosets.getLis
06b0: 74 2e 65 61 63 68 20 64 6f 20 7c 73 65 74 7c 0a  t.each do |set|.
06c0: 09 09 09 40 73 65 74 6c 69 73 74 20 3c 3c 20 73  ...@setlist << s
06d0: 65 74 5b 22 74 69 74 6c 65 22 5d 0a 09 09 65 6e  et["title"]...en
06e0: 64 0a 09 09 40 61 6e 69 6d 61 74 65 6c 69 73 74  d...@animatelist
06f0: 2e 73 74 6f 70 0a 09 09 40 6c 6f 61 64 69 6e 67  .stop...@loading
0700: 73 65 74 6c 69 73 74 2e 68 69 64 65 0a 09 09 66  setlist.hide...f
0710: 6c 6f 77 20 64 6f 0a 09 09 09 70 61 72 61 20 22  low do....para "
0720: 50 69 63 6b 20 61 20 73 65 74 20 74 6f 20 67 65  Pick a set to ge
0730: 6e 65 72 61 74 65 20 54 61 67 20 43 6c 6f 75 64  nerate Tag Cloud
0740: 3a 20 22 0a 09 09 09 40 6c 69 73 74 62 6f 78 20  : "....@listbox 
0750: 3d 20 6c 69 73 74 5f 62 6f 78 20 3a 69 74 65 6d  = list_box :item
0760: 73 20 3d 3e 20 40 73 65 74 6c 69 73 74 20 64 6f  s => @setlist do
0770: 20 7c 73 65 74 7c 0a 09 09 09 09 09 69 66 20 24   |set|......if $
0780: 70 2e 6e 69 6c 3f 20 6f 72 20 24 70 2e 66 72 61  p.nil? or $p.fra
0790: 63 74 69 6f 6e 28 29 20 3d 3d 20 31 2e 30 20 09  ction() == 1.0 .
07a0: 23 62 65 63 61 75 73 65 20 74 68 69 73 20 69 73  #because this is
07b0: 20 74 68 72 65 61 64 65 64 2c 20 6d 75 73 74 20   threaded, must 
07c0: 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
07d0: 61 6c 72 65 61 64 79 20 72 75 6e 6e 69 6e 67 0a  already running.
07e0: 09 09 09 09 09 09 40 63 75 72 72 65 6e 74 73 65  ......@currentse
07f0: 74 20 3d 20 73 65 74 2e 74 65 78 74 0a 09 09 09  t = set.text....
0800: 09 09 09 66 6c 75 66 66 79 67 65 6e 28 73 65 74  ...fluffygen(set
0810: 29 0a 09 09 09 09 09 65 6c 73 65 20 23 69 66 20  )......else #if 
0820: 75 73 65 72 20 70 69 63 6b 73 20 61 6e 6f 74 68  user picks anoth
0830: 65 72 20 73 65 74 2c 20 70 75 74 20 73 65 6c 65  er set, put sele
0840: 63 74 65 64 20 62 61 63 6b 20 74 6f 20 6f 72 69  cted back to ori
0850: 67 69 6e 61 6c 20 63 68 6f 69 63 65 20 69 66 20  ginal choice if 
0860: 72 75 6e 6e 69 6e 67 2e 0a 09 09 09 09 09 09 23  running........#
0870: 64 65 62 75 67 28 40 63 75 72 72 65 6e 74 73 65  debug(@currentse
0880: 74 29 0a 09 09 09 09 09 09 40 6c 69 73 74 62 6f  t).......@listbo
0890: 78 2e 63 68 6f 6f 73 65 28 40 63 75 72 72 65 6e  x.choose(@curren
08a0: 74 73 65 74 29 20 23 53 65 74 20 74 6f 20 0a 09  tset) #Set to ..
08b0: 09 09 09 09 65 6e 64 0a 09 09 09 09 65 6e 64 0a  ....end.....end.
08c0: 09 09 65 6e 64 20 23 66 6c 6f 77 0a 09 09 40 74  ..end #flow...@t
08d0: 61 67 63 6c 6f 75 64 20 3d 20 66 6c 6f 77 20 64  agcloud = flow d
08e0: 6f 20 23 69 66 20 74 68 69 73 20 69 73 20 61 20  o #if this is a 
08f0: 73 74 61 63 6b 20 74 68 65 6e 20 63 6c 65 61 72  stack then clear
0900: 69 6e 67 20 69 74 20 67 6f 65 73 20 63 72 61 7a  ing it goes craz
0910: 79 0a 09 09 09 70 61 72 61 20 22 22 0a 09 09 65  y....para ""...e
0920: 6e 64 20 23 73 65 74 2d 75 70 20 70 6c 61 63 65  nd #set-up place
0930: 68 6f 6c 64 65 72 20 66 6f 72 20 74 61 67 20 63  holder for tag c
0940: 6c 6f 75 64 0a 09 65 6e 64 0a 09 0a 0a 09 64 65  loud..end.....de
0950: 66 20 6c 6f 67 6f 75 74 0a 09 09 23 72 65 6d 6f  f logout...#remo
0960: 76 65 20 74 6f 6b 65 6e 20 66 69 6c 65 0a 09 09  ve token file...
0970: 46 69 6c 65 2e 64 65 6c 65 74 65 28 54 4f 4b 45  File.delete(TOKE
0980: 4e 46 49 4c 45 29 0a 09 09 23 63 6c 65 61 72 20  NFILE)...#clear 
0990: 77 69 6e 64 6f 77 20 61 6e 64 20 72 65 73 74 61  window and resta
09a0: 72 74 0a 09 09 40 63 6f 6e 74 61 69 6e 65 72 2e  rt...@container.
09b0: 63 6c 65 61 72 0a 09 09 6c 6f 67 69 6e 0a 09 65  clear...login..e
09c0: 6e 64 0a 0a 09 0a 09 64 65 66 20 66 6c 75 66 66  nd.....def fluff
09d0: 79 67 65 6e 28 73 65 74 29 0a 09 09 40 74 61 67  ygen(set)...@tag
09e0: 63 6c 6f 75 64 2e 63 6c 65 61 72 20 23 69 73 20  cloud.clear #is 
09f0: 74 68 69 73 20 62 65 63 61 75 73 65 20 69 74 27  this because it'
0a00: 73 20 6f 6e 20 61 20 67 6c 6f 62 61 6c 20 76 61  s on a global va
0a10: 72 69 61 62 6c 65 20 74 68 61 74 20 69 74 20 63  riable that it c
0a20: 6c 65 61 72 73 20 65 76 65 72 79 74 68 69 6e 67  lears everything
0a30: 3f 3f 3f 3f 20 4e 6f 70 65 0a 09 09 24 70 20 3d  ???? Nope...$p =
0a40: 20 70 72 6f 67 72 65 73 73 20 3a 77 69 64 74 68   progress :width
0a50: 20 3d 3e 20 30 2e 38 2c 20 3a 64 69 73 70 6c 61   => 0.8, :displa
0a60: 63 65 5f 6c 65 66 74 20 3d 3e 20 31 30 0a 09 09  ce_left => 10...
0a70: 23 64 65 62 75 67 28 73 65 74 2e 74 65 78 74 29  #debug(set.text)
0a80: 0a 09 09 70 68 6f 74 6f 73 65 74 69 6e 66 6f 20  ...photosetinfo 
0a90: 3d 20 40 70 68 6f 74 6f 73 65 74 6c 69 73 74 2e  = @photosetlist.
0aa0: 73 65 6c 65 63 74 20 7b 7c 73 7c 20 73 5b 22 74  select {|s| s["t
0ab0: 69 74 6c 65 22 5d 20 3d 3d 20 73 65 74 2e 74 65  itle"] == set.te
0ac0: 78 74 7d 0a 09 09 23 64 65 62 75 67 28 70 68 6f  xt}...#debug(pho
0ad0: 74 6f 73 65 74 69 6e 66 6f 29 0a 09 09 63 6f 75  tosetinfo)...cou
0ae0: 6e 74 20 3d 20 70 68 6f 74 6f 73 65 74 69 6e 66  nt = photosetinf
0af0: 6f 5b 30 5d 5b 22 70 68 6f 74 6f 73 22 5d 2e 74  o[0]["photos"].t
0b00: 6f 5f 66 0a 09 09 63 6f 75 6e 74 65 72 20 3d 20  o_f...counter = 
0b10: 30 2e 30 0a 09 09 23 64 65 62 75 67 20 70 68 6f  0.0...#debug pho
0b20: 74 6f 73 65 74 69 6e 66 6f 5b 30 5d 5b 22 69 64  tosetinfo[0]["id
0b30: 22 5d 2e 74 6f 5f 73 20 23 69 74 27 73 20 61 6e  "].to_s #it's an
0b40: 20 61 72 72 61 79 20 6f 66 20 61 20 68 61 73 68   array of a hash
0b50: 2e 20 45 76 65 6e 20 74 68 6f 75 67 68 20 6a 75  . Even though ju
0b60: 73 74 20 6f 6e 65 0a 09 09 70 68 6f 74 6f 73 65  st one...photose
0b70: 74 70 68 6f 74 6f 73 20 3d 20 66 6c 69 63 6b 72  tphotos = flickr
0b80: 2e 70 68 6f 74 6f 73 65 74 73 2e 67 65 74 50 68  .photosets.getPh
0b90: 6f 74 6f 73 28 3a 70 68 6f 74 6f 73 65 74 5f 69  otos(:photoset_i
0ba0: 64 20 3d 3e 20 70 68 6f 74 6f 73 65 74 69 6e 66  d => photosetinf
0bb0: 6f 5b 30 5d 5b 22 69 64 22 5d 20 29 0a 09 09 23  o[0]["id"] )...#
0bc0: 64 65 62 75 67 28 70 68 6f 74 6f 73 65 74 70 68  debug(photosetph
0bd0: 6f 74 6f 73 5b 22 70 68 6f 74 6f 22 5d 29 0a 09  otos["photo"])..
0be0: 09 24 61 72 72 61 79 20 3d 20 5b 5d 0a 09 09 54  .$array = []...T
0bf0: 68 72 65 61 64 2e 6e 65 77 20 64 6f 0a 09 09 09  hread.new do....
0c00: 70 68 6f 74 6f 73 65 74 70 68 6f 74 6f 73 5b 22  photosetphotos["
0c10: 70 68 6f 74 6f 22 5d 2e 65 61 63 68 20 64 6f 20  photo"].each do 
0c20: 7c 70 68 6f 74 6f 7c 0a 09 09 09 09 23 64 65 62  |photo|.....#deb
0c30: 75 67 20 66 6c 69 63 6b 72 2e 74 61 67 73 2e 67  ug flickr.tags.g
0c40: 65 74 4c 69 73 74 50 68 6f 74 6f 28 3a 70 68 6f  etListPhoto(:pho
0c50: 74 6f 5f 69 64 20 3d 3e 20 70 68 6f 74 6f 5b 22  to_id => photo["
0c60: 69 64 22 5d 29 0a 09 09 09 09 74 65 6d 70 20 3d  id"]).....temp =
0c70: 20 66 6c 69 63 6b 72 2e 74 61 67 73 2e 67 65 74   flickr.tags.get
0c80: 4c 69 73 74 50 68 6f 74 6f 28 3a 70 68 6f 74 6f  ListPhoto(:photo
0c90: 5f 69 64 20 3d 3e 20 70 68 6f 74 6f 5b 22 69 64  _id => photo["id
0ca0: 22 5d 29 0a 09 09 09 09 74 65 6d 70 5b 22 74 61  "]).....temp["ta
0cb0: 67 73 22 5d 2e 65 61 63 68 20 64 6f 20 7c 74 61  gs"].each do |ta
0cc0: 67 73 7c 20 23 73 68 6f 75 6c 64 20 62 65 20 61  gs| #should be a
0cd0: 6e 20 61 72 72 61 79 0a 09 09 09 09 09 24 61 72  n array......$ar
0ce0: 72 61 79 20 3c 3c 20 74 61 67 73 5b 22 5f 63 6f  ray << tags["_co
0cf0: 6e 74 65 6e 74 22 5d 0a 09 09 09 09 65 6e 64 0a  ntent"].....end.
0d00: 09 09 09 09 23 64 65 62 75 67 20 24 61 72 72 61  ....#debug $arra
0d10: 79 0a 09 09 09 09 73 6c 65 65 70 28 31 29 20 23  y.....sleep(1) #
0d20: 20 53 6c 65 65 70 20 69 6e 74 65 72 76 61 6c 20   Sleep interval 
0d30: 62 65 74 77 65 65 6e 20 63 61 6c 6c 73 2e 0a 09  between calls...
0d40: 09 09 09 63 6f 75 6e 74 65 72 20 2b 3d 20 31 2e  ...counter += 1.
0d50: 30 0a 09 09 09 09 24 70 2e 66 72 61 63 74 69 6f  0.....$p.fractio
0d60: 6e 20 3d 20 63 6f 75 6e 74 65 72 2f 63 6f 75 6e  n = counter/coun
0d70: 74 0a 09 09 09 09 23 64 65 62 75 67 20 28 63 6f  t.....#debug (co
0d80: 75 6e 74 65 72 2f 63 6f 75 6e 74 29 0a 09 09 09  unter/count)....
0d90: 09 23 20 43 61 63 68 69 6e 67 20 2d 20 61 6e 79  .# Caching - any
0da0: 77 61 79 3f 20 43 6f 75 6c 64 20 63 61 63 68 65  way? Could cache
0db0: 20 6c 69 73 74 20 6f 66 20 70 68 6f 74 6f 73 20   list of photos 
0dc0: 66 72 6f 6d 20 73 65 74 2c 20 62 75 74 20 74 68  from set, but th
0dd0: 65 6e 20 77 68 61 74 20 61 62 6f 75 74 20 69 66  en what about if
0de0: 20 75 70 64 61 74 65 64 3f 0a 09 09 09 65 6e 64   updated?....end
0df0: 0a 09 09 09 23 64 65 62 75 67 20 24 61 72 72 61  ....#debug $arra
0e00: 79 0a 09 09 09 63 6c 6f 75 64 20 3d 20 54 61 67  y....cloud = Tag
0e10: 43 6c 6f 75 64 2e 6e 65 77 28 24 61 72 72 61 79  Cloud.new($array
0e20: 2e 6a 6f 69 6e 28 22 20 22 29 29 0a 09 09 09 24  .join(" "))....$
0e30: 70 2e 68 69 64 65 0a 09 09 09 23 64 65 62 75 67  p.hide....#debug
0e40: 20 63 6c 6f 75 64 2e 62 75 69 6c 64 0a 09 09 09   cloud.build....
0e50: 40 74 61 67 63 6c 6f 75 64 2e 63 6c 65 61 72 7b  @tagcloud.clear{
0e60: 65 76 61 6c 20 63 6c 6f 75 64 2e 62 75 69 6c 64  eval cloud.build
0e70: 7d 0a 09 09 65 6e 64 0a 09 65 6e 64 0a 0a 09 0a  }...end..end....
0e80: 0a 09 40 63 6f 6e 74 61 69 6e 65 72 20 3d 20 73  ..@container = s
0e90: 74 61 63 6b 20 64 6f 0a 09 09 40 6c 6f 61 64 69  tack do...@loadi
0ea0: 6e 67 20 3d 20 70 61 72 61 20 22 4c 6f 61 64 69  ng = para "Loadi
0eb0: 6e 67 2e 2e 2e 22 0a 09 65 6e 64 0a 09 40 61 6e  ng..."..end..@an
0ec0: 69 6d 61 74 65 20 3d 20 61 6e 69 6d 61 74 65 28  imate = animate(
0ed0: 35 29 20 64 6f 20 7c 66 72 61 6d 65 7c 0a 09 09  5) do |frame|...
0ee0: 77 65 69 67 68 74 20 3d 20 5b 22 62 6f 6c 64 22  weight = ["bold"
0ef0: 2c 20 22 6e 6f 72 6d 61 6c 22 5d 0a 09 09 40 6c  , "normal"]...@l
0f00: 6f 61 64 69 6e 67 2e 73 74 79 6c 65 28 3a 77 65  oading.style(:we
0f10: 69 67 68 74 20 3d 3e 20 77 65 69 67 68 74 5b 66  ight => weight[f
0f20: 72 61 6d 65 26 31 5d 29 0a 09 65 6e 64 0a 09 54  rame&1])..end..T
0f30: 68 72 65 61 64 2e 6e 65 77 20 64 6f 20 0a 09 09  hread.new do ...
0f40: 6c 6f 67 69 6e 0a 09 65 6e 64 0a 0a 65 6e 64 0a  login..end..end.
0f50: 0a 0a 0a                                         ...