rubyweather 1.1.0 → 1.1.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 CHANGED
@@ -14,14 +14,14 @@ or install as a RubyGem:
14
14
 
15
15
  sudo gem install rubyweather
16
16
 
17
- You can also check out the latest copy via subversion from svn://rubyforge.org//var/svn/rubyweather/trunk.
18
- If you would like to contribute back your changes to the code, please contact me via the rubyforge project
19
- site to obtain a subversion account.
17
+ You can also check out the latest copy via subversion from http://rubyweather.googlecode.com/svn/trunk/.
18
+ If you would like to contribute back your changes to the code, please contact me via the RubyForge or
19
+ Google Code project site to obtain a subversion account.
20
20
 
21
21
  RubyWeather can also be installed as a Rails plugin using the following command from your Rails application's
22
22
  directory:
23
23
 
24
- ./script/plugin install -x svn://rubyforge.org//var/svn/rubyweather/trunk
24
+ ./script/plugin install -x http://rubyweather.googlecode.com/svn/trunk
25
25
 
26
26
 
27
27
  === Examples
@@ -5,13 +5,14 @@
5
5
  #
6
6
 
7
7
  require 'time'
8
+ require 'ostruct'
8
9
  require File.dirname(File.expand_path(__FILE__)) + '/util'
9
10
 
10
11
  module Weather
11
-
12
+
12
13
  # Namespace module for weather data objects.
13
14
  module Forecast
14
-
15
+
15
16
  # Contains several days of weather data.
16
17
  # The forecast object includes the Enumerable mixin, so that you can iterate
17
18
  # over all of the days in the forecast using the standard ruby mechanisms as follows:
@@ -59,9 +60,9 @@ module Weather
59
60
  element = xml.root.elements['dayf'].elements["day[@d='#{num.to_s}']"]
60
61
  if not element
61
62
  case num
62
- when 0 then daydisplay = "today"
63
- when 1 then daydisplay = "tomorrow"
64
- else daydisplay = "#{num} days from now"
63
+ when 0 then daydisplay = "today"
64
+ when 1 then daydisplay = "tomorrow"
65
+ else daydisplay = "#{num} days from now"
65
66
  end
66
67
  raise "Sorry, there is no data available for #{daydisplay}"
67
68
  else
@@ -125,6 +126,7 @@ module Weather
125
126
  # forecast.current.latest_update
126
127
  #
127
128
  def latest_update
129
+ puts xml.root.to_s
128
130
  Time.parse(xml.root.elements['dayf'].elements['lsup'].text)
129
131
  end
130
132
 
@@ -147,7 +149,7 @@ module Weather
147
149
 
148
150
  # Abstract class that all Forecast entities are based on.
149
151
  class Conditions
150
-
152
+
151
153
  # For elements in the forecast that we have not defined an explicit accessor,
152
154
  # this allows accessing the raw underlying data in the forecast xml.
153
155
  def method_missing(symbol)
@@ -158,9 +160,10 @@ module Weather
158
160
  end
159
161
  end
160
162
 
161
- # The wind conditions as an anonymous object (i.e. wind.d for wind
162
- # direction, wind.s for wind speed, etc.) See the <wind> element in the
163
- # weather.com XML data spec for more info.
163
+ # The wind conditions as an anonymous object (i.e. wind.d or wind.direction for
164
+ # wind direction, wind.s or wind.speed for wind speed, wind.h or wind.heading for
165
+ # heading, etc.) See the <wind> element in the weather.com XML data spec for
166
+ # more info.
164
167
  def wind
165
168
  fix_wind(complex_attribute(@xml.elements['wind']))
166
169
  end
@@ -171,14 +174,14 @@ module Weather
171
174
  Time.parse(self.lsup)
172
175
  end
173
176
 
174
-
177
+
175
178
  private
176
179
  # The element specified by name as a cleaned-up temperature value.
177
180
  # That is, if the temperature is "N/A", then nil is returned; otherwise
178
181
  # the value is converted to an integer.
