From 46387b1b949ca7861b97dfe8e54b8ae6bc863c8a Mon Sep 17 00:00:00 2001 From: Roland Crosby Date: Tue, 18 Mar 2025 23:10:29 -0400 Subject: [PATCH] Add "Where from" metadata on macOS --- yt_dlp/postprocessor/xattrpp.py | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/yt_dlp/postprocessor/xattrpp.py b/yt_dlp/postprocessor/xattrpp.py index e486b797b7..92e8e83d97 100644 --- a/yt_dlp/postprocessor/xattrpp.py +++ b/yt_dlp/postprocessor/xattrpp.py @@ -1,4 +1,5 @@ import os +import sys from .common import PostProcessor from ..utils import ( @@ -35,15 +36,38 @@ class XAttrMetadataPP(PostProcessor): # 'user.xdg.comment': 'description', } + PLATFORM_XATTR_MAPPING = { + 'darwin': { + 'com.apple.metadata:kMDItemWhereFroms': 'webpage_url', + }, + } + + APPLE_PLIST_TEMPLATE = ''' + + + +\t%s + +''' + + def format_value(self, xattrname, infoname, value): + if infoname == 'upload_date': + return hyphenate_date(value) + if xattrname == 'com.apple.metadata:kMDItemWhereFroms': + return self.APPLE_PLIST_TEMPLATE % value + return value + def run(self, info): mtime = os.stat(info['filepath']).st_mtime self.to_screen('Writing metadata to file\'s xattrs') - for xattrname, infoname in self.XATTR_MAPPING.items(): + + mapping = dict(self.XATTR_MAPPING) + mapping.update(self.PLATFORM_XATTR_MAPPING.get(sys.platform, {})) + for xattrname, infoname in mapping.items(): try: value = info.get(infoname) if value: - if infoname == 'upload_date': - value = hyphenate_date(value) + value = self.format_value(xattrname, infoname, value) write_xattr(info['filepath'], xattrname, value.encode()) except XAttrUnavailableError as e: