Include index and formatted durations in exports

Enhance playlist export output for Text and CSV formats. Text files now include a numeric index, a title fallback ("Video N"), and a human-readable duration ([H:MM:SS] or [MM:SS]) when available before the URL. CSV export adds a "Playlist Index" column and writes a formatted title with index and duration. Duration parsing is protected against non-integer values. M3U and JSON export behavior unchanged.
This commit is contained in:
oop7
2026-05-01 14:23:29 +03:00
parent d2f96baf63
commit abec69fb84
+36 -5
View File
@@ -1373,8 +1373,23 @@ class YTSageApp(QMainWindow, FormatTableMixin, VideoInfoMixin, AnalysisMixin):
try:
with open(file_path, 'w', encoding='utf-8') as f:
if "Text files" in selected_filter:
for entry in self.playlist_entries:
f.write(f"{entry.get('url', '')}\n")
for index, entry in enumerate(self.playlist_entries):
duration = entry.get("duration")
duration_str = ""
if duration:
try:
m, s = divmod(int(duration), 60)
h, m = divmod(m, 60)
if h > 0:
duration_str = f" [{h}:{m:02d}:{s:02d}]"
else:
duration_str = f" [{m:02d}:{s:02d}]"
except (ValueError, TypeError):
pass
title = entry.get('title', f'Video {index + 1}')
# Formatting output to include index and duration
f.write(f"{index + 1}. {title}{duration_str} - {entry.get('url', '')}\n")
elif "M3U" in selected_filter:
f.write("#EXTM3U\n")
for entry in self.playlist_entries:
@@ -1384,9 +1399,25 @@ class YTSageApp(QMainWindow, FormatTableMixin, VideoInfoMixin, AnalysisMixin):
elif "CSV" in selected_filter:
import csv
writer = csv.writer(f, lineterminator='\n')
writer.writerow(['Title', 'URL', 'Duration', 'Uploader'])
for entry in self.playlist_entries:
writer.writerow([entry.get('title', ''), entry.get('url', ''), entry.get('duration', ''), entry.get('uploader', '')])
# Adding Playlist Index to CSV and formatting Title with index and duration
writer.writerow(['Playlist Index', 'Title', 'URL', 'Duration', 'Uploader'])
for index, entry in enumerate(self.playlist_entries):
duration = entry.get("duration")
duration_str = ""
if duration:
try:
m, s = divmod(int(duration), 60)
h, m = divmod(m, 60)
if h > 0:
duration_str = f" [{h}:{m:02d}:{s:02d}]"
else:
duration_str = f" [{m:02d}:{s:02d}]"
except (ValueError, TypeError):
pass
title = entry.get('title', f'Video {index + 1}')
formatted_title = f"{index + 1}. {title}{duration_str}"
writer.writerow([index + 1, formatted_title, entry.get('url', ''), entry.get('duration', ''), entry.get('uploader', '')])
elif "JSON" in selected_filter:
import json
json.dump(self.playlist_entries, f, indent=4, ensure_ascii=False)