<?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 ttz.pw</title>
    <link>https://www.ttz.pw/categories/python/</link>
    <description>Recent content in Python on ttz.pw</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh-cn</language>
    <lastBuildDate>Sat, 12 Oct 2024 11:12:59 +0800</lastBuildDate>
    
        <atom:link href="https://www.ttz.pw/categories/python/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>Python 调用 QML 的两种方式</title>
      <link>https://www.ttz.pw/post/python-qml/</link>
      <pubDate>Sat, 12 Oct 2024 11:12:59 +0800</pubDate>
      
      <guid>https://www.ttz.pw/post/python-qml/</guid>
      
        <description>&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/python-qml/#1-qquickview&#34;&gt;1. QQuickView&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/python-qml/#2-qqmlapplicationengine&#34;&gt;2. QQmlApplicationEngine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/python-qml/#3-%e4%b8%bb%e8%a6%81%e5%8c%ba%e5%88%ab&#34;&gt;3. 主要区别&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/python-qml/#4-%e6%80%bb%e7%bb%93&#34;&gt;4. 总结&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;在 PySide6 ​和 QML ​中，有两种主要的方式来创建和管理 QML UI：使用 &lt;code&gt;QQuickView&lt;/code&gt; 和 &lt;code&gt;QQmlApplicationEngine&lt;/code&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;1-qquickview&#34;&gt;1. QQuickView&lt;/h2&gt;
