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
}

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *