mirror of
https://github.com/darkzoul5/YoutubePlaylistSync.git
synced 2026-07-03 04:23:59 +03:00
Compare commits
5 Commits
48bcf2c9df
...
3b1cdda19d
| Author | SHA1 | Date | |
|---|---|---|---|
| 3b1cdda19d | |||
| 2dc119a2f1 | |||
| 7d0c7aa1d5 | |||
| 15f2df0cbf | |||
| 22756f35db |
@@ -204,7 +204,30 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
mkdir -p package/bin ffmpeg_tmp
|
mkdir -p package/bin ffmpeg_tmp
|
||||||
curl -L "https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz" -o ffmpeg.tar.xz
|
|
||||||
|
primary_url="https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz"
|
||||||
|
curl_common=(
|
||||||
|
--fail
|
||||||
|
--location
|
||||||
|
--retry 5
|
||||||
|
--retry-all-errors
|
||||||
|
--retry-delay 2
|
||||||
|
--user-agent "Mozilla/5.0 (GitHub Actions; ytpl-sync release workflow)"
|
||||||
|
)
|
||||||
|
|
||||||
|
curl "${curl_common[@]}" "$primary_url" -o ffmpeg.tar.xz
|
||||||
|
curl "${curl_common[@]}" "${primary_url}.md5" -o ffmpeg.tar.xz.md5
|
||||||
|
|
||||||
|
expected_md5="$(awk '{print $1}' ffmpeg.tar.xz.md5)"
|
||||||
|
printf '%s *ffmpeg.tar.xz\n' "$expected_md5" | md5sum -c -
|
||||||
|
|
||||||
|
if ! tar -tf ffmpeg.tar.xz >/dev/null 2>&1; then
|
||||||
|
echo "Downloaded FFmpeg payload is not a valid tar archive" >&2
|
||||||
|
ls -l ffmpeg.tar.xz >&2 || true
|
||||||
|
head -c 256 ffmpeg.tar.xz >&2 || true
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
tar -xf ffmpeg.tar.xz -C ffmpeg_tmp --strip-components=1
|
tar -xf ffmpeg.tar.xz -C ffmpeg_tmp --strip-components=1
|
||||||
mv ffmpeg_tmp/ffmpeg package/bin/ffmpeg
|
mv ffmpeg_tmp/ffmpeg package/bin/ffmpeg
|
||||||
chmod +x package/bin/ffmpeg
|
chmod +x package/bin/ffmpeg
|
||||||
|
|||||||
@@ -2,7 +2,17 @@ name: Lint Python code
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
paths-ignore:
|
||||||
|
- "assets/**"
|
||||||
|
- "README.md"
|
||||||
pull_request:
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
paths-ignore:
|
||||||
|
- "assets/**"
|
||||||
|
- "README.md"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
lint:
|
lint:
|
||||||
@@ -15,4 +25,4 @@ jobs:
|
|||||||
run: pip install ruff
|
run: pip install ruff
|
||||||
|
|
||||||
- name: Run linter
|
- name: Run linter
|
||||||
run: ruff check .
|
run: ruff check .
|
||||||
|
|||||||
@@ -5,21 +5,15 @@ on:
|
|||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
paths:
|
paths-ignore:
|
||||||
- "src/**"
|
- "assets/**"
|
||||||
- "tests/**"
|
- "README.md"
|
||||||
- "pyproject.toml"
|
|
||||||
- "pytest.ini"
|
|
||||||
- "ytpl-sync-entry.py"
|
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
paths:
|
paths-ignore:
|
||||||
- "src/**"
|
- "assets/**"
|
||||||
- "tests/**"
|
- "README.md"
|
||||||
- "pyproject.toml"
|
|
||||||
- "pytest.ini"
|
|
||||||
- "ytpl-sync-entry.py"
|
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
|
|||||||
@@ -78,6 +78,9 @@ jobs:
|
|||||||
if: steps.detect.outputs.needs_update == 'true'
|
if: steps.detect.outputs.needs_update == 'true'
|
||||||
uses: peter-evans/create-pull-request@v8
|
uses: peter-evans/create-pull-request@v8
|
||||||
with:
|
with:
|
||||||
|
# Use a non-GITHUB_TOKEN credential so the resulting PR triggers CI workflows.
|
||||||
|
# Configure secrets.PR_WORKFLOW_TOKEN with contents:write and pull-requests:write.
|
||||||
|
token: ${{ secrets.PR_WORKFLOW_TOKEN || github.token }}
|
||||||
branch: chore/refresh-yt-dlp
|
branch: chore/refresh-yt-dlp
|
||||||
commit-message: "chore: bump yt-dlp to ${{ steps.detect.outputs.latest_yt_dlp }}"
|
commit-message: "chore: bump yt-dlp to ${{ steps.detect.outputs.latest_yt_dlp }}"
|
||||||
title: "chore: bump yt-dlp to ${{ steps.detect.outputs.latest_yt_dlp }}"
|
title: "chore: bump yt-dlp to ${{ steps.detect.outputs.latest_yt_dlp }}"
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
- Write useful MP3 metadata for downloaded playlist items without affecting video-only downloads.
|
- Write useful MP3 metadata for downloaded playlist items without affecting video-only downloads.
|
||||||
- Keep the implementation reliable when optional fields are missing.
|
- Keep the implementation reliable when optional fields are missing.
|
||||||
- Preserve successful downloads even when metadata embedding partially fails.
|
- Preserve successful downloads even when metadata embedding partially fails.
|
||||||
- Provide a setting to enable or disable MP3 metadata embedding.
|
- Provide a per-playlist setting to enable or disable MP3 metadata embedding.
|
||||||
|
|
||||||
## Required Metadata
|
## Required Metadata
|
||||||
|
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
|
|
||||||
## Configuration Requirement
|
## Configuration Requirement
|
||||||
|
|
||||||
- Add a setting to turn MP3 metadata embedding on or off.
|
- Add a per-playlist setting to turn MP3 metadata embedding on or off.
|
||||||
- Default should be explicitly defined during implementation; recommended default is `enabled` for new configs.
|
- Default should be explicitly defined during implementation; recommended default is `enabled` for new configs.
|
||||||
- The setting should only affect `.mp3` metadata writing and should not change download selection, extraction, or `.mp4` handling.
|
- The setting should only affect `.mp3` metadata writing and should not change download selection, extraction, or `.mp4` handling.
|
||||||
|
|
||||||
@@ -68,7 +68,7 @@
|
|||||||
- Ensure the enriched `PlaylistItem` reaches the download job and post-processing stage.
|
- Ensure the enriched `PlaylistItem` reaches the download job and post-processing stage.
|
||||||
- Keep this propagation in-memory unless restart-safe metadata persistence becomes necessary later.
|
- Keep this propagation in-memory unless restart-safe metadata persistence becomes necessary later.
|
||||||
- Avoid changing unrelated sync behavior for video-only items.
|
- Avoid changing unrelated sync behavior for video-only items.
|
||||||
- Carry the MP3 metadata enabled/disabled setting into the post-processing step.
|
- Carry the per-playlist MP3 metadata enabled/disabled setting into the post-processing step.
|
||||||
|
|
||||||
### 4. Add an MP3 tag writer
|
### 4. Add an MP3 tag writer
|
||||||
|
|
||||||
@@ -109,8 +109,8 @@
|
|||||||
|
|
||||||
### 8. Add configuration surface
|
### 8. Add configuration surface
|
||||||
|
|
||||||
- Add the new setting to the config model and default config output.
|
- Add the new per-playlist setting to the playlist config model and default config output.
|
||||||
- Expose the setting in the GUI/settings surface if MP3 behavior is already user-configurable there.
|
- Expose the setting in the playlist configuration UI, not as a global app setting.
|
||||||
- Keep the naming explicit, for example `write_mp3_metadata` or `embed_mp3_metadata`.
|
- Keep the naming explicit, for example `write_mp3_metadata` or `embed_mp3_metadata`.
|
||||||
|
|
||||||
## Error Handling Rules
|
## Error Handling Rules
|
||||||
@@ -137,7 +137,7 @@
|
|||||||
## Documentation Updates
|
## Documentation Updates
|
||||||
|
|
||||||
- Document that MP3 tags are written only for `.mp3` outputs.
|
- Document that MP3 tags are written only for `.mp3` outputs.
|
||||||
- Document the new setting that enables or disables MP3 metadata embedding.
|
- Document the new per-playlist setting that enables or disables MP3 metadata embedding.
|
||||||
- Document the field fallback rules, especially artist and album behavior.
|
- Document the field fallback rules, especially artist and album behavior.
|
||||||
- Document that album art comes from the video thumbnail, not playlist artwork.
|
- Document that album art comes from the video thumbnail, not playlist artwork.
|
||||||
- Document that some YouTube items will not expose album or genre information.
|
- Document that some YouTube items will not expose album or genre information.
|
||||||
|
|||||||
+1
-1
@@ -12,7 +12,7 @@ license = { file = "LICENSE" }
|
|||||||
keywords = ["youtube", "yt-dlp", "playlist", "sync"]
|
keywords = ["youtube", "yt-dlp", "playlist", "sync"]
|
||||||
requires-python = ">=3.10"
|
requires-python = ">=3.10"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"yt-dlp>=2026.3.17",
|
"yt-dlp>=2026.6.9",
|
||||||
"PySide6_Essentials>=6.11.1",
|
"PySide6_Essentials>=6.11.1",
|
||||||
]
|
]
|
||||||
[project.optional-dependencies]
|
[project.optional-dependencies]
|
||||||
|
|||||||
Reference in New Issue
Block a user