Artifact c4e1e45645bde13b555d7419162ff86a26dfd5fb373afea85ebbdc2b632463d3:
- File
shoeset.rb
— part of check-in
[4624b9404c]
at
2010-03-29 13:45:44
on branch trunk
— ListBox cloudgen block now runs in serial
* Because of threading used, if the user selected another item in the listbox
whilst the app was already running and generating a tag cloud, another
progress bar would appear, etc. This forces selections to run in serial,
i.e. will ignore the selection if cloud generator is already running
* Also resets list box selection to the set currently being used if user tries
to change whilst running
* Better future approach could be to cancel current cloud generation and start
again for new set selected. Debatable though... (user: i5ivem@gmail.com size: 3923)
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 ...