179
182
  def clean_temp(name)
180
183
  temp = @xml.elements[name].text
181
-
184
+
182
185
  if (temp == "N/A")
183
186
  return nil
184
187
  else
@@ -192,23 +195,20 @@ module Weather
192
195
  # as anonymous objects (i.e. wind.d for wind direction, wind.s for wind speed, etc.)
193
196
  def complex_attribute(objxml)
194
197
  obj = {}
195
- class << obj
196
- def method_missing(name)
197
- return self[name.to_s]
198
- end
199
- end
200
198
 
201
199
  objxml.elements.each do |element|
202
200
  obj[element.name] = element.text
203
201
  end
204
202
 
205
- return obj
203
+ return OpenStruct.new(obj)
206
204
  end
207
205
 
206
+ # Adds more verbose names for wind properties. For example, "speed" for wind speed
207
+ # rather than just "s".
208
208
  def fix_wind(obj)
209
- obj['heading'] = obj.t
210
- obj['direction'] = obj.d.to_i
211
- obj['speed'] = obj.s.to_i
209
+ obj.heading = obj.t
210
+ obj.direction = obj.d.to_i
211
+ obj.speed = obj.s.to_i
212
212
 
213
213
  return obj
214
214
  end
@@ -227,6 +227,8 @@ module Weather
227
227
  @xml = element
228
228
  end
229
229
 
230
+ # The numeric ID for the icon representing current conditions.
231
+ # You can find the corresponding icons packaged with RubyWeather in the example/weather_32 directory.
230
232
  def icon
231
233
  xml.elements['icon'].text.to_i
232
234
  end
@@ -258,9 +260,9 @@ module Weather
258
260
  # Abstract class representing either a day or night in the daily forecast (note that "future" can include today).
259
261
  class FutureConditions < Conditions
260
262
  attr_reader :xml
261
-
263
+
262
264
  @xml
263
-
265
+
264
266
  def initialize(element)
265
267
  if (not element.kind_of? REXML::Element)
266
268
  raise "The xml element given to the Day/Night constructor must be a valid REXML::Element"
@@ -292,6 +294,8 @@ module Weather
292
294
  Time.local(Time.now.year, mon, day)
293
295
  end
294
296
 
297
+ # The numeric ID for the icon representing these forecast conditions.
298
+ # You can find the corresponding icons packaged with RubyWeather in the example/weather_32 directory.
295
299
  def icon
296
300
  mypart.elements['icon'].text.to_i
297
301
  end
@@ -333,7 +337,7 @@ module Weather
333
337
  minute = minute.to_i
334
338
  Time.local(date.year, date.month, date.day, hour, minute)
335
339
  end
336
-
340
+
337
341
  end
338
342
 
339
343
  # The daytime part of the forecast for a given day.
@@ -341,17 +345,17 @@ module Weather
341
345
  def initialize(element)
342
346
  super(element)
343
347
  end
344
-
348
+
345
349
  def temp
346
350
  high
347
351
  end
348
352
  alias tmp temp
349
353
  alias temperature temp
350
-
354
+
351
355
  private
352
- def mypart
353
- @xml.elements['part[@p="d"]']
354
- end
356
+ def mypart
357
+ @xml.elements['part[@p="d"]']
358
+ end
355
359
  end
356
360
 
357
361
  # The nighttime part of a forecast for a given day.
@@ -365,11 +369,11 @@ module Weather
365
369
  end
366
370
  alias tmp temp
367
371
  alias temperature temp
368
-
372
+
369
373
  private
370
- def mypart
371
- @xml.elements['part[@p="n"]']
372
- end
374
+ def mypart
375
+ @xml.elements['part[@p="n"]']
376
+ end
373
377
  end
374
378
  end
375
379
 
@@ -19,6 +19,8 @@ module Weather
19
19
  # Returns the forecast data fetched from the weather.com xoap service for the given location and number of days.
20
20
  def fetch_forecast(location_id, days = 5)
21
21
 
