Cải tiến Alias YT-DLP thay cho phần mềm download video của Mac
Mấy hôm nay thấy có mấy anh chị trên Youtube share mấy khóa học hay và xịn xò quá nên mình muốn download về để khi có thời gian ngồi ngâm cứu học hành. Tuy nhiên hớn hở mở phần mềm YT Saver của Mac ra thì bị lỗi khi down cả playlist, thỉnh thoảng cái phần mềm lại dở hơi như thế, nếu list ít ít thì mình sẽ chịu khó down tay từng clip chớ nhiều tầm vài chục cái down tay có mà chết.
Thế nên chuyển sang phương án 2 là sử dụng YT-DLP một công cụ dòng lệnh siêu mạnh mà chính cái YT Saver base trên đó, nhưng khi tìm hiểu YT-DLP thì khá là lằng nhằng, một câu lệnh gõ siêu dài và khó nhớ
yt-dlp -f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best" -o "/Users/kiennt/Library/CloudStorage/SynologyDrive-n00bIT/YT_Saver/%(playlist_title)s/%(title)s.%(ext)s" "đường_link_playlist"
để download video tốt nhất thì phải khai báo cần video tốt nhất, audio tốt nhất xong ghép lại với nhau, đưa vào đường dẫn ổ cứng và tự tạo một folder với tên của playlist và từng bài nhạc có title và đuôi theo như khai báo ban đầu
Trông khá là lằng ngoằng, vì thế mình lại phải mày mò để làm ngắn nó lại. Rất may trong các công cụ dòng lệnh của Mac hay Win đều có một cái làm ngắn một câu lệnh lại gọi là alias và mình sẽ dùng nó
Vậy giờ vào .bashrc để chỉnh sửa alias, dùng các công cụ như nano, vim hay cao cấp hơn như noteditor hoặc sublime để chỉnh sửa. Ở đây tôi dùng zsh nên sẽ sửa file .zshrc, bash thì cũng tương tự
alias ydlmp4 = 'yt-dlp -f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best" -o "/Users/kiennt/Library/CloudStorage/SynologyDrive-n00bIT/YT_Saver/%(playlist_title)s/%(title)s.%(ext)s"'
Như vậy là sau này download video tôi chỉ cần gõ ydlmp4 + link là được. Tuy nhiên nó hơi đần ở chỗ là nếu download xong thì không có thông báo gì cả, vì thế tôi cài thêm một công cụ là terminal-notifier để thông báo mỗi khi download xong. Nhưng alias nó truyền tham số khá ngu si, tất cả tham số sẽ được nhét vào cuối của mỗi dòng lệnh, cho dù dấu ấn “$@” thể hiện tham số có đặt ở đâu trong đoạn văn bản đi nữa.
Như vậy không đúng ý của tôi, vì thế tôi phải làm một function để giải quyết việc truyền tham số đúng chỗ
ydlmp4() { if [[ -n "$*" ]]; then yt-dlp -f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best" -o "/Users/kiennt/Library/CloudStorage/SynologyDrive-n00bIT/YT_Saver/%(playlist_title)s/%(title)s.%(ext)s" "$@" && terminal-notifier -title ">>> YT-DLP <<<" -message "Tải xuống hoàn tất" -sound "ytdlp-success.mp3" fi }
Với function này thì sẽ kiểm tra xem có tham số nào được truyền vào không, nếu không thì không thực thi gì cả, nếu có thì thực hiện truyền tham số nhận được vào trong $@, sau khi thực hiện download xong thì sẽ hiện lên thông báo của terminal-notifier với nội dung và tiếng thông báo khi kết thúc công việc. Tới đây là đã xong rồi, tuy nhiên tôi đang thực hiện một số cái nữa để lấy được tên video, tên playlist theo nhu cầu v.v… khi nào làm được sẽ cập nhật tiếp
ydlmp4() { # Bắt đầu định nghĩa hàm ydlmp4 if [[ -n "$*" ]]; then # Kiểm tra xem có tham số nào được truyền vào hàm hay không playlist_title=$(yt-dlp -j "$@" | jq -r '.playlist_title') # Lấy tên playlist từ thông tin video (JSON) if [[ "$playlist_title" == "null" || -z "$playlist_title" ]]; then # Kiểm tra nếu tên playlist là null hoặc rỗng video_title=$(yt-dlp -j "$@" | jq -r '.title') # Lấy tên video từ thông tin video (JSON) message="Đã tải xuống video: ${video_title}" # Tạo thông báo cho video yt-dlp -f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best" \ # Tải video với định dạng mp4 tốt nhất -o "/Users/kiennt/Library/CloudStorage/SynologyDrive-n00bIT/YT_Saver/%(playlist_title)s/%(title)s.%(ext)s" "$@" && \ # Lưu video vào đường dẫn chỉ định terminal-notifier -title ">>> YT-DLP <<<" -message "$message" -sound "ytdlp-success.mp3" # Hiển thị thông báo khi tải xong else # Trường hợp có tên playlist message="Đã tải xuống playlist: ${playlist_title}" # Tạo thông báo cho playlist yt-dlp -f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best" \ # Tải playlist với định dạng mp4 tốt nhất -o "/Users/kiennt/Library/CloudStorage/SynologyDrive-n00bIT/YT_Saver/%(playlist_title)s/%(title)s.%(ext)s" "$@" --exec "sh -c 'message=\"$message\" terminal-notifier -title \">>> YT-DLP <<<\" -message \"$message\" -sound \"ytdlp-success.mp3\"'" # Lưu playlist vào đường dẫn và hiển thị thông báo sau khi tải xong fi # Kết thúc điều kiện kiểm tra tên playlist fi # Kết thúc điều kiện kiểm tra tham số } # Kết thúc định nghĩa hàm ydlmp4 ydlmp3() { if [[ -n "$*" ]]; then playlist_title=$(yt-dlp -j "$@" | jq -r '.playlist_title') if [[ "$playlist_title" == "null" || -z "$playlist_title" ]]; then video_title=$(yt-dlp -j "$@" | jq -r '.title') message="Đã tải xuống audio (MP3): ${video_title}" yt-dlp -x --audio-format mp3 --audio-quality 0 -o "/Users/kiennt/Library/CloudStorage/SynologyDrive-n00bIT/YT_Saver/Music/%(title)s.%(ext)s" "$@" && \ terminal-notifier -title ">>> YT-DLP <<<" -message "$message" -sound "ytdlp-success.mp3" else message="Đã tải xuống playlist: ${playlist_title}" yt-dlp -x --audio-format mp3 --audio-quality 0 -o "/Users/kiennt/Library/CloudStorage/SynologyDrive-n00bIT/YT_Saver/Music/%(title)s.%(ext)s" "$@" --exec "sh -c 'message=\"$message\" terminal-notifier -title \">>> YT-DLP <<<\" -message \"$message\" -sound \"ytdlp-success.mp3\"'" fi fi } ydlm4a() { if [[ -n "$*" ]]; then playlist_title=$(yt-dlp -j "$@" | jq -r '.playlist_title') if [[ "$playlist_title" == "null" || -z "$playlist_title" ]]; then video_title=$(yt-dlp -j "$@" | jq -r '.title') message="Đã tải xuống audio (M4A): ${video_title}" yt-dlp -x --audio-format m4a --audio-quality 0 -o "/Users/kiennt/Library/CloudStorage/SynologyDrive-n00bIT/YT_Saver/Music/%(title)s.%(ext)s" "$@" && \ terminal-notifier -title ">>> YT-DLP <<<" -message "$message" -sound "ytdlp-success.mp3" else message="Đã tải xuống playlist: ${playlist_title}" yt-dlp -x --audio-format m4a --audio-quality 0 -o "/Users/kiennt/Library/CloudStorage/SynologyDrive-n00bIT/YT_Saver/Music/%(title)s.%(ext)s" "$@" --exec "sh -c 'message=\"$message\" terminal-notifier -title \">>> YT-DLP <<<\" -message \"$message\" -sound \"ytdlp-success.mp3\"'" fi fi } ydlmkv() { if [[ -n "$*" ]]; then playlist_title=$(yt-dlp -j "$@" | jq -r '.playlist_title') if [[ "$playlist_title" == "null" || -z "$playlist_title" ]]; then video_title=$(yt-dlp -j "$@" | jq -r '.title') message="Đã tải xuống video: ${video_title}" yt-dlp -f "bestvideo[ext=mkv]+bestaudio[ext=mka]/best[ext=mkv]/best" -o "/Users/kiennt/Library/CloudStorage/SynologyDrive-n00bIT/YT_Saver/%(playlist_title)s/%(title)s.%(ext)s" "$@" && \ terminal-notifier -title ">>> YT-DLP <<<" -message "$message" -sound "ytdlp-success.mp3" else message="Đã tải xuống playlist: ${playlist_title}" yt-dlp -f "bestvideo[ext=mkv]+bestaudio[ext=mka]/best[ext=mkv]/best" -o "/Users/kiennt/Library/CloudStorage/SynologyDrive-n00bIT/YT_Saver/%(playlist_title)s/%(title)s.%(ext)s" "$@" --exec "sh -c 'message=\"$message\" terminal-notifier -title \">>> YT-DLP <<<\" -message \"$message\" -sound \"ytdlp-success.mp3\"'" fi fi }