youtube-dl

Another place where youtube-dl lives on
git clone git://git.oshgnacknak.de/youtube-dl.git
Log | Files | Refs | README | LICENSE

xattrpp.py (2926B)


      1 from __future__ import unicode_literals
      2 
      3 from .common import PostProcessor
      4 from ..compat import compat_os_name
      5 from ..utils import (
      6     hyphenate_date,
      7     write_xattr,
      8     XAttrMetadataError,
      9     XAttrUnavailableError,
     10 )
     11 
     12 
     13 class XAttrMetadataPP(PostProcessor):
     14 
     15     #
     16     # More info about extended attributes for media:
     17     #   http://freedesktop.org/wiki/CommonExtendedAttributes/
     18     #   http://www.freedesktop.org/wiki/PhreedomDraft/
     19     #   http://dublincore.org/documents/usageguide/elements.shtml
     20     #
     21     # TODO:
     22     #  * capture youtube keywords and put them in 'user.dublincore.subject' (comma-separated)
     23     #  * figure out which xattrs can be used for 'duration', 'thumbnail', 'resolution'
     24     #
     25 
     26     def run(self, info):
     27         """ Set extended attributes on downloaded file (if xattr support is found). """
     28 
     29         # Write the metadata to the file's xattrs
     30         self._downloader.to_screen('[metadata] Writing metadata to file\'s xattrs')
     31 
     32         filename = info['filepath']
     33 
     34         try:
     35             xattr_mapping = {
     36                 'user.xdg.referrer.url': 'webpage_url',
     37                 # 'user.xdg.comment':            'description',
     38                 'user.dublincore.title': 'title',
     39                 'user.dublincore.date': 'upload_date',
     40                 'user.dublincore.description': 'description',
     41                 'user.dublincore.contributor': 'uploader',
     42                 'user.dublincore.format': 'format',
     43             }
     44 
     45             num_written = 0
     46             for xattrname, infoname in xattr_mapping.items():
     47 
     48                 value = info.get(infoname)
     49 
     50                 if value:
     51                     if infoname == 'upload_date':
     52                         value = hyphenate_date(value)
     53 
     54                     byte_value = value.encode('utf-8')
     55                     write_xattr(filename, xattrname, byte_value)
     56                     num_written += 1
     57 
     58             return [], info
     59 
     60         except XAttrUnavailableError as e:
     61             self._downloader.report_error(str(e))
     62             return [], info
     63 
     64         except XAttrMetadataError as e:
     65             if e.reason == 'NO_SPACE':
     66                 self._downloader.report_warning(
     67                     'There\'s no disk space left, disk quota exceeded or filesystem xattr limit exceeded. '
     68                     + (('Some ' if num_written else '') + 'extended attributes are not written.').capitalize())
     69             elif e.reason == 'VALUE_TOO_LONG':
     70                 self._downloader.report_warning(
     71                     'Unable to write extended attributes due to too long values.')
     72             else:
     73                 msg = 'This filesystem doesn\'t support extended attributes. '
     74                 if compat_os_name == 'nt':
     75                     msg += 'You need to use NTFS.'
     76                 else:
     77                     msg += '(You may have to enable them in your /etc/fstab)'
     78                 self._downloader.report_error(msg)
     79             return [], info