22
+ days = 5 if days.nil? or days.empty?
23
+
22
24
  # try to pull the partner_id and license_key from the environment if not already set
23
25
  partner_id = ENV['WEATHER_COM_PARTNER_ID'] unless partner_id
24
26
  license_key = ENV['WEATHER_COM_LICENSE_KEY'] unless license_key
@@ -42,7 +44,7 @@ module Weather
42
44
 
43
45
  # default to metric (degrees fahrenheit are just silly :)
44
46
  unit = imperial ? "s" : "m"
45
-
47
+ puts "#{location_id} #{partner_id} #{license_key} DAYS: #{days.inspect}"
46
48
  host = "xoap.weather.com"
47
49
  url = "/weather/local/#{location_id}?cc=*&dayf=#{days}&prod=xoap&par=#{partner_id}&key=#{license_key}&unit=#{unit}"
48
50
 
@@ -53,12 +55,14 @@ module Weather
53
55
  xml = Net::HTTP.get(host, url)
54
56
 
55
57
  if cache?
58
+ # TODO: most of the processing time seems to be in parsing xml text to REXML::Document...
59
+ # maybe we should try caching some other serialized form? YAML?
56
60
  doc = REXML::Document.new(xml)
57
61
  doc.root.attributes['cached_on'] = Time.now
58
62
  cache.set("#{location_id}:#{days}", doc.to_s, cache_expiry)
59
63
  end
60
64
  end
61
-
65
+ puts xml
62
66
  doc = REXML::Document.new(xml)
63
67
 
64
68
  Forecast::Forecast.new(doc)
@@ -105,9 +109,9 @@ module Weather
105
109
  end
106
110
  end
107
111
 
108
- # True if caching is enabled, false otherwise.
112
+ # True if caching is enabled and at least one memcached server is alive, false otherwise.
109
113
  def cache?
110
- @cache and cache.active?
114
+ @cache and cache.active? and not cache.servers.dup.delete_if{|s| !s.alive?}.empty?
111
115
  end
112
116
 
113
117
  # Turns off weather forecast caching.
data/test/profiler.rb ADDED
@@ -0,0 +1,52 @@
1
+ require 'rubygems'
2
+ require 'ruby-prof'
3
+
4
+
5
+
6
+ require File.dirname(__FILE__) + '/../lib/weather/service'
7
+ require File.dirname(__FILE__) + '/../lib/weather/forecast'
8
+ require File.dirname(__FILE__) + '/../lib/weather/util'
9
+
10
+
11
+
12
+ @filename = File.expand_path(File.dirname(__FILE__) + "/test_weather.xml")
13
+
14
+
15
+ puts ""
16
+ puts "Loading forecast..."
17
+
18
+ start = Time.now
19
+ RubyProf.start
20
+ @forecast = Weather::Service.new.load_forecast(@filename)
21
+ @forecast2 = Weather::Service.new.load_forecast(@filename)
22
+ @forecast3 = Weather::Service.new.load_forecast(@filename)
23
+ @forecast4 = Weather::Service.new.load_forecast(@filename)
24
+ @forecast5 = Weather::Service.new.load_forecast(@filename)
25
+ load_result = RubyProf.stop
26
+
27
+ puts "#{Time.now - start} seconds!"
28
+
29
+ puts ""
30
+ puts "Examining forecast..."
31
+
32
+ start = Time.now
33
+ RubyProf.start
34
+ @forecast.location_name
35
+ @forecast.current.temp
36
+ @forecast.day(1).date.month
37
+ @forecast.day(3).wind.speed
38
+ @forecast.night(2).date.day
39
+ @forecast.tomorrow.outlook
40
+ @forecast.current.wind.heading
41
+ @forecast.tomorrow.temp
42
+ @forecast.latest_update
43
+ use_result = RubyProf.stop
44
+
45
+ puts "#{Time.now - start} seconds!"
46
+ puts ""
47
+
48
+ printer = RubyProf::FlatPrinter.new(load_result)
49
+ printer.print(STDOUT, 3.0)
50
+
51
+ printer = RubyProf::FlatPrinter.new(use_result)
52
+ printer.print(STDOUT, 1.0)
data/test/service_test.rb CHANGED
@@ -65,6 +65,8 @@ class ServiceTest < Test::Unit::TestCase
65
65
  @service.enable_cache
