12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- '''
- Copyright (c) 2012 Matt Layman
- Gzip cache
- ----------
- A plugin to create .gz cache files for optimization.
- '''
- import gzip
- import logging
- import os
- from pelican import signals
- logger = logging.getLogger(__name__)
- # A list of file types to exclude from possible compression
- EXCLUDE_TYPES = [
- # Compressed types
- '.bz2',
- '.gz',
- # Audio types
- '.aac',
- '.flac',
- '.mp3',
- '.wma',
- # Image types
- '.gif',
- '.jpg',
- '.jpeg',
- '.png',
- # Video types
- '.avi',
- '.mov',
- '.mp4',
- ]
- def create_gzip_cache(pelican):
- '''Create a gzip cache file for every file that a webserver would
- reasonably want to cache (e.g., text type files).
- :param pelican: The Pelican instance
- '''
- for dirpath, _, filenames in os.walk(pelican.settings['OUTPUT_PATH']):
- for name in filenames:
- if should_compress(name):
- filepath = os.path.join(dirpath, name)
- create_gzip_file(filepath)
- def should_compress(filename):
- '''Check if the filename is a type of file that should be compressed.
- :param filename: A file name to check against
- '''
- for extension in EXCLUDE_TYPES:
- if filename.endswith(extension):
- return False
- return True
- def create_gzip_file(filepath):
- '''Create a gzipped file in the same directory with a filepath.gz name.
- :param filepath: A file to compress
- '''
- compressed_path = filepath + '.gz'
- with open(filepath, 'rb') as uncompressed:
- try:
- logger.debug('Compressing: %s' % filepath)
- compressed = gzip.open(compressed_path, 'wb')
- compressed.writelines(uncompressed)
- except Exception as ex:
- logger.critical('Gzip compression failed: %s' % ex)
- finally:
- compressed.close()
- def register():
- signals.finalized.connect(create_gzip_cache)
|