Hi, when the NCSU Libraries decided to locally host content that we created for OCA, I put together a set of PHP scripts similar, but more basic to what Graham described. Based on a list of IDs, one went and calculated the amount of storage that we needed. This does not work for the different types of e-reader files since they only provide page numbers, but the size of these files is rather negligible.
Another one downloaded the files, stored the files in a separate folder, created checksums and stored filenames, types, original and post-download checksums in a MySQL database so that we can check for any discrepancies. Let me know if you have any questions, Markus