66
66
  @service.cache.servers = "localhost:11211"
67
67
 
68
+ raise "Memcache server must be up and running at localhost:11211 for this test to run." unless @service.cache?
69
+
68
70
  @service.cache.delete("#{TEST_LOCATION}:5")
69
71
 
70
72
  assert_equal @service.fetch_forecast(TEST_LOCATION, 5).xml.to_s, @service.fetch_forecast(TEST_LOCATION, 5).xml.to_s.gsub(/ cached_on='.*?'/, '')
metadata CHANGED
@@ -1,9 +1,9 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.8.11
2
+ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: rubyweather
5
5
  version: !ruby/object:Gem::Version
6
- version: 1.1.0
6
+ version: 1.1.1
7
7
  date: 2006-07-28 00:00:00 -04:00
8
8
  summary: Client library for accessing weather.com's xoap weather data.
9
9
  require_paths:
@@ -25,80 +25,81 @@ required_ruby_version: !ruby/object:Gem::Version::Requirement
25
25
  platform: ruby
26
26
  signing_key:
27
27
  cert_chain:
28
+ post_install_message:
28
29
  authors:
29
30
  - Matt Zukowski
30
31
  files:
31
- - weather.rb
32
32
  - install.rb
33
33
  - init.rb
34
- - lib/weather/service.rb
34
+ - weather.rb
35
35
  - lib/weather/forecast.rb
36
+ - lib/weather/service.rb
36
37
  - lib/weather/util.rb
37
- - LICENSE
38
38
  - README
39
- - test/forecast_test.rb
39
+ - LICENSE
40
40
  - test/service_test.rb
41
+ - test/forecast_test.rb
42
+ - test/profiler.rb
41
43
  - test/test_weather.xml
42
- - example/weather_32
43
44
  - example/weather_portlet_controller.rb
45
+ - example/weather_32
44
46
  - example/forecast.rhtml
45
- - example/weather_32/0.png
46
- - example/weather_32/1.png
47
- - example/weather_32/2.png
48
- - example/weather_32/3.png
49
- - example/weather_32/4.png
50
47
  - example/weather_32/5.png
51
- - example/weather_32/6.png
52
- - example/weather_32/7.png
53
- - example/weather_32/8.png
54
- - example/weather_32/9.png
55
- - example/weather_32/WS_FTP.LOG
56
- - example/weather_32/Thumbs.db
48
+ - example/weather_32/41.png
49
+ - example/weather_32/4.png
50
+ - example/weather_32/32.png
57
51
  - example/weather_32/na.png
58
- - example/weather_32/10.png
52
+ - example/weather_32/33.png
53
+ - example/weather_32/40.png
54
+ - example/weather_32/25.png
55
+ - example/weather_32/29.png
56
+ - example/weather_32/16.png
57
+ - example/weather_32/28.png
59
58
  - example/weather_32/11.png
60
- - example/weather_32/12.png
59
+ - example/weather_32/42.png
61
60
  - example/weather_32/13.png
62
- - example/weather_32/14.png
63
- - example/weather_32/15.png
64
- - example/weather_32/16.png
65
- - example/weather_32/17.png
61
+ - example/weather_32/45.png
62
+ - example/weather_32/43.png
63
+ - example/weather_32/26.png
66
64
  - example/weather_32/18.png
65
+ - example/weather_32/3.png
66
+ - example/weather_32/35.png
67
67
  - example/weather_32/19.png
68
+ - example/weather_32/31.png
69
+ - example/weather_32/24.png
70
+ - example/weather_32/23.png
71
+ - example/weather_32/10.png
72
+ - example/weather_32/46.png
73
+ - example/weather_32/8.png
68
74
  - example/weather_32/20.png
