<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Phosphene on 小景</title>
        <link>https://jingyuan-zheng.github.io/zh/tags/phosphene/</link>
        <description>Recent content in Phosphene on 小景</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-Hans</language>
        <copyright>Jingyuan Zheng</copyright>
        <lastBuildDate>Tue, 11 Aug 2026 21:45:00 +0200</lastBuildDate><atom:link href="https://jingyuan-zheng.github.io/zh/tags/phosphene/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>如何在MacOS上设置自己喜欢的视频当作视频壁纸并适配系统级锁屏和解锁特效（附：设置史努比Snoopy屏保和壁纸教程）</title>
            <link>https://jingyuan-zheng.github.io/zh/p/macos-custom-video-wallpaper-snoopy/</link>
            <pubDate>Tue, 11 Aug 2026 21:45:00 +0200</pubDate>
            <guid>https://jingyuan-zheng.github.io/zh/p/macos-custom-video-wallpaper-snoopy/</guid>
            <description>&lt;img src=&#34;https://jingyuan-zheng.github.io/img/macos-custom-video-wallpaper-snoopy/featured.webp&#34; alt=&#34;Featured image of post 如何在MacOS上设置自己喜欢的视频当作视频壁纸并适配系统级锁屏和解锁特效（附：设置史努比Snoopy屏保和壁纸教程）&#34; /&gt;&lt;p&gt;本文介绍一个依靠 macOS 系统墙纸机制运行的自定义视频壁纸方案：既能把任意视频加入“系统设置 → 墙纸”，也能实现锁屏播放、桌面静止和解锁时平滑定格，并附带 Apple TV 高清史努比 Snoopy 屏保视频的提取方法。&lt;/p&gt;&#xA;&lt;h2 id=&#34;先来一个效果展示&#34;&gt;先来一个效果展示&#xA;&lt;/h2&gt;&lt;div class=&#34;post-figure&#34;&gt;&#xA;    &lt;video controls playsinline muted preload=&#34;metadata&#34; poster=&#34;/img/macos-custom-video-wallpaper-snoopy/featured.webp&#34; style=&#34;width: 100%; height: auto; border-radius: 8px;&#34;&gt;&#xA;        &lt;source src=&#34;https://jingyuan-zheng.github.io/img/macos-custom-video-wallpaper-snoopy/lock-screen-demo.mp4&#34; type=&#34;video/mp4&#34;&gt;&#xA;        你的浏览器暂不支持 HTML5 视频播放。&#xA;    &lt;/video&gt;&#xA;    &lt;div class=&#34;caption&#34;&gt;演示 1：锁屏时播放 Snoopy 动画，解锁后平滑回到桌面。&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;h2 id=&#34;一般macos视频壁纸软件缺陷--缺乏的史努比snoopy视频壁纸&#34;&gt;一般macOS视频壁纸软件缺陷 &amp;amp; 缺乏的史努比Snoopy视频壁纸&#xA;&lt;/h2&gt;&lt;p&gt;在 Mac 上设置视频壁纸，往往需要单独下载 Wallpaper Engine 一类的动态壁纸软件。这些软件可能收费，需要在后台持续循环播放视频，不能在系统锁屏页面播放，也无法实现解锁时缓慢定格等系统级效果，更不能通过 macOS 的墙纸设置统一管理和切换。&lt;/p&gt;&#xA;&lt;p&gt;许多人也很喜欢 Apple TV 自带的史努比 Snoopy 屏保，遗憾的是苹果并没有将它引入 Mac，这些可爱的屏保和壁纸不能在 macOS 中直接使用。现在已经存在若干移植方案，比如 &lt;a class=&#34;link&#34; href=&#34;https://github.com/hitnology/snoopy&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Snoopy&lt;/a&gt; 和 &lt;a class=&#34;link&#34; href=&#34;https://github.com/Cyber-Yichen/Snoopy-Saver&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Snoopy-Saver&lt;/a&gt;。它们主要通过传统屏幕保护程序等方式实现，不能直接设置为桌面壁纸；部分旧方案还存在内存占用高、壁纸不全等问题。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;本文介绍一个能够实现系统级自定义视频壁纸的方案：视频可以像 macOS 自带墙纸一样出现在系统设置中，整个播放过程依赖系统的墙纸管道，不需要壁纸管理软件持续在后台运行。&lt;/strong&gt; 后文还会介绍如何在不安装 Xcode 等开发工具的情况下，获取 Apple TV 中完整、高清的史努比 Snoopy 屏保视频。如果你只想把自己的视频设为壁纸，可以直接跳到“视频壁纸的安装”。&lt;/p&gt;&#xA;&lt;h2 id=&#34;软件介绍与优势&#34;&gt;软件介绍与优势&#xA;&lt;/h2&gt;&lt;p&gt;本文主要通过 &lt;a class=&#34;link&#34; href=&#34;https://github.com/kageroumado/phosphene&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Phosphene&lt;/a&gt; 实现。这是一款通过 macOS 私有墙纸框架提供原生级视频壁纸功能的开源软件：导入的视频会和苹果自带的 Aerials 视频墙纸一样显示在系统墙纸设置中，并获得锁屏播放、解锁时从动态画面平滑切换到静态墙纸等系统级效果；你也可以按喜好让视频在桌面上持续播放。&lt;/p&gt;&#xA;&lt;p&gt;由于 Phosphene 使用 macOS 内置的墙纸管道，这些功能不需要像普通动态壁纸软件那样让主程序一直驻留。设置完成后，即使使用 &lt;code&gt;⌘ Command + Q&lt;/code&gt; 完全退出 Phosphene，系统的 &lt;code&gt;WallpaperAgent&lt;/code&gt; 仍会通过 Phosphene 的墙纸扩展负责播放、锁屏、待机和熄屏状态切换。&lt;/p&gt;&#xA;&lt;h3 id=&#34;phosphene-的主要功能&#34;&gt;Phosphene 的主要功能&#xA;&lt;/h3&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;导入自己的视频&lt;/strong&gt;：支持 MP4、MOV 以及 macOS AVFoundation 能读取的视频格式，导入后直接显示在“系统设置 → 墙纸”中。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;无缝循环播放&lt;/strong&gt;：在循环边界连续衔接画面，减少普通播放器循环时的停顿或闪烁。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;多显示器和不同桌面空间&lt;/strong&gt;：可以由 macOS 为不同显示器或 Space 保存墙纸选择。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;跟随电量和系统状态调整&lt;/strong&gt;：会根据供电方式、电池电量、温度、游戏模式、锁屏和闲置状态调整播放策略。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;锁屏专用模式&lt;/strong&gt;：开启 &lt;code&gt;Only on Lock Screen&lt;/code&gt; 后，桌面显示静态画面，锁屏时再播放，并在解锁时平滑减速定格。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;被窗口完全遮挡时暂停&lt;/strong&gt;：可通过 &lt;code&gt;Pause When Hidden&lt;/code&gt; 减少不必要的渲染。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;生成不同质量版本&lt;/strong&gt;：可为视频建立较低分辨率或帧率的变体，在省电状态下自动使用更轻量的版本。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;菜单栏管理&lt;/strong&gt;：可以预览当前墙纸、暂停播放、切换显示器、打开墙纸设置或重启系统墙纸代理。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;需要注意的是，Phosphene 使用的是 Apple 未公开的私有框架，macOS 大版本更新后存在需要适配的可能。截至本文发布时，当前版本为 &lt;strong&gt;Phosphene 1.2.2&lt;/strong&gt;，要求 &lt;strong&gt;macOS Tahoe 26 或更高版本&lt;/strong&gt;，同时提供 Apple 芯片和 Intel Mac 的通用版本。&lt;/p&gt;&#xA;&lt;h2 id=&#34;步骤&#34;&gt;步骤&#xA;&lt;/h2&gt;&lt;h3 id=&#34;安装-phosphene&#34;&gt;安装 Phosphene&#xA;&lt;/h3&gt;&lt;p&gt;如果你已经安装 Homebrew，可以通过下面的命令安装：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew install --cask phosphene&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;你也可以前往 Phosphene 的 &lt;a class=&#34;link&#34; href=&#34;https://github.com/kageroumado/phosphene/releases/tag/v1.2.2&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;GitHub Releases&lt;/a&gt; 下载签名并经过 notarization 的 DMG，把 Phosphene 拖入“应用程序”文件夹后打开。&lt;/p&gt;&#xA;&lt;h3 id=&#34;获取原版-apple-tv-的-snoopy-屏保&#34;&gt;获取原版 Apple TV 的 Snoopy 屏保&#xA;&lt;/h3&gt;&lt;p&gt;虽然可以通过 Xcode 下载 Apple TV 模拟环境并从中获取原版屏保，但整个过程终究太麻烦。&lt;/p&gt;&#xA;&lt;p&gt;GitHub 上的 &lt;a class=&#34;link&#34; href=&#34;https://github.com/Cyber-Yichen/Snoopy-Saver&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Snoopy-Saver&lt;/a&gt; 项目已经收集了完整屏保资源，并制作成可以在 Mac 上使用的屏幕保护程序。它本身是传统的屏幕保护程序，不属于 Aerials 视频墙纸，无法同时在桌面播放或实现本文所需的系统视频墙纸效果；因此，这里不会安装它，只会从安装包中取出 Apple TV 的高清原版视频文件。&lt;/p&gt;&#xA;&lt;p&gt;打开 Snoopy-Saver 的 &lt;a class=&#34;link&#34; href=&#34;https://github.com/Cyber-Yichen/Snoopy-Saver/releases/tag/V1.1.0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Snoopy 1.1 Release 页面&lt;/a&gt;，下载下面 &lt;strong&gt;5 个附件&lt;/strong&gt;：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;Install-Snoopy-1.1.zip&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Snoopy-1.1.dmg.part-aa&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Snoopy-1.1.dmg.part-ab&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Snoopy-1.1.dmg.part-ac&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Snoopy-1.1.dmg.part-ad&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;四个 DMG 分卷每个大约 1.85 GB，请先确认磁盘空间和网络流量足够。页面中自动生成的 &lt;code&gt;Source code&lt;/code&gt; 压缩包不是这里需要的文件，不必下载。&lt;/p&gt;&#xA;&lt;div class=&#34;post-figure&#34;&gt;&#xA;    &lt;img src=&#34;https://jingyuan-zheng.github.io/img/macos-custom-video-wallpaper-snoopy/download-assets.webp&#34; alt=&#34;Snoopy-Saver Release 页面中的安装器 ZIP 和四个 DMG 分卷&#34;&gt;&#xA;    &lt;div class=&#34;caption&#34;&gt;图 1：需要下载安装器 ZIP 和 aa、ab、ac、ad 四个 DMG 分卷。&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;解压 &lt;code&gt;Install-Snoopy-1.1.zip&lt;/code&gt;，并确保得到的 &lt;code&gt;Install Snoopy.command&lt;/code&gt; 和四个 DMG 分卷位于同一个文件夹。Release 原版脚本会在重组、校验 DMG 后继续安装屏幕保护程序；我们只需要里面的视频资源，所以先不要运行脚本，而是在 Finder 中右键 &lt;code&gt;Install Snoopy.command&lt;/code&gt;，选择“打开方式 → 文本编辑”。&lt;/p&gt;&#xA;&lt;div class=&#34;post-figure&#34;&gt;&#xA;    &lt;img src=&#34;https://jingyuan-zheng.github.io/img/macos-custom-video-wallpaper-snoopy/edit-installer-script.webp&#34; alt=&#34;在 Finder 中用文本编辑打开 Install Snoopy.command&#34;&gt;&#xA;    &lt;div class=&#34;caption&#34;&gt;图 2：先用“文本编辑”打开命令文件，不要直接执行原安装流程。&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;打开后按下 &lt;code&gt;⌘ Command + A&lt;/code&gt; 全选，再按 &lt;code&gt;Delete&lt;/code&gt; 删除原内容，然后替换为下面的脚本：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;&#xA;&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;30&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;31&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;32&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;33&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;34&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;35&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;36&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;37&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;38&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;39&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;40&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;41&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;42&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;43&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;44&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;45&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;46&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;47&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;48&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;49&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;50&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;51&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;52&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;53&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;54&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;55&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;56&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;57&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;58&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;59&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;60&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;61&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;62&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;63&#xA;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;64&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td class=&#34;lntd&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#!/bin/bash&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; -euo pipefail&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;EXPECTED_SHA256&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;63b20990a6d6d7aaa6e485bac91587a28e19eb2acedf465f0acfeeea089f8b17&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PART_NAMES&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;Snoopy-1.1.dmg.part-aa&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;Snoopy-1.1.dmg.part-ab&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;Snoopy-1.1.dmg.part-ac&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;Snoopy-1.1.dmg.part-ad&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;SCRIPT_DIR&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;dirname &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$0&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;pwd&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PART_DIR&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; candidate in &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$SCRIPT_DIR&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;dirname &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$SCRIPT_DIR&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nv&#34;&gt;complete&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; name in &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;PART_NAMES&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[@]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;[[&lt;/span&gt; -f &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$candidate&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$name&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;complete&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[[&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$complete&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; -eq &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;PART_DIR&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$candidate&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;break&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[[&lt;/span&gt; -z &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$PART_DIR&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;错误：没有找到全部 4 个 DMG 分卷。&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Please place the installer and all four DMG parts in the same folder.&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  /usr/bin/osascript -e &lt;span class=&#34;s1&#34;&gt;&amp;#39;display alert &amp;#34;缺少 Snoopy 安装文件&amp;#34; message &amp;#34;请把安装器和全部 4 个 DMG 分卷放在同一个文件夹，再重新打开。&amp;#34; as critical&amp;#39;&lt;/span&gt; &amp;gt;/dev/null 2&amp;gt;&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;DMG&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$PART_DIR&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/Snoopy-1.1.dmg&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;TEMP_DMG&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$PART_DIR&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/Snoopy-1.1.dmg.tmp&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cleanup&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  rm -f &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$TEMP_DMG&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;trap&lt;/span&gt; cleanup EXIT INT TERM&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;正在重组 Snoopy 1.1 DMG，请稍候…&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; name in &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;PART_NAMES&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[@]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  /bin/cat &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$PART_DIR&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$name&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;done&lt;/span&gt; &amp;gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$TEMP_DMG&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;正在校验 SHA-256…&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;ACTUAL_SHA256&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;shasum -a &lt;span class=&#34;m&#34;&gt;256&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$TEMP_DMG&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; awk &lt;span class=&#34;s1&#34;&gt;&amp;#39;{print $1}&amp;#39;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[[&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$ACTUAL_SHA256&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; !&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$EXPECTED_SHA256&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;错误：DMG 校验失败。请重新下载全部分卷。&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  /usr/bin/osascript -e &lt;span class=&#34;s1&#34;&gt;&amp;#39;display alert &amp;#34;Snoopy 安装文件损坏&amp;#34; message &amp;#34;DMG 的 SHA-256 校验失败。请删除并重新下载全部 4 个分卷。&amp;#34; as critical&amp;#39;&lt;/span&gt; &amp;gt;/dev/null 2&amp;gt;&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mv -f &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$TEMP_DMG&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$DMG&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;DMG 重组完成：&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$DMG&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;open -R &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$DMG&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &amp;gt;/dev/null 2&amp;gt;&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/usr/bin/osascript -e &lt;span class=&#34;s1&#34;&gt;&amp;#39;display dialog &amp;#34;Snoopy 1.1 DMG 已成功重组并通过 SHA-256 校验。&amp;#34; buttons {&amp;#34;好&amp;#34;} default button &amp;#34;好&amp;#34; with icon note&amp;#39;&lt;/span&gt; &amp;gt;/dev/null 2&amp;gt;&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;这段脚本保留了 Release 原有的分卷检查和 SHA-256 校验，但移除了把屏保安装进系统的步骤，只会把四个分卷合并成完整的 DMG 磁盘映像。&lt;/p&gt;&#xA;&lt;p&gt;保存修改后，双击 &lt;code&gt;Install Snoopy.command&lt;/code&gt;。脚本完成时会在同一目录生成 &lt;code&gt;Snoopy-1.1.dmg&lt;/code&gt;，并在 Finder 中显示它。如果 macOS 阻止运行，可以确认文件来自上面的项目 Release 后，右键脚本选择“打开”；必要时再前往“系统设置 → 隐私与安全性”选择“仍要打开”。&lt;/p&gt;&#xA;&lt;p&gt;双击打开 DMG，会看到其中的 &lt;code&gt;Snoopy.saver&lt;/code&gt;。把它拖到一个可以正常搜索的文件夹中，例如当前下载目录；不要直接在只读的 DMG 窗口里继续操作。&lt;/p&gt;&#xA;&lt;div class=&#34;post-figure&#34;&gt;&#xA;    &lt;img src=&#34;https://jingyuan-zheng.github.io/img/macos-custom-video-wallpaper-snoopy/snoopy-dmg.webp&#34; alt=&#34;Snoopy 1.1 DMG 中的 Snoopy.saver 文件&#34;&gt;&#xA;    &lt;div class=&#34;caption&#34;&gt;图 3：DMG 中的 Snoopy.saver 包，先把它拖到普通文件夹。&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;在刚刚复制出来的 &lt;code&gt;Snoopy.saver&lt;/code&gt; 上右键。&lt;strong&gt;注意不要双击，也不要选择菜单第一项“打开”&lt;/strong&gt;，而要选择 &lt;strong&gt;“显示包内容”&lt;/strong&gt;；如果 Finder 使用英文，则对应 &lt;code&gt;Show Package Contents&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;div class=&#34;post-figure&#34;&gt;&#xA;    &lt;img src=&#34;https://jingyuan-zheng.github.io/img/macos-custom-video-wallpaper-snoopy/show-package-contents.webp&#34; alt=&#34;Finder 右键菜单中的 Show Package Contents 显示包内容&#34;&gt;&#xA;    &lt;div class=&#34;caption&#34;&gt;图 4：在 Snoopy.saver 上右键，选择“显示包内容”。&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;进入屏幕保护程序包后，不必在复杂目录中逐层寻找。直接在 Finder 搜索框输入 &lt;code&gt;.mov&lt;/code&gt;，并将搜索范围保留在 &lt;code&gt;Snoopy.saver&lt;/code&gt; 中；随后按文件大小排序，就能快速找到适合作为壁纸的完整视频。包中还有许多很短的转场片段或图片资源，文件较大的 MOV 通常更容易对应完整场景。&lt;/p&gt;&#xA;&lt;div class=&#34;post-figure&#34;&gt;&#xA;    &lt;img src=&#34;https://jingyuan-zheng.github.io/img/macos-custom-video-wallpaper-snoopy/search-mov-files.webp&#34; alt=&#34;在 Snoopy.saver 包中搜索 MOV 视频并按大小排序&#34;&gt;&#xA;    &lt;div class=&#34;caption&#34;&gt;图 5：搜索 .mov 并按大小排序，可以更快筛选完整场景。&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;h3 id=&#34;视频壁纸的安装&#34;&gt;视频壁纸的安装&#xA;&lt;/h3&gt;&lt;p&gt;打开刚刚安装的 Phosphene，将找到的 Snoopy 视频拖进主窗口；也可以点击右上角的 &lt;code&gt;+&lt;/code&gt; 选择文件。&lt;/p&gt;&#xA;&lt;p&gt;当然，Phosphene 支持任意视频。除了 Snoopy，你也可以导入自己拍摄或下载的其他视频。&lt;/p&gt;&#xA;&lt;div class=&#34;post-figure&#34;&gt;&#xA;    &lt;img src=&#34;https://jingyuan-zheng.github.io/img/macos-custom-video-wallpaper-snoopy/phosphene-library.webp&#34; alt=&#34;Phosphene 视频库中已导入的 Snoopy 视频&#34;&gt;&#xA;    &lt;div class=&#34;caption&#34;&gt;图 6：把视频拖入 Phosphene 后，它会出现在视频库中。&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;在 Phosphene 中选中一个视频，右侧会显示分辨率、帧率、时长、文件大小和编码格式。&lt;code&gt;Optimization&lt;/code&gt; 提供三个档位：&lt;code&gt;Battery Saver&lt;/code&gt;、&lt;code&gt;Balanced&lt;/code&gt; 和 &lt;code&gt;Quality&lt;/code&gt;，选择后可通过 &lt;code&gt;Create Variants&lt;/code&gt; 生成适合不同电量状态的版本。&lt;/p&gt;&#xA;&lt;p&gt;我的建议是先保留默认的 &lt;code&gt;Balanced&lt;/code&gt;。如果你特别在意画质，可以改为 &lt;code&gt;Quality&lt;/code&gt;；如果更关注续航，则可以使用 &lt;code&gt;Battery Saver&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;div class=&#34;post-figure&#34;&gt;&#xA;    &lt;img src=&#34;https://jingyuan-zheng.github.io/img/macos-custom-video-wallpaper-snoopy/phosphene-quality.webp&#34; alt=&#34;Phosphene 中 Battery Saver、Balanced 和 Quality 三种视频优化档位&#34;&gt;&#xA;    &lt;div class=&#34;caption&#34;&gt;图 7：默认 Balanced 通常已经够用，也可以按续航和画质需求调整。&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;最终效果仍主要取决于视频源本身。MacBook 的高分辨率屏幕更适合清晰、横向且画面稳定的视频；如果视频本身只有较低分辨率，把优化档位调高也不会凭空增加细节。&lt;/p&gt;&#xA;&lt;p&gt;如果你需要寻找 4K 视频素材，可以从下面几个网站开始：&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.pexels.com/home/videos/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Pexels Videos&lt;/a&gt;：自然、城市和生活类素材较多。&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://pixabay.com/videos/search/4k/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Pixabay 4K Videos&lt;/a&gt;：可以直接浏览 4K 分类。&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://mixkit.co/free-stock-video/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Mixkit 4K Stock Video&lt;/a&gt;：提供 4K 与 HD 素材，并标明具体许可证类型。&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.ysjf.com/material&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;影视飓风素材库&lt;/a&gt;：中文素材站，可继续寻找适合当作动态壁纸的高清视频。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;不同网站、不同素材的授权范围可能不完全相同。下载前请查看对应素材页的许可证，尤其不要把仅限个人使用或带有第三方版权角色的内容重新分发。&lt;/p&gt;&#xA;&lt;p&gt;完成导入后，视频墙纸会被 macOS 调用，并在“系统设置 → 墙纸”中与苹果自带墙纸一起显示。选择一个视频，就可以像切换系统墙纸一样进行设置。&lt;/p&gt;&#xA;&lt;p&gt;Phosphene 只是视频库和设置的管理入口。墙纸设置好后，可以使用 &lt;code&gt;⌘ Command + Q&lt;/code&gt; 完全退出主程序，实际播放仍由 macOS 的墙纸进程和 Phosphene 扩展负责。&lt;/p&gt;&#xA;&lt;div class=&#34;post-figure&#34;&gt;&#xA;    &lt;img src=&#34;https://jingyuan-zheng.github.io/img/macos-custom-video-wallpaper-snoopy/system-wallpaper.webp&#34; alt=&#34;macOS 系统设置墙纸页面中的 Phosphene Video Wallpapers 分组&#34;&gt;&#xA;    &lt;div class=&#34;caption&#34;&gt;图 8：导入的视频会显示在系统墙纸设置的 Phosphene 分组中。&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;如果以后要移除某个视频，建议在 Phosphene 中选中它并使用 &lt;code&gt;Delete from Library&lt;/code&gt;；也可以先通过 &lt;code&gt;Show in Finder&lt;/code&gt; 查看实际文件位置，再手动处理。&lt;/p&gt;&#xA;&lt;p&gt;默认情况下，视频会在桌面和锁屏持续播放，效果如下：&lt;/p&gt;&#xA;&lt;div class=&#34;post-figure&#34;&gt;&#xA;    &lt;video controls playsinline muted preload=&#34;metadata&#34; poster=&#34;/img/macos-custom-video-wallpaper-snoopy/desktop-poster.webp&#34; style=&#34;width: 100%; height: auto; border-radius: 8px;&#34;&gt;&#xA;        &lt;source src=&#34;https://jingyuan-zheng.github.io/img/macos-custom-video-wallpaper-snoopy/desktop-demo.mp4&#34; type=&#34;video/mp4&#34;&gt;&#xA;        你的浏览器暂不支持 HTML5 视频播放。&#xA;    &lt;/video&gt;&#xA;    &lt;div class=&#34;caption&#34;&gt;演示 2：视频墙纸在桌面上持续播放。&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;如果你想恢复 macOS 自带 Aerials 那种“只在锁屏播放、桌面保持静止，解锁时从动态画面平滑过渡到静态”的效果，可以点击菜单栏中的 Phosphene 图标，展开 &lt;code&gt;Options&lt;/code&gt;，开启 &lt;code&gt;Only on Lock Screen&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;div class=&#34;post-figure&#34;&gt;&#xA;    &lt;img src=&#34;https://jingyuan-zheng.github.io/img/macos-custom-video-wallpaper-snoopy/only-on-lock-screen.webp&#34; alt=&#34;Phosphene 菜单栏设置中的 Only on Lock Screen 开关&#34;&gt;&#xA;    &lt;div class=&#34;caption&#34;&gt;图 9：开启 Only on Lock Screen 后，视频只在锁屏界面播放。&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;h2 id=&#34;总结&#34;&gt;总结&#xA;&lt;/h2&gt;&lt;p&gt;这套方案最重要的区别，不是简单地把一个视频窗口铺在桌面后面，而是让自定义视频真正进入 macOS 的系统墙纸管道。设置完成后，视频会出现在系统墙纸列表中，锁屏、解锁、睡眠和桌面状态都由 macOS 负责协调，Phosphene 主程序也不需要一直运行。&lt;/p&gt;&#xA;&lt;p&gt;如果你已经有喜欢的视频，安装 Phosphene、导入文件并在系统设置中选中它即可；Snoopy 部分完全是可选步骤。想获得更接近苹果自带 Aerials 的体验，记得开启 &lt;code&gt;Only on Lock Screen&lt;/code&gt;；想让桌面一直动起来，则保持它关闭。&lt;/p&gt;&#xA;&lt;p&gt;目前最大的限制是 Phosphene 依赖未公开的系统框架，并且当前版本要求 macOS Tahoe 26 或更高版本。只要系统版本符合要求，这已经是我目前体验过最接近 macOS 原生动态墙纸的一种实现。&lt;/p&gt;&#xA;&lt;h2 id=&#34;qa&#34;&gt;Q&amp;amp;A&#xA;&lt;/h2&gt;&lt;h3 id=&#34;phosphene-支持哪些-mac&#34;&gt;Phosphene 支持哪些 Mac？&#xA;&lt;/h3&gt;&lt;p&gt;截至本文发布时，Phosphene 1.2.2 要求 macOS Tahoe 26 或更高版本，同时支持 Apple 芯片和 Intel Mac。由于它依赖私有框架，升级 macOS 大版本后，建议先查看项目 README 或 Releases 是否有新的兼容性说明。&lt;/p&gt;&#xA;&lt;h3 id=&#34;一定要下载-snoopy-saver-才能使用吗&#34;&gt;一定要下载 Snoopy-Saver 才能使用吗？&#xA;&lt;/h3&gt;&lt;p&gt;不需要。Snoopy-Saver 只用于取得 Apple TV 的 Snoopy 视频文件。只想使用自己的视频时，可以直接安装 Phosphene，然后跳到“视频壁纸的安装”。&lt;/p&gt;&#xA;&lt;h3 id=&#34;退出-phosphene-后视频壁纸为什么还能播放&#34;&gt;退出 Phosphene 后，视频壁纸为什么还能播放？&#xA;&lt;/h3&gt;&lt;p&gt;Phosphene 主程序负责管理视频和选项，真正显示墙纸的是运行在 macOS &lt;code&gt;WallpaperAgent&lt;/code&gt; 中的墙纸扩展。因此，设置完成后可以退出主程序，当前墙纸仍会继续工作。&lt;/p&gt;&#xA;&lt;h3 id=&#34;墙纸变灰卡住或显示了错误的视频怎么办&#34;&gt;墙纸变灰、卡住或显示了错误的视频怎么办？&#xA;&lt;/h3&gt;&lt;p&gt;先点击菜单栏中的 Phosphene 图标，选择 &lt;code&gt;Restart Wallpaper Agent&lt;/code&gt;。项目说明中提到，快速连续切换视频时，macOS 的墙纸代理偶尔可能出现状态不同步，重启代理通常可以立即恢复，不必重启整台 Mac。&lt;/p&gt;&#xA;&lt;h3 id=&#34;怎样减少耗电&#34;&gt;怎样减少耗电？&#xA;&lt;/h3&gt;&lt;p&gt;可以开启 &lt;code&gt;Only on Lock Screen&lt;/code&gt;，让桌面保持静态；也可以开启 &lt;code&gt;Pause When Hidden&lt;/code&gt;，或在视频优化中选择 &lt;code&gt;Balanced&lt;/code&gt;、&lt;code&gt;Battery Saver&lt;/code&gt; 并创建较轻量的视频变体。视频的分辨率、帧率和编码复杂度也会影响实际功耗。&lt;/p&gt;&#xA;&lt;h3 id=&#34;为什么要修改-snoopy-saver-的安装脚本&#34;&gt;为什么要修改 Snoopy-Saver 的安装脚本？&#xA;&lt;/h3&gt;&lt;p&gt;原版脚本的目标是重组 DMG、校验文件，然后把 &lt;code&gt;Snoopy.saver&lt;/code&gt; 安装到屏幕保护程序目录。本文只需要提取视频，不需要安装另一个屏保，所以修改后的版本会在完成重组与 SHA-256 校验后停止。它不会修改四个原始分卷。&lt;/p&gt;&#xA;&lt;h3 id=&#34;snoopy-视频可以随意重新上传或商用吗&#34;&gt;Snoopy 视频可以随意重新上传或商用吗？&#xA;&lt;/h3&gt;&lt;p&gt;不建议。Snoopy 角色、Apple TV 媒体和相关素材有各自的权利归属，Snoopy-Saver 项目也明确声明与 Peanuts Worldwide LLC、花生漫画及 Apple Inc. 无关。本文方法更适合个人学习和自用；如果使用其他素材，也请遵守对应网站和作者的许可证。&lt;/p&gt;&#xA;&lt;h2 id=&#34;参考资料&#34;&gt;参考资料&#xA;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/kageroumado/phosphene&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Phosphene：项目主页与使用说明&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/kageroumado/phosphene/releases/tag/v1.2.2&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Phosphene 1.2.2 Release&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/Cyber-Yichen/Snoopy-Saver/releases/tag/V1.1.0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Snoopy-Saver：Snoopy 1.1 Release 与分卷下载说明&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/hitnology/snoopy&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;hitnology/snoopy：macOS Snoopy 屏保移植项目&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.reddit.com/r/MacOS/comments/1i74ut2/psa_the_absolute_easiest_way_to_get_the_snoopy/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Reddit：The absolute easiest way to get the Snoopy screen saver on macOS&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.reddit.com/r/MacOS/comments/1i84ccr/snoopy_custom_screensaver_with_download_link/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Reddit：Snoopy custom screensaver（with download link）&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.reddit.com/r/MacOS/comments/1i1myyk/apple_tv_snoopy_screen_saver_now_can_use_on_macos/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Reddit：Apple TV Snoopy Screen Saver now can use on macOS&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/watch?v=TSOQLyqEL8U&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;YouTube：macOS Snoopy 屏保相关演示&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;免责声明&#34;&gt;免责声明&#xA;&lt;/h2&gt;&lt;p&gt;本文是个人独立撰写的非官方技术分享，仅用于学习与交流，与 Peanuts Worldwide LLC、Apple Inc. 及其关联公司不存在隶属、授权、认可或合作关系。&lt;/p&gt;&#xA;&lt;p&gt;Snoopy、Peanuts 及相关角色、名称和素材的权利归其各自权利人所有；Apple、Apple TV、tvOS、macOS 及相关商标和素材的权利归 Apple Inc. 所有。本站不提供或托管 Apple TV Snoopy 原始视频文件，也不授予任何相关素材的复制、重新分发或商业使用权。请仅在具有合法访问权限的前提下，将相关资源用于个人学习与非商业用途。&lt;/p&gt;&#xA;</description>
        </item></channel>
</rss>
