科技 · 實用指南
將 Shotcut 已存播放清單匯出為 CSV,保留重複子片段
保留重複片段、已存名稱與原始入出點;離線報告不能當成時間軸資源或刪除清單。

唯一媒體檔名清單可能丟掉需要的播放清單資訊:兩個不同裁切片段可以來自同一檔案。報告應保留每個項目、位置與已存名稱,不合成一個資源。
Shotcut 已能從播放清單分類匯出影片,目前批次命名也能使用來源名稱。本指南補充受限離線 CSV:只讀自己已存主清單的受支援 MLT 副本,不修改專案或開啟媒體;不匯出影片,也不判斷可刪除檔案。
儲存專案,區分清單
儲存目前專案、關閉,另留名為 project.mlt 的 MLT 副本作報告。方法要求自己的 UTF-8 純 XML,恰好一個頂層 main_bin 清單或舊名 main bin,項目直接引用頂層 producer 或 chain。命名空間、巢狀或複合項目、空白片段及帶宣告的 XML 均不支援,建立輸出前停止。
已存主清單包含全部項目。不從執行中的介面讀取所選分類、搜尋篩選或顯示順序。目前原始碼以 shotcut:bins 儲存分類文字,以 shotcut:caption 儲存友善顯示文字;缺失屬性寫空儲存格。不重建自動檔名標籤、智慧分類歸屬或介面備用顯示名稱。
需要影片檔案時,用原生 Current Playlist Bin 或 Each Playlist Bin Item 匯出。只需唯一資源清單時,現有 MLT Analyzer 已可下載。這些輸出與本報告不同:本方法保留項目順序和重複項,不修復搬移專案或修改路徑。
執行受限 CSV 轉換
在 Linux Bash 終端機使用 Python 3,進入 project.mlt 副本目錄。命令按一行複製,保留直引號與反斜線。換新輸出名;已有 playlist.csv 會被拒絕。這條準確命令在 Linux Bash 執行過,未在 Windows 或 macOS 測試。
XML 解析器將主清單引用對應到 producer 或 chain,只讀其直接指定屬性。濾鏡自身資源不會當作片段資源。頂層 ID 重複、引用缺失、指定屬性重複和不支援的項目結構均在建立 CSV 前停止。
python3 -c 'exec('"'"'import csv, sys, xml.etree.ElementTree as E\nfrom pathlib import Path\nsrc, dst = map(Path, sys.argv[1:])\nraw = src.read_bytes()\ntext = raw.decode("utf-8-sig")\nif "<!DOCTYPE" in text.upper() or "<!ENTITY" in text.upper():\n raise ValueError("Own plain XML only; declarations unsupported")\nroot = E.fromstring(text)\nif root.tag != "mlt":\n raise ValueError("Expected unnamespaced mlt root")\nbins = [x for x in root if x.tag == "playlist" and x.get("id") in ("main_bin", "main bin")]\nif len(bins) != 1:\n raise ValueError("Need exactly one saved main playlist")\nobjects = {}\nfor x in root:\n if x.get("id"):\n if x.get("id") in objects:\n raise ValueError("Duplicate top-level ID")\n objects[x.get("id")] = x\nkeys = ["shotcut:caption", "shotcut:bins", "mlt_service", "resource", "shotcut:resource", "warp_resource", "shotcut:comment"]\nrows = []\nfor entry in bins[0]:\n if entry.tag == "property":\n continue\n if entry.tag != "entry" or len(entry):\n raise ValueError("Only direct referenced entries supported")\n pid = entry.get("producer", "")\n obj = objects.get(pid)\n if obj is None or obj.tag not in ("producer", "chain"):\n raise ValueError("Missing or composite producer reference")\n values = {}\n for prop in obj.findall("property"):\n name = prop.get("name")\n if name in keys:\n if name in values or len(prop):\n raise ValueError("Duplicate or nested selected property")\n values[name] = prop.get("value", prop.text or "")\n rows.append([str(len(rows)+1), pid, values.get(keys[0], ""), values.get(keys[1], ""), entry.get("in", ""), entry.get("out", "")] + [values.get(k, "") for k in keys[2:]])\nheader = ["ordinal", "producer_id", "caption", "bin_raw", "in_raw", "out_raw", "service", "resource_raw", "proxy_original_raw", "warp_resource_raw", "comment"]\nwith dst.open("x", encoding="utf-8-sig", newline="") as f:\n w = csv.writer(f)\n w.writerow(header)\n w.writerows(rows)\nwith dst.open(encoding="utf-8-sig", newline="") as f:\n if list(csv.reader(f)) != [header] + rows:\n raise ValueError("Readback mismatch; discard partial CSV")\nprint(str(len(rows)) + " saved playlist entries checked; not a timeline or deletion list")\n'"'"')' "project.mlt" "playlist.csv"
十一欄都按文字理解
欄位為 ordinal、producer_id、caption、bin_raw、in_raw、out_raw、service、resource_raw、proxy_original_raw、warp_resource_raw、comment。ordinal 按儲存項目順序從 1 開始。名稱、分類及備註來自已存屬性,不從檔名推斷。空儲存格只表示本方法沒有記錄該值,不證明片段未使用或損壞。
in_raw 和 out_raw 保留解析後屬性字串與前置零;缺失邊界留空。不計算長度、不推斷隱含邊界或驗證播放範圍。不要將字串當秒數相減:MLT 值取決於表示方式和專案脈絡。XML 跳脫字元經解析解碼,表格保留解析值,不逐位元組複製 XML 寫法。
三個資源欄位分開:resource_raw 對應 resource,proxy_original_raw 對應 shotcut:resource,warp_resource_raw 對應 warp_resource。timewarp 資源可能帶速度前綴,代理屬性也可能不同。不展開或轉絕對路徑、不檢查存在性,也不選定正確原檔。不遞迴遍歷巢狀專案、濾鏡、遮罩、LUT 或影像序列相依。
使用前核對報告
命令回讀 CSV,將表頭及各欄值與解析結果比較,通過才顯示成功。項目數與已存主清單對照,再檢查同源不同裁切的兩項與已知自訂名稱。保留原 MLT 與 CSV 主副本,只在工作副本篩選或加交接備註。署名時另行核實作者及授權,檔名和名稱不提供這些資訊。
LibreOffice Calc 匯入選 UTF-8、逗號與直雙引號文字分隔符號。十一欄全設「文字」,關閉「合併分隔符號」「修剪空格」「計算公式」。對話框被隱藏時開啟「編輯篩選器設定」,避免把時間文字當日期或備註當公式。我們未執行 Calc 介面。
準確命令執行了 21 項模擬案例:六項有效案例含重複順序、Unicode 和 XML 跳脫字元、速度/代理原欄位、舊 ID、缺失邊界、空分類及與時間軸/濾鏡資源分離;十五項無效案例在建立輸出前停止。另六次覆寫有效輸出被拒絕,輸入及原輸出位元組不變。未測試真實 Shotcut 專案、播放、介面或 Windows/macOS 執行。寫入或回讀失敗時,棄用部分 CSV,換新名重試;不得據此刪除媒體。
