#!/usr/bin/python
"""
getcams.py - Archiwizowanie ulubionych kamer sieciowych
Sean B. Palmer, <http://purl.org/net/sbp/>, 2003-07.
Licencja: GPL 2; podziel si prac - miej zabawy!

Uycie: 
   python getcams.py [ <nazwapliku> ]

Domylnie <nazwapliku> to URIs.txt
"""

import urllib2, time
from urllib import quote
from email.Utils import parsedate

# # # # # # # # # # # # # # # # #
# Konfiguracja
# 
# czsto pobierania danych w sekundach
seconds = 15

# do jakiego pliku pisa
index = 'webcams.html' 

# Koniec konfiguracji!
# # # # # # # # # # # # # # # # #

def quoteURI(uri): 
   # przekszta URI w nazw pliku.
   return quote(uri, safe='')

def makeHTML(uris): 
   # Utworzenie indeksu HTML umoliwiajcego
   # przegldanie pobranych obrazw.
   print "Tworzenie indeksu kadrw z kamer ", index

   f = open(index, 'w')
   print >> f, '<html xmlns="http://www.w3.org/1999/xhtml" >'
   print >> f, '<head><title>My Webcams</title></head>'
   print >> f, '<body>'
   for uri in uris: 
      # URI danego obrazka zostanie uyty jako nazwa pliku, ale trzeba 
      # zakodowa go najpierw szesnastkowo, aby nie byo problemw ze strony 
      # systemu operacyjnego. Poniszy kod dekoduje URI.
      link = quoteURI(uri).replace('%', '%25')

      # Teraz przygotowujemy obrazek i podajemy link do oryginau.
      print >> f, '<p><img src="%s" alt=" " /><br />' % link
      print >> f, '-<a href="%s">%s</a></p>' % (uri, uri)
   print >> f, '</body>'
   print >> f, '</html>'
   f.close(  )
   print "Indeks utworzono!\n"

metadata = {}

def getURI(uri): 
   print "Sprawdzanie ", uri

   # Prba otwarcia URI--jeszcze niczego nie pobieramy.
   try: u = urllib2.urlopen(uri)
   except Exception, e: print "   ...niepowodzenie:", e
   else: 
      # Pobranie pewnych informacji o URI; posu do sprawdzenia, czy obraz
      # si zmieni.
      info = u.info(  )
      meta = (info.get('last-modified'), info.get('content-size'))
      print "   ...odebrano metadane:", meta

      if metadata.get(uri) == meta: 
         print "   ...nie pobieram: nie zaktualizowano"
      else: 
         # Obrazek zosta zaktualizowany, wic go pobieramy.
         metadata[uri] = meta
         print "   ...pobieranie; typ: %s; wielko: %s" % \
            (info.get('content-type', '?'), info.get('content-size', '?'))
         data = u.read(  )
         open(quoteURI(uri), 'wb').write(data)
         print "   ...gotowe! %s bytes" % len(data)

         # Zapis pobranej wersji na pniej.
         t = parsedate(info.get('last-modified'))
         archv = quoteURI(uri) + '-' + time.strftime('%Y%m%dT%H%M%S', t) + 
'.jpg'
         open(archv, 'wb').write(data)
      u.close(  )

def doRun(uris): 
   for uri in uris: 
      startTime = time.time(  )
      getURI(uri)
      finishTime = time.time(  )

      timeTaken = finishTime - startTime
      print "Przetworzenie tego URI zajo", timeTaken, "sekund\n"
      timeLeft = seconds - timeTaken # czas do nastpnego wykonania
      if timeLeft > 0: time.sleep(timeLeft)

def main(argv): 
   # Potrzebna jest lista adresw URI do pobierania. Adresy te musz by
   # w pliku; nastpny wiersz powoduje, e domylnym plikiem jest URIs.txt,
   # chyba e nazwa pliku zostanie opbrana z wiersza polece.
   fn = (argv + [None])[0] or 'URIs.txt'
   data = open(fn).read(  )
   uris = data.splitlines(  )

   # Utworzenie indeksu, nastpnie pobieranie kolejnych obrazkw.
   makeHTML(uris)
   while 1: doRun(uris)

if __name__=="__main_  _": 
   import sys
   # Jeli uytkownik prosi o pomoc, posuchajmy go!
   # Jeli nie, uruchamiamy program normalnie.
   if sys.argv[1:] in (['--help', '-h', '-?']): 
      print __doc_  _
   else: main(sys.argv[1:]) 

