<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Python on Time Friend</title><link>https://time-friend.com/zh/tags/python/</link><description>Recent content in Python on Time Friend</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Wed, 16 Sep 2026 10:00:00 +0000</lastBuildDate><atom:link href="https://time-friend.com/zh/tags/python/index.xml" rel="self" type="application/rss+xml"/><item><title>从 emuMMC 里提取 Switch 存档: 非标准 AES-XTS、FAT32 与 DISF 的实现</title><link>https://time-friend.com/zh/archive/switch-emummc-save-extraction/</link><pubDate>Wed, 16 Sep 2026 10:00:00 +0000</pubDate><guid>https://time-friend.com/zh/archive/switch-emummc-save-extraction/</guid><description>&lt;p&gt;那台破解过的 Switch 已经不在我手上了, 只剩一张 512GB 的 SD 卡。我想做的事很具体: 把当年玩出来的游戏存档救出来, 导进 Android 上的 Eden(一个 yuzu 分支), 接着玩下去。&lt;/p&gt;
&lt;p&gt;我第一反应是插上读卡器去翻 &lt;code&gt;Nintendo/save/&lt;/code&gt;。里面确实有存档, 但只有两个, 文件名是 &lt;code&gt;8000000000000000&lt;/code&gt; 和 &lt;code&gt;8000000000000124&lt;/code&gt;, 都是 NAX0 加密的系统存档, 和游戏进度无关。整张卡能看到的目录翻了一遍, 找不到任何一处像游戏存档。这个结果很反直觉: 存档明明是这台机器产生的, 怎么会不在卡上。&lt;/p&gt;
&lt;p&gt;任天堂的说法是, 游戏存档只存在主机的内部存储 eMMC 里, 不能复制到 microSD; SD 卡上只有游戏本体、更新、DLC、截图和系统存档。那破解机的存档在哪——emuMMC。&lt;/p&gt;
&lt;h2 id="存档不在-sd-卡表面-而在-emummc-镜像里"&gt;存档不在 SD 卡表面, 而在 emuMMC 镜像里&lt;/h2&gt;
&lt;p&gt;破解常用&amp;quot;虚拟系统&amp;quot;emuMMC: 把主机整块 eMMC 完整复制到 SD 卡, 开机时引导到这份副本。于是卡里 &lt;code&gt;emuMMC/SD00/eMMC/&lt;/code&gt; 下的 &lt;code&gt;00&lt;/code&gt; 到 &lt;code&gt;07&lt;/code&gt; 不是八个文件, 是同一块内部存储被 4GB 切开的分片(受 FAT 单文件上限所迫), 旁边还有 &lt;code&gt;BOOT0&lt;/code&gt;、&lt;code&gt;BOOT1&lt;/code&gt; 两个引导分区。这张 SD 卡里因此藏着一整台 Switch 的内部存储, 大约 30GB, 游戏存档就在镜像的 &lt;code&gt;USER&lt;/code&gt; 分区。&lt;/p&gt;</description></item><item><title>掌机前端的媒体数据管理: SteamGridDB 封面抓取、图片规格与元数据源选择</title><link>https://time-friend.com/zh/archive/handheld-media-data-management/</link><pubDate>Tue, 08 Sep 2026 16:00:00 +0000</pubDate><guid>https://time-friend.com/zh/archive/handheld-media-data-management/</guid><description>&lt;p&gt;掌机前端 iiSU 的界面是那种偏视觉的样式: 进游戏库是一格格方形封面, 选中某个游戏后整个背景换成一张横版大图, 大图正中再浮着游戏的文字 logo。我这个库里有四十多个 Switch 游戏, 一开始封面缺了一大半, 有图的也尺寸、比例、透明通道各不相同; 标题、发行信息这些元数据同样是缺的。手动去网上找图、一张张裁、再一个个填, 换到第十个游戏我就放弃了, 于是把它写成了一条批量流水线。封面和元数据看起来是两件事, 其实都是同一类活: 把外部的媒体数据整理成前端能直接用的格式。&lt;/p&gt;
&lt;h2 id="前端要的三张图-各管一块界面"&gt;前端要的三张图, 各管一块界面&lt;/h2&gt;
&lt;p&gt;最开始的误区是把三种图当成同一种封面。实际上它们各管界面的一块区域, 规格也不一样。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;icon.png&lt;/code&gt; 是方格列表里那张方形封面, 也是游戏卡片的主图, 规格是 512×512、不透明的 RGB。&lt;code&gt;hero_1.jpg&lt;/code&gt; 是选中游戏后的全屏背景, 横版 16:9, 我统一成 1280×720, 居中裁剪, 避免拉伸变形。&lt;code&gt;title.png&lt;/code&gt; 最容易被搞错——它&lt;strong&gt;不是封面&lt;/strong&gt;, 而是浮在背景之上的文字 logo 浮层, 必须是透明背景的 PNG(RGBA), 只在游戏 logo 处不透明, 同样 1280×720。&lt;/p&gt;
&lt;p&gt;分辨方法很直接: 把这张图单独放在白底上看。如果它占满整张、有背景色, 那就是封面; 如果只有中间一行游戏名字、四周透明, 那是 logo 浮层。这个区分做对了, 界面才不会出现&amp;quot;方形 logo 糊在背景中间&amp;quot;或者&amp;quot;背景被拉成方块&amp;quot;的怪样子。有些游戏在 SteamGridDB 上根本没有横版 logo, 硬塞一张方形的进去只会变成中间一块糊图, 这种情况我干脆删掉 &lt;code&gt;title.png&lt;/code&gt;, 让它不显示浮层, 反而干净。&lt;/p&gt;