69
- - example/weather_32/21.png
75
+ - example/weather_32/6.png
70
76
  - example/weather_32/22.png
71
- - example/weather_32/23.png
72
- - example/weather_32/24.png
73
- - example/weather_32/25.png
74
- - example/weather_32/26.png
75
- - example/weather_32/27.png
76
- - example/weather_32/28.png
77
- - example/weather_32/29.png
77
+ - example/weather_32/1.png
78
+ - example/weather_32/47.png
79
+ - example/weather_32/17.png
80
+ - example/weather_32/2.png
81
+ - example/weather_32/38.png
82
+ - example/weather_32/44.png
83
+ - example/weather_32/Thumbs.db
84
+ - example/weather_32/15.png
85
+ - example/weather_32/0.png
86
+ - example/weather_32/7.png
87
+ - example/weather_32/21.png
88
+ - example/weather_32/36.png
89
+ - example/weather_32/39.png
78
90
  - example/weather_32/30.png
79
- - example/weather_32/31.png
80
- - example/weather_32/32.png
81
- - example/weather_32/33.png
91
+ - example/weather_32/14.png
82
92
  - example/weather_32/34.png
83
- - example/weather_32/35.png
84
- - example/weather_32/36.png
93
+ - example/weather_32/9.png
85
94
  - example/weather_32/37.png
86
- - example/weather_32/38.png
87
- - example/weather_32/39.png
88
- - example/weather_32/40.png
89
- - example/weather_32/41.png
90
- - example/weather_32/42.png
91
- - example/weather_32/43.png
92
- - example/weather_32/44.png
93
- - example/weather_32/45.png
94
- - example/weather_32/46.png
95
- - example/weather_32/47.png
95
+ - example/weather_32/12.png
96
+ - example/weather_32/27.png
96
97
  test_files:
97
- - test/forecast_test.rb
98
98
  - test/service_test.rb
99
+ - test/forecast_test.rb
99
100
  rdoc_options:
100
101
  - --title
101
- - RubyWeather 1.1.0 RDocs
102
+ - RubyWeather 1.1.1 RDocs
102
103
  - --main
103
104
  - README
104
105
  - --line-numbers
@@ -1,49 +0,0 @@
1
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\0.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 0.png
2
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\1.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 1.png
3
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\10.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 10.png
4
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\11.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 11.png
5
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\12.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 12.png
6
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\13.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 13.png
7
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\14.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 14.png
8
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\15.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 15.png
9
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\16.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 16.png
10
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\17.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 17.png
11
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\18.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 18.png
12
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\19.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 19.png
13
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\2.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 2.png
14
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\20.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 20.png
15
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\21.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 21.png
16
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\22.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 22.png
17
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\23.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 23.png
18
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\24.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 24.png
19
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\25.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 25.png
20
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\26.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 26.png
21
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\27.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 27.png
22
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\28.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 28.png
23
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\29.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 29.png
24
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\3.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 3.png
25
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\30.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 30.png
26
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\31.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 31.png
27
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\32.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 32.png
28
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\33.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 33.png
29
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\34.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 34.png
30
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\35.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 35.png
31
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\36.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 36.png
32
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\37.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 37.png
33
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\38.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 38.png
34
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\39.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 39.png
35
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\4.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 4.png
36
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\40.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 40.png
37
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\41.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 41.png
38
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\42.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 42.png
39
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\43.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 43.png
40
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\44.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 44.png
41
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\45.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 45.png
42
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\46.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 46.png
43
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\47.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 47.png
44
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\5.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 5.png
45
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\6.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 6.png
46
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\7.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 7.png
47
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\8.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 8.png
48
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\9.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 9.png
49
- 2005.11.14 11:00 B U:\cq's\14773\wx_icons32x32\na.png <-- ftp.twc.weather.com /Server HD/Web Folder/wx_icons_pngs/wx_icons32x32 na.png