Sjoerd Mullender:

Added support for unseekable files.

(I use unqualified excepts since we don't know why the seek/tell might
fail.  In my case it was because of an AttributeError.)
diff --git a/Lib/chunk.py b/Lib/chunk.py
index 320339e..4105f31 100644
--- a/Lib/chunk.py
+++ b/Lib/chunk.py
@@ -63,7 +63,12 @@
             raise EOFError
         self.chunksize = self.chunksize - 8 # subtract header
         self.size_read = 0
-        self.offset = self.file.tell()
+        try:
+            self.offset = self.file.tell()
+        except:
+            self.seekable = 0
+        else:
+            self.seekable = 1
 
     def getname(self):
         """Return the name (ID) of the current chunk."""
@@ -87,6 +92,8 @@
 
         if self.closed:
             raise ValueError, "I/O operation on closed file"
+        if not self.seekable:
+            raise IOError, "cannot seek"
         if mode == 1:
             pos = pos + self.size_read
         elif mode == 2:
@@ -133,11 +140,20 @@
 
         if self.closed:
             raise ValueError, "I/O operation on closed file"
-        try:
-            self.file.seek(self.chunksize - self.size_read, 1)
-        except RuntimeError:
-            while self.size_read < self.chunksize:
-                dummy = self.read(8192)
-                if not dummy:
-                    raise EOFError
+        if self.seekable:
+            try:
+                n = self.chunksize - self.size_read
+                # maybe fix alignment
+                if self.align and (self.chunksize & 1):
+                    n = n + 1
+                self.file.seek(n, 1)
+                self.size_read = self.size_read + n
+                return
+            except:
+                pass
+        while self.size_read < self.chunksize:
+            n = min(8192, self.chunksize - self.size_read)
+            dummy = self.read(n)
+            if not dummy:
+                raise EOFError