Beispiel #1
0
 public IEnumerable<Volume> GetVolumes()
 {
     using (var stream = Open()) {
         var parser = new VolumeParser { Log = Log };
         Date created;
         using (var reader = parser.Open(stream, out created))
             return parser.GetVolumes(reader).ToArray();
     }
 }
Beispiel #2
0
 public void Convert(CatalogParser parser, XmlReader reader, Date created,
                     Stream bookStream, Stream volumeStream)
 {
     // There are almost 42,000 books and 520,000 files in the project Gutenberg. We set
     // up 59 * 10,000 steps here to have the progress bar stretching quite good and still
     // having a little space to grow for the project content.
     var progress = Log.Action(59, "Converting catalog...");
     int bookCount = 0, skippedCount = 0, volumeCount = 0, totalCount = 0;
     var bookParser = new BookParser { Log = Log };
     var volumeParser = new VolumeParser { Log = Log };
     using (var bookWriter = bookParser.Create(bookStream, created))
     using (var volumeWriter = volumeParser.Create(volumeStream, created)) {
         foreach (var item in parser.GetItems(reader)) {
             var book = item as Book;
             if (book != null) {
                 // Book 9140 and a couple of others are invalid.
                 if (string.IsNullOrEmpty(book.Title)) {
                     Log.Verbose("Skipping book {0} with no title.", book.Number);
                     ++skippedCount;
                 } else {
                     bookParser.Write(bookWriter, book);
                 }
                 ++bookCount;
             } else {
                 volumeParser.Write(volumeWriter, (Volume) item);
                 ++volumeCount;
             }
             // One step after every 10,000 items run nicely on my laptop; less loaded the
             // CPU with constant reporting and more made the console wait for too long.
             if (++totalCount % 10000 == 0)
                 progress.Continue("{0} items processed...", totalCount);
         }
         bookParser.Finalize(bookWriter);
         volumeParser.Finalize(volumeWriter);
     }
     Log.Verbose("{0} books and {1} volumes were processed, {2} books skipped.",
         bookCount, volumeCount, skippedCount);
     progress.Finish();
 }