&lt;p&gt;QQuickView 是一个可视化窗口，用于显示和管理 QML UI。您可以将 QQuickView 视为一个独立的窗口，它可以加载和显示 QML 文件。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;QQuickView&lt;/code&gt; 或 &lt;code&gt;QQmlApplicationEngine&lt;/code&gt; 类可以创建一个 QML 视图对象，它是一个高级界面容器，可以显示 QML 内容。&lt;/li&gt;
&lt;li&gt;QML 视图可以加载和显示 QML 文件，而不需要额外的代码。&lt;/li&gt;
&lt;li&gt;可以使用 &lt;code&gt;rootObject()&lt;/code&gt; 方法获取根 QML 对象，然后通过该对象访问 QML 中的属性和方法。&lt;/li&gt;
&lt;li&gt;QML 视图对象通常用于简单的界面应用程序，而不需要太多的自定义逻辑。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;QML 视图对象通常用于简单的界面应用程序，而不需要太多的自定义逻辑。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;from&lt;/span&gt; PySide6.QtCore &lt;span style=&#34;color:#ff79c6&#34;&gt;import&lt;/span&gt; QUrl
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;from&lt;/span&gt; PySide6.QtGui &lt;span style=&#34;color:#ff79c6&#34;&gt;import&lt;/span&gt; QGuiApplication
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;from&lt;/span&gt; PySide6.QtQuick &lt;span style=&#34;color:#ff79c6&#34;&gt;import&lt;/span&gt; QQuickView
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&lt;/span&gt;&lt;span&gt;app &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; QGuiApplication([])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6&lt;/span&gt;&lt;span&gt;view &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; QQuickView()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7&lt;/span&gt;&lt;span&gt;view&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;setSource(QUrl&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;fromLocalFile(&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;main.qml&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;8&lt;/span&gt;&lt;span&gt;view&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;show()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;9&lt;/span&gt;&lt;span&gt;app&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;exec()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述示例中，我们创建了一个 QQuickView ​对象，并使用 &lt;code&gt;setSource&lt;/code&gt; 方法加载了一个 QML ​文件。然后，使用 &lt;code&gt;show&lt;/code&gt; 方法显示了窗口，最后通过 &lt;code&gt;app.exec&lt;/code&gt; 进入 Qt ​事件循环。&lt;/p&gt;
&lt;h2 id=&#34;2-qqmlapplicationengine&#34;&gt;2. QQmlApplicationEngine&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;QQmlApplicationEngine&lt;/code&gt; 是一个 QML ​引擎，它可以加载和执行 QML ​文件，并将其嵌入到现有的 Qt 应用程序中。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;QmlEngine&lt;/code&gt; 类可以创建一个 QML 引擎对象，它负责加载和管理 QML 内容。&lt;/li&gt;
&lt;li&gt;可以将 QML 文件加载到引擎中，并通过引擎对象与 Python 代码进行交互。&lt;/li&gt;
&lt;li&gt;引擎对象可以设置全局属性、注册自定义类型和提供信号与槽机制。&lt;/li&gt;
&lt;li&gt;可以通过 &lt;code&gt;rootObjects()&lt;/code&gt; 方法获取根 QML 对象，然后通过该对象访问 QML 中的属性和方法。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;from&lt;/span&gt; PySide6.QtCore &lt;span style=&#34;color:#ff79c6&#34;&gt;import&lt;/span&gt; QUrl
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;from&lt;/span&gt; PySide6.QtGui &lt;span style=&#34;color:#ff79c6&#34;&gt;import&lt;/span&gt; QGuiApplication
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;from&lt;/span&gt; PySide6.QtQml &lt;span style=&#34;color:#ff79c6&#34;&gt;import&lt;/span&gt; QQmlApplicationEngine
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&lt;/span&gt;&lt;span&gt;app &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; QGuiApplication([])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6&lt;/span&gt;&lt;span&gt;engine &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; QQmlApplicationEngine()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7&lt;/span&gt;&lt;span&gt;engine&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;load(QUrl&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;fromLocalFile(&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;main.qml&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;8&lt;/span&gt;&lt;span&gt;app&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;exec()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述示例中，我们创建了一个 QQmlApplicationEngine ​对象，并使用 load 方法加载了一个 QML ​文件。然后，通过 app.exec 进入 Qt 事件循环。&lt;/p&gt;
&lt;h2 id=&#34;3-主要区别&#34;&gt;3. 主要区别&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;QQuickView ​是一个可视化窗口，可以作为独立的应用程序窗口来使用，可以使用窗口管理功能，例如调整大小、最小化等。&lt;/li&gt;
&lt;li&gt;QQmlApplicationEngine ​是一个 QML 引擎，主要用于将 QML 嵌入到现有的 Qt 应用程序中，没有独立的窗口管理功能。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;4-总结&#34;&gt;4. 总结&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;使用 QML 引擎（QML Engine）可以手动加载 QML 文件并进行更多的自定义操作，适用于需要更复杂交互和逻辑的场景。&lt;/li&gt;
&lt;li&gt;使用 QML 视图（QML View）是一种简化的方式，适用于简单的界面应用程序，无需太多自定义操作。&lt;/li&gt;
&lt;li&gt;如果您只需要一个独立的 QML 窗口，可以使用 QQuickView。如果您希望将 QML 嵌入到现有的 Qt 应用程序中，可以选择 QQmlApplicationEngine。&lt;/li&gt;
&lt;/ul&gt;</description>
      
    </item>
    
    <item>
      <title>大文件并发分片下载</title>
      <link>https://www.ttz.pw/post/python-download/</link>
      <pubDate>Thu, 26 Sep 2024 14:55:01 +0800</pubDate>
      
      <guid>https://www.ttz.pw/post/python-download/</guid>
      
        <description>&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/python-download/#1-%e4%b8%bb%e8%a6%81%e5%8a%9f%e8%83%bd&#34;&gt;1. 主要功能：&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/python-download/#11-%e5%b9%b6%e8%a1%8c%e5%88%86%e6%ae%b5%e4%b8%8b%e8%bd%bd%e6%96%87%e4%bb%b6&#34;&gt;1.1. 并行分段下载文件&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/python-download/#12-%e6%98%be%e7%a4%ba%e4%b8%8b%e8%bd%bd%e8%bf%9b%e5%ba%a6&#34;&gt;1.2. 显示下载进度&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/python-download/#13-%e6%96%ad%e7%82%b9%e7%bb%ad%e4%bc%a0&#34;&gt;1.3. 断点续传&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/python-download/#2-%e5%85%b3%e9%94%ae%e6%a8%a1%e5%9d%97%e4%b8%8e%e5%8a%9f%e8%83%bd%e8%a7%a3%e9%87%8a&#34;&gt;2. 关键模块与功能解释：&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/python-download/#21-%e6%96%87%e4%bb%b6%e7%9a%84%e5%88%86%e6%ae%b5%e8%af%b7%e6%b1%82-fetch_one&#34;&gt;2.1. 文件的分段请求 (fetch_one)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/python-download/#22-%e5%a4%9a%e7%ba%bf%e7%a8%8b%e4%b8%8b%e8%bd%bd-insert_data&#34;&gt;2.2. 多线程下载 (insert_data)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/python-download/#23-%e6%98%be%e7%a4%ba%e4%b8%8b%e8%bd%bd%e8%bf%9b%e5%ba%a6-tqdm&#34;&gt;2.3. 显示下载进度 (tqdm)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/python-download/#24-%e6%96%ad%e7%82%b9%e7%bb%ad%e4%bc%a0&#34;&gt;2.4. 断点续传&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/python-download/#25-%e9%94%99%e8%af%af%e5%a4%84%e7%90%86&#34;&gt;2.5. 错误处理&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/python-download/#3-%e6%80%bb%e4%bd%93%e6%b5%81%e7%a8%8b&#34;&gt;3. 总体流程：&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/python-download/#4-%e4%bc%98%e5%8c%96%e7%82%b9&#34;&gt;4. 优化点：&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;程序的主要功能是通过多线程的方式下载一个文件，并将下载进度条显示给用户。下面是对其各部分功能的详细总结：&lt;/p&gt;
&lt;h2 id=&#34;1-主要功能&#34;&gt;1. 主要功能：&lt;/h2&gt;
&lt;h3 id=&#34;11-并行分段下载文件&#34;&gt;1.1. 并行分段下载文件&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;使用 requests 库的 Range 请求头，通过多个线程并行下载不同的文件片段，将这些片段组合起来完成整个文件的下载。&lt;/li&gt;
&lt;li&gt;下载过程中使用 ThreadPoolExecutor 来管理线程，并行化下载以提高下载效率。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;12-显示下载进度&#34;&gt;1.2. 显示下载进度&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;通过 tqdm 库为每个线程显示一个进度条，追踪每个线程下载的文件片段大小，并在主进度条中汇总所有线程的下载进度。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;13-断点续传&#34;&gt;1.3. 断点续传&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;使用 .fetch 文件来追踪下载进度，如果文件已经部分下载，再次运行程序时可以从断点续传，而不必重新下载整个文件。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;2-关键模块与功能解释&#34;&gt;2. 关键模块与功能解释：&lt;/h2&gt;
&lt;h3 id=&#34;21-文件的分段请求-fetch_one&#34;&gt;2.1. 文件的分段请求 (fetch_one)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;根据文件的总大小，将下载任务分成多个段，每个段交给不同的线程处理。&lt;/li&gt;
&lt;li&gt;使用 Range 头部请求文件的特定字节范围，确保每个线程下载对应的文件片段。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;22-多线程下载-insert_data&#34;&gt;2.2. 多线程下载 (insert_data)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;使用 ThreadPoolExecutor 来创建多个线程，进行并发的文件片段下载。&lt;/li&gt;
&lt;li&gt;每个线程负责从指定的开始位置下载到结束位置，并将下载的数据写入文件的相应部分。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;23-显示下载进度-tqdm&#34;&gt;2.3. 显示下载进度 (tqdm)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;对每个线程使用单独的 tqdm 进度条来显示下载进度，并汇总显示整个文件的总进度。
下载过程中通过 pbar_thread.update() 来更新进度条的显示，便于用户了解下载的实时进度。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;24-断点续传&#34;&gt;2.4. 断点续传&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;当下载中断时，通过保存文件进度在 .fetch 文件中，可以在下次运行时从中断的位置继续下载。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;25-错误处理&#34;&gt;2.5. 错误处理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;通过 try-except 捕获异常，并使用 loguru 记录错误信息。当下载失败时，程序不会崩溃，可以记录错误以便后续分析和处理。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;3-总体流程&#34;&gt;3. 总体流程：&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;获取文件大小：首先通过 get_file_length() 获取文件的总大小。&lt;/li&gt;
&lt;li&gt;创建文件占位：如果目标文件还未存在，则预先创建一个与下载文件大小一致的文件（填充空字节），以便可以使用 seek 精确写入下载的文件片段。&lt;/li&gt;
&lt;li&gt;分段下载：使用 ThreadPoolExecutor 将下载任务分配给多个线程，线程根据 Range 头部请求文件片段，写入相应部分。&lt;/li&gt;
&lt;li&gt;显示进度：通过 tqdm 显示下载的进度。&lt;/li&gt;
&lt;li&gt;下载完成：下载结束后，删除 .fetch 文件并提示下载成功。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;4-优化点&#34;&gt;4. 优化点：&lt;/h2&gt;
&lt;p&gt;错误处理：可以进一步优化每个线程的错误处理，避免某个线程的失败导致整体下载失败。
断点续传功能扩展：目前 .fetch 文件的实现较为简单，后续可以将每个片段的下载状态保存到 .fetch 文件中，保证下载中断时能更智能地恢复下载。
&lt;div class=&#34;details admonition tip&#34;&gt;
        &lt;div class=&#34;details-summary admonition-title&#34;&gt;
            &lt;i class=&#34;icon fas fa-lightbulb fa-fw&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;This is a tip&lt;i class=&#34;details-icon fas fa-angle-right fa-fw&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;
        &lt;/div&gt;
        &lt;div class=&#34;details-content&#34;&gt;
            &lt;div class=&#34;admonition-content&#34;&gt;一个 &lt;strong&gt;技巧&lt;/strong&gt; 横幅&lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;
或者
&lt;div class=&#34;details admonition tip&#34;&gt;
        &lt;div class=&#34;details-summary admonition-title&#34;&gt;
            &lt;i class=&#34;icon fas fa-lightbulb fa-fw&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;This is a tip&lt;i class=&#34;details-icon fas fa-angle-right fa-fw&#34; aria-hidden=&#34;true&#34;&gt;&lt;/i&gt;
        &lt;/div&gt;
        &lt;div class=&#34;details-content&#34;&gt;
            &lt;div class=&#34;admonition-content&#34;&gt;一个 &lt;strong&gt;技巧&lt;/strong&gt; 横幅&lt;/div&gt;
        &lt;/div&gt;
    &lt;/div&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;import&lt;/span&gt; requests
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 2&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;from&lt;/span&gt; concurrent.futures &lt;span style=&#34;color:#ff79c6&#34;&gt;import&lt;/span&gt; ThreadPoolExecutor
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 3&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;import&lt;/span&gt; os
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 4&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;from&lt;/span&gt; pathlib &lt;span style=&#34;color:#ff79c6&#34;&gt;import&lt;/span&gt; Path
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 5&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;from&lt;/span&gt; loguru &lt;span style=&#34;color:#ff79c6&#34;&gt;import&lt;/span&gt; logger
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 6&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;import&lt;/span&gt; traceback
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 7&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;from&lt;/span&gt; tqdm &lt;span style=&#34;color:#ff79c6&#34;&gt;import&lt;/span&gt; tqdm
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 8&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;from&lt;/span&gt; threading &lt;span style=&#34;color:#ff79c6&#34;&gt;import&lt;/span&gt; Lock
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt; 9&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;from&lt;/span&gt; functools &lt;span style=&#34;color:#ff79c6&#34;&gt;import&lt;/span&gt; partial
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;10&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;11&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;# url = &amp;#34;https://scontent.xx.fbcdn.net/m1/v/t6/An_YmP5OIPXun-vu3hkckAZZ2s4lPYoVkiyvCcWiVY21mu1Ng5_1HeCa2CWiSTsskj8HQ8bN013HxNpYDdSC_7jWQq_svcg.tar?ccb=10-5&amp;amp;oh=00_AfBn8XrMhiHu6w1KuS1X8rkuLzzZJnRs8B9jFMvVRfQnfg&amp;amp;oe=64659C28&amp;amp;_nc_sid=fb0754&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;12&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;13&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;# tar_path = Path(&amp;#34;/Users/chennan/Desktop/sa_000020.tar&amp;#34;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;14&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;# fetching_path = Path(f&amp;#34;{tar_path.as_posix()}.fetch&amp;#34;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;15&lt;/span&gt;&lt;span&gt;lock &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; Lock()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;16&lt;/span&gt;&lt;span&gt;downloaded &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#bd93f9&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;17&lt;/span&gt;&lt;span&gt;url &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;https://images.pexels.com/photos/15983035/pexels-photo-15983035.jpeg&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;18&lt;/span&gt;&lt;span&gt;tar_path &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; Path(&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;/Users/chennan/Desktop/pexels-photo-15983035.jpeg&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;19&lt;/span&gt;&lt;span&gt;fetching_path &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; Path(&lt;span style=&#34;color:#f1fa8c&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;{&lt;/span&gt;tar_path&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;as_posix()&lt;span style=&#34;color:#f1fa8c&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;.fetch&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;20&lt;/span&gt;&lt;span&gt;pbar_threads &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;21&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;22&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#50fa7b&#34;&gt;insert_data&lt;/span&gt;(info):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;23&lt;/span&gt;&lt;span&gt;    headers, start, end &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; info
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;24&lt;/span&gt;&lt;span&gt;    pbar_thread &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; tqdm(total&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;end &lt;span style=&#34;color:#ff79c6&#34;&gt;-&lt;/span&gt; start)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;25&lt;/span&gt;&lt;span&gt;    pbar_threads&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;append(pbar_thread)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;26&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#ff79c6&#34;&gt;with&lt;/span&gt; requests&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;get(url, stream&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;True&lt;/span&gt;, headers&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;headers) &lt;span style=&#34;color:#ff79c6&#34;&gt;as&lt;/span&gt; response:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;27&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#ff79c6&#34;&gt;with&lt;/span&gt; tar_path&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;open(&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#39;rb+&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#ff79c6&#34;&gt;as&lt;/span&gt; f:  &lt;span style=&#34;color:#6272a4&#34;&gt;# path 文件保存路径&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;28&lt;/span&gt;&lt;span&gt;            &lt;span style=&#34;color:#6272a4&#34;&gt;# 从文件的start位置开始写入&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;29&lt;/span&gt;&lt;span&gt;            f&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;seek(start)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;30&lt;/span&gt;&lt;span&gt;            &lt;span style=&#34;color:#ff79c6&#34;&gt;for&lt;/span&gt; chunk &lt;span style=&#34;color:#ff79c6&#34;&gt;in&lt;/span&gt; response&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;iter_content(chunk_size&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bd93f9&#34;&gt;1024&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;31&lt;/span&gt;&lt;span&gt;                &lt;span style=&#34;color:#ff79c6&#34;&gt;if&lt;/span&gt; chunk:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;32&lt;/span&gt;&lt;span&gt;                    f&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;write(chunk)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;33&lt;/span&gt;&lt;span&gt;                &lt;span style=&#34;color:#6272a4&#34;&gt;# pbar.update(len(chunk))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;34&lt;/span&gt;&lt;span&gt;                pbar_thread&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;update(&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;len&lt;/span&gt;(chunk))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;35&lt;/span&gt;&lt;span&gt;            pbar_thread&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;close()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;36&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;37&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;38&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#50fa7b&#34;&gt;get_file_length&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;39&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#6272a4&#34;&gt;# 改为requests.head可能更高效，待测试。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;40&lt;/span&gt;&lt;span&gt;    req &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; requests&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;get(url, stream&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;41&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#ff79c6&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;int&lt;/span&gt;(req&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;headers[&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#39;content-Length&amp;#39;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;42&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;43&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;44&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#50fa7b&#34;&gt;fetch_one&lt;/span&gt;(content_length):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;45&lt;/span&gt;&lt;span&gt;    all_thread &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#bd93f9&#34;&gt;64&lt;/span&gt;  &lt;span style=&#34;color:#6272a4&#34;&gt;# 线程数量&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;46&lt;/span&gt;&lt;span&gt;    part &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; content_length &lt;span style=&#34;color:#ff79c6&#34;&gt;//&lt;/span&gt; all_thread  &lt;span style=&#34;color:#6272a4&#34;&gt;# 每个线程请求的大小&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;47&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#ff79c6&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#ff79c6&#34;&gt;in&lt;/span&gt; &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;range&lt;/span&gt;(all_thread):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;48&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#6272a4&#34;&gt;# 每个线程开始， 结束爬取的位置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;49&lt;/span&gt;&lt;span&gt;        start &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; part &lt;span style=&#34;color:#ff79c6&#34;&gt;*&lt;/span&gt; i
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;50&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#ff79c6&#34;&gt;if&lt;/span&gt; i &lt;span style=&#34;color:#ff79c6&#34;&gt;==&lt;/span&gt; all_thread &lt;span style=&#34;color:#ff79c6&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#bd93f9&#34;&gt;1&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;51&lt;/span&gt;&lt;span&gt;            end &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; content_length
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;52&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#ff79c6&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;53&lt;/span&gt;&lt;span&gt;            end &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; start &lt;span style=&#34;color:#ff79c6&#34;&gt;+&lt;/span&gt; part
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;54&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#ff79c6&#34;&gt;if&lt;/span&gt; i &lt;span style=&#34;color:#ff79c6&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#bd93f9&#34;&gt;0&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;55&lt;/span&gt;&lt;span&gt;            start &lt;span style=&#34;color:#ff79c6&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#bd93f9&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;56&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#6272a4&#34;&gt;# 设置从网站请求开始和结束的位置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;57&lt;/span&gt;&lt;span&gt;        headers &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;58&lt;/span&gt;&lt;span&gt;            &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#39;Range&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#f1fa8c&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#39;bytes=&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;{&lt;/span&gt;start&lt;span style=&#34;color:#f1fa8c&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;{&lt;/span&gt;end&lt;span style=&#34;color:#f1fa8c&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;59&lt;/span&gt;&lt;span&gt;        }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;60&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#ff79c6&#34;&gt;yield&lt;/span&gt; headers, start, end
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;61&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;62&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;63&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;__name__&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;64&lt;/span&gt;&lt;span&gt;    content_length &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; get_file_length()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;65&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#ff79c6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;not&lt;/span&gt; tar_path&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;exists():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;66&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#ff79c6&#34;&gt;with&lt;/span&gt; tar_path&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;open(&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#39;wb&amp;#39;&lt;/span&gt;) &lt;span style=&#34;color:#ff79c6&#34;&gt;as&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;67&lt;/span&gt;&lt;span&gt;            f&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;seek(content_length &lt;span style=&#34;color:#ff79c6&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#bd93f9&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;68&lt;/span&gt;&lt;span&gt;            f&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;write(&lt;span style=&#34;color:#f1fa8c&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;\0&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;69&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#ff79c6&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;not&lt;/span&gt; fetching_path&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;exists():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;70&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#ff79c6&#34;&gt;with&lt;/span&gt; fetching_path&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;open(&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;wb&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#ff79c6&#34;&gt;as&lt;/span&gt; fs:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;71&lt;/span&gt;&lt;span&gt;            fs&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;write(&lt;span style=&#34;color:#f1fa8c&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;\0&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;72&lt;/span&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;73&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#ff79c6&#34;&gt;try&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;74&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#ff79c6&#34;&gt;with&lt;/span&gt; ThreadPoolExecutor(max_workers&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#bd93f9&#34;&gt;16&lt;/span&gt;) &lt;span style=&#34;color:#ff79c6&#34;&gt;as&lt;/span&gt; pool:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;75&lt;/span&gt;&lt;span&gt;            pool&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;map(insert_data, fetch_one(content_length))
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;76&lt;/span&gt;&lt;span&gt;        &lt;span style=&#34;color:#ff79c6&#34;&gt;with&lt;/span&gt; tqdm(total&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;content_length) &lt;span style=&#34;color:#ff79c6&#34;&gt;as&lt;/span&gt; pbar:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;77&lt;/span&gt;&lt;span&gt;            progress &lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;sum&lt;/span&gt;(pbar_thread&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;n &lt;span style=&#34;color:#ff79c6&#34;&gt;for&lt;/span&gt; pbar_thread &lt;span style=&#34;color:#ff79c6&#34;&gt;in&lt;/span&gt; pbar_threads)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;78&lt;/span&gt;&lt;span&gt;            pbar&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;update(progress)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;79&lt;/span&gt;&lt;span&gt;        fetching_path&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;unlink()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;80&lt;/span&gt;&lt;span&gt;        logger&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;info(&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;下载完成&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;81&lt;/span&gt;&lt;span&gt;    &lt;span style=&#34;color:#ff79c6&#34;&gt;except&lt;/span&gt; Exception:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;82&lt;/span&gt;&lt;span&gt;        logger&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;error(&lt;span style=&#34;color:#f1fa8c&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;{&lt;/span&gt;traceback&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;format_exc()&lt;span style=&#34;color:#f1fa8c&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      
    </item>
    
    <item>
      <title>下载 YouTube 视频和音频</title>
      <link>https://www.ttz.pw/post/yt-dlp/</link>
      <pubDate>Thu, 26 Sep 2024 14:18:09 +0800</pubDate>
      
      <guid>https://www.ttz.pw/post/yt-dlp/</guid>
      
        <description>&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/yt-dlp/#1-%e5%ae%89%e8%a3%85&#34;&gt;1. 安装&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/yt-dlp/#2-%e4%bd%bf%e7%94%a8&#34;&gt;2. 使用&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ttz.pw/post/yt-dlp/#3-%e4%b8%8b%e8%bd%bd%e9%9f%b3%e9%a2%91&#34;&gt;3. 下载音频&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;1-安装&#34;&gt;1. 安装&lt;/h2&gt;
&lt;p&gt;我的使用环境是 macOS，使用 pip 安装。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;pip3 install yt&lt;span style=&#34;color:#ff79c6&#34;&gt;-&lt;/span&gt;dlp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;之后查看版本&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;yt&lt;span style=&#34;color:#ff79c6&#34;&gt;-&lt;/span&gt;dlp &lt;span style=&#34;color:#ff79c6&#34;&gt;--&lt;/span&gt;version
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#bd93f9&#34;&gt;2024.08.06&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在我开启系统代理的情况下，我可以直接使用它，它会自动走代理。&lt;/p&gt;
&lt;p&gt;如果把代理关掉，再来使用它，自然连接不上。会出现这样的警告。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;WARNING: [youtube] Unable to download webpage: (&lt;span style=&#34;color:#ff79c6&#34;&gt;&amp;lt;&lt;/span&gt;urllib3&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;connection&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;HTTPSConnection &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;object&lt;/span&gt; at &lt;span style=&#34;color:#bd93f9&#34;&gt;0x10788cb10&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;&amp;gt;&lt;/span&gt;, &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#39;Connection to www.youtube.com timed out. (connect timeout=20.0)&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;2-使用&#34;&gt;2. 使用&lt;/h2&gt;
&lt;p&gt;获取视频的结构（就是看它有哪些分辨率，哪些音频），使用大写的 F&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;yt&lt;span style=&#34;color:#ff79c6&#34;&gt;-&lt;/span&gt;dlp &lt;span style=&#34;color:#ff79c6&#34;&gt;-&lt;/span&gt;F https:&lt;span style=&#34;color:#ff79c6&#34;&gt;//&lt;/span&gt;www&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;youtube&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;com&lt;span style=&#34;color:#ff79c6&#34;&gt;/&lt;/span&gt;xxxxxxxxxxxxxxxxx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;不加任何参数（也就是上面的命令去掉 -F），会自动下载质量最高的视频和音频，然后将它们合并起来。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;yt&lt;span style=&#34;color:#ff79c6&#34;&gt;-&lt;/span&gt;dlp https:&lt;span style=&#34;color:#ff79c6&#34;&gt;//&lt;/span&gt;www&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;youtube&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;com&lt;span style=&#34;color:#ff79c6&#34;&gt;/&lt;/span&gt;xxxxxxxxxxxxxxxxx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;当然我们也可以自由选择，例如我们不需要那么高分辨率的视频，我只要 720P 就够了之类的。那么可以序号相加的方式，例如&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;yt&lt;span style=&#34;color:#ff79c6&#34;&gt;-&lt;/span&gt;dlp &lt;span style=&#34;color:#ff79c6&#34;&gt;-&lt;/span&gt;f &lt;span style=&#34;color:#bd93f9&#34;&gt;251&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#bd93f9&#34;&gt;614&lt;/span&gt; https:&lt;span style=&#34;color:#ff79c6&#34;&gt;//&lt;/span&gt;www&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;youtube&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;com&lt;span style=&#34;color:#ff79c6&#34;&gt;/&lt;/span&gt;xxxxxxxxxxxxxxxxx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;3-下载音频&#34;&gt;3. 下载音频&lt;/h2&gt;
&lt;p&gt;我个人有这样的需要，想要下载视频的音频部分。所以我了解到有这样的参数，-x 参数，可以用来提取音频。&lt;/p&gt;
&lt;p&gt;不过我发现这样是把完整的视频下载之后，再从视频中把音频提取出来。然后再删除掉视频……&lt;/p&gt;
&lt;p&gt;感觉不环保，我明明不需要视频部分，它下载之后只保留音频，再删掉视频……&lt;/p&gt;
&lt;p&gt;当然也有只下载音频的方法，先用 -F 查询信息，然后选择想要的音频 id 就行，例如&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;yt&lt;span style=&#34;color:#ff79c6&#34;&gt;-&lt;/span&gt;dlp &lt;span style=&#34;color:#ff79c6&#34;&gt;-&lt;/span&gt;f &lt;span style=&#34;color:#bd93f9&#34;&gt;251&lt;/span&gt; https:&lt;span style=&#34;color:#ff79c6&#34;&gt;//&lt;/span&gt;www&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;youtube&lt;span style=&#34;color:#ff79c6&#34;&gt;.&lt;/span&gt;com&lt;span style=&#34;color:#ff79c6&#34;&gt;/&lt;/span&gt;xxxxxxxxxxxxxxxxx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但是这样也比较麻烦，得先查询嘛。于是继续了解，发现可以使用 -f ba ，也就是 best audio 的首字母缩写，只下载质量最好的音频。&lt;/p&gt;
&lt;p&gt;不过这样有时候下载的音频是 webm 格式的。&lt;/p&gt;
&lt;p&gt;我观察了一个视频&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#bd93f9&#34;&gt;233&lt;/span&gt; mp4   audio only        │                  m3u8  │ audio only          unknown             Default
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#bd93f9&#34;&gt;234&lt;/span&gt; mp4   audio only        │                  m3u8  │ audio only          unknown             Default
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#bd93f9&#34;&gt;599&lt;/span&gt; m4a   audio only      &lt;span style=&#34;color:#bd93f9&#34;&gt;2&lt;/span&gt; │    &lt;span style=&#34;color:#bd93f9&#34;&gt;2.50&lt;/span&gt;MiB   &lt;span style=&#34;color:#bd93f9&#34;&gt;31&lt;/span&gt;k https │ audio only          mp4a&lt;span style=&#34;color:#bd93f9&#34;&gt;.40.5&lt;/span&gt;   &lt;span style=&#34;color:#bd93f9&#34;&gt;31&lt;/span&gt;k &lt;span style=&#34;color:#bd93f9&#34;&gt;22&lt;/span&gt;k ultralow, m4a_dash
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#bd93f9&#34;&gt;600&lt;/span&gt; webm  audio only      &lt;span style=&#34;color:#bd93f9&#34;&gt;2&lt;/span&gt; │    &lt;span style=&#34;color:#bd93f9&#34;&gt;2.70&lt;/span&gt;MiB   &lt;span style=&#34;color:#bd93f9&#34;&gt;33&lt;/span&gt;k https │ audio only          opus        &lt;span style=&#34;color:#bd93f9&#34;&gt;33&lt;/span&gt;k &lt;span style=&#34;color:#bd93f9&#34;&gt;48&lt;/span&gt;k ultralow, webm_dash
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#bd93f9&#34;&gt;139&lt;/span&gt; m4a   audio only      &lt;span style=&#34;color:#bd93f9&#34;&gt;2&lt;/span&gt; │    &lt;span style=&#34;color:#bd93f9&#34;&gt;3.96&lt;/span&gt;MiB   &lt;span style=&#34;color:#bd93f9&#34;&gt;49&lt;/span&gt;k https │ audio only          mp4a&lt;span style=&#34;color:#bd93f9&#34;&gt;.40.5&lt;/span&gt;   &lt;span style=&#34;color:#bd93f9&#34;&gt;49&lt;/span&gt;k &lt;span style=&#34;color:#bd93f9&#34;&gt;22&lt;/span&gt;k low, m4a_dash
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#bd93f9&#34;&gt;249&lt;/span&gt; webm  audio only      &lt;span style=&#34;color:#bd93f9&#34;&gt;2&lt;/span&gt; │    &lt;span style=&#34;color:#bd93f9&#34;&gt;3.99&lt;/span&gt;MiB   &lt;span style=&#34;color:#bd93f9&#34;&gt;49&lt;/span&gt;k https │ audio only          opus        &lt;span style=&#34;color:#bd93f9&#34;&gt;49&lt;/span&gt;k &lt;span style=&#34;color:#bd93f9&#34;&gt;48&lt;/span&gt;k low, webm_dash
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#bd93f9&#34;&gt;250&lt;/span&gt; webm  audio only      &lt;span style=&#34;color:#bd93f9&#34;&gt;2&lt;/span&gt; │    &lt;span style=&#34;color:#bd93f9&#34;&gt;5.31&lt;/span&gt;MiB   &lt;span style=&#34;color:#bd93f9&#34;&gt;65&lt;/span&gt;k https │ audio only          opus        &lt;span style=&#34;color:#bd93f9&#34;&gt;65&lt;/span&gt;k &lt;span style=&#34;color:#bd93f9&#34;&gt;48&lt;/span&gt;k low, webm_dash
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;8&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#bd93f9&#34;&gt;140&lt;/span&gt; m4a   audio only      &lt;span style=&#34;color:#bd93f9&#34;&gt;2&lt;/span&gt; │   &lt;span style=&#34;color:#bd93f9&#34;&gt;10.51&lt;/span&gt;MiB  &lt;span style=&#34;color:#bd93f9&#34;&gt;129&lt;/span&gt;k https │ audio only          mp4a&lt;span style=&#34;color:#bd93f9&#34;&gt;.40.2&lt;/span&gt;  &lt;span style=&#34;color:#bd93f9&#34;&gt;129&lt;/span&gt;k &lt;span style=&#34;color:#bd93f9&#34;&gt;44&lt;/span&gt;k medium, m4a_dash
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;9&lt;/span&gt;&lt;span&gt;&lt;span style=&#34;color:#bd93f9&#34;&gt;251&lt;/span&gt; webm  audio only      &lt;span style=&#34;color:#bd93f9&#34;&gt;2&lt;/span&gt; │    &lt;span style=&#34;color:#bd93f9&#34;&gt;9.83&lt;/span&gt;MiB  &lt;span style=&#34;color:#bd93f9&#34;&gt;121&lt;/span&gt;k https │ audio only          opus       &lt;span style=&#34;color:#bd93f9&#34;&gt;121&lt;/span&gt;k &lt;span style=&#34;color:#bd93f9&#34;&gt;48&lt;/span&gt;k medium, webm_dash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;只看它音频部分，其实质量最高的应该是 140 m4a audio only 2 │ 10.51MiB 129k 这个才对，不管是文件体积还是码率，它都是最大的。&lt;/p&gt;
&lt;p&gt;但实际上使用 ba 参数，下载的是最高一项 webm 这个。难道是因为它是 48K 而上面的 m4a 是 44k 的？&lt;/p&gt;
&lt;p&gt;那么我添加一个限制，排除掉 webm&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;yt&lt;span style=&#34;color:#ff79c6&#34;&gt;-&lt;/span&gt;dlp &lt;span style=&#34;color:#ff79c6&#34;&gt;-&lt;/span&gt;f &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#39;bestaudio/best&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;--&lt;/span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;format&lt;/span&gt; &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#39;bestaudio[ext!=webm]&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样后面再加上视频链接即可。&lt;/p&gt;
&lt;p&gt;然后我再写一个 alias，之后我只需要 「ya 视频链接」，就能下载一个视频的音频了。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&lt;/span&gt;&lt;span&gt;alias ya&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;yt-dlp -f &amp;#39;bestaudio/best&amp;#39; --format &amp;#39;bestaudio[ext!=webm]&amp;#39;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      
    </item>
    
  </channel>
</rss>