&lt;div class="mermaid-wrap"&gt;
&lt;pre class="mermaid" role="img" aria-label="Mermaid diagram"&gt;flowchart TB
 A[&amp;#34;ROM 目录名 / TitleID&amp;#34;] --&amp;gt; B[&amp;#34;SteamGridDB API&amp;lt;br/&amp;gt;grids / logos / heroes&amp;#34;]
 B --&amp;gt; C[&amp;#34;下载原图&amp;#34;]
 C --&amp;gt; D[&amp;#34;统一规格&amp;lt;br/&amp;gt;居中裁剪 / 去黑图 / 透明通道&amp;#34;]
 D --&amp;gt; E[&amp;#34;adb push 到&amp;lt;br/&amp;gt;consoles/&amp;amp;lt;平台&amp;amp;gt;/&amp;amp;lt;ROM名&amp;amp;gt;/&amp;#34;]
 E --&amp;gt; F[&amp;#34;删除 rom_asset_index.fb&amp;lt;br/&amp;gt;重启前端重建索引&amp;#34;]&lt;/pre&gt;
&lt;/div&gt;


&lt;script type="module"&gt;
import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';
mermaid.initialize({
 startOnLoad: false,
 theme: 'base',
 themeVariables: {
 background: '#1d1f21',
 primaryColor: '#282c34',
 primaryBorderColor: '#3e4147',
 primaryTextColor: '#c9cacc',
 lineColor: '#5a5f66',
 edgeLabelBackground: '#1d1f21'
 }
});
mermaid.run({ querySelector: 'pre.mermaid' });
&lt;/script&gt;


&lt;h2 id="steamgriddb-的三个端点"&gt;SteamGridDB 的三个端点&lt;/h2&gt;
&lt;p&gt;三种图对应 SteamGridDB 的三个资源端点, 用同一个游戏 ID 分别请求。方形封面走 &lt;code&gt;grids/game/{id}&lt;/code&gt; 并带上 &lt;code&gt;types=static&amp;amp;dimensions=512x512&lt;/code&gt;, 直接拿到接近目标规格的方图; 透明文字 logo 走 &lt;code&gt;logos/game/{id}&lt;/code&gt;, 这里要注意挑&lt;strong&gt;横版比例大于 1.8&lt;/strong&gt; 的那张, 否则会拿到偏方形的 logo, 浮在背景上很难看; 背景横幅走 &lt;code&gt;heroes/game/{id}&lt;/code&gt;, 原始图通常是 1920×620, 需要自己裁成 16:9。&lt;/p&gt;</description></item></channel></rss>