From 628c4be55862dd1f5216b85ae37b351c33776014 Mon Sep 17 00:00:00 2001 From: Jade Levesque Date: Thu, 5 Jan 2017 23:57:29 -0600 Subject: [PATCH] Add playlist support --- README.md | 19 +++--- lib/yt-playlist | 150 ++++++++++++++++++++++++++++++++++++++++++++++++ shelltube | 24 ++++++-- 3 files changed, 176 insertions(+), 17 deletions(-) create mode 100755 lib/yt-playlist diff --git a/README.md b/README.md index dbf2750..9fb50de 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ ![Shelltube](https://cloud.githubusercontent.com/assets/7250745/21452795/52fcd6ea-c901-11e6-871b-bd646f2d7c49.png) -Shelltube is a collection of (pretty POSIX) shell scripts to +shellTube is a collection of (pretty POSIX) shell scripts to browse YouTube quickly, efficiently, and without the bloat most command-line clients require. -Shelltube is written in pure shell; its only dependencies +shellTube is written in pure shell; its only dependencies are any modern shell (pdksh, bash, zsh), curl/wget, and vlc/mplayer/kaffeine. @@ -12,7 +12,7 @@ Even these dependencies, though, can easily be changed. If, for example, you don't have vlc, you can just modify a single line and be good-to-go using another player. -Also, Shelltube doesn't use the YouTube API at all. This +Also, shellTube doesn't use the YouTube API at all. This avoids the annoying red-tapey stuff that goes with it -- IDs, registration, quotas -- but has some disadvantages. We'll power through the downsides, though! :) @@ -20,8 +20,8 @@ power through the downsides, though! :) Usage ------- -Shelltube is quite simple to use; this tutorial will go over -the usage of the wrapper script, shelltube.sh. +shellTube is quite simple to use; this tutorial will go over +the usage of the wrapper script, `shelltube`. When running the script, you'll see a prompt: ``` @@ -38,13 +38,14 @@ In this prompt you can type any of the following commands: | `exit` | Exit Shelltube. | | (`?`) `help` | Display this message. | | (`md`) `metadata [URL]` | Display selected/specified video's metadata. | +| (`//`) `playlist URL` `playlist ID` | View playlist based on `URL` or `ID`. | | (`/`) `search TERM` | Perform a search for `TERM`. | | (`str`) `stream [URL]` | Stream the selected/specified video. | | (`sel`) `video URL` `video ID` | Select video based on `URL` or `ID`. | In [brackets], optional arguments are written. -You can use Shelltube in one of two ways (or both): +You can use shellTube in one of two ways (or both): 1. By selecting a video and then doing something with it 2. By doing something and specifying the video @@ -86,9 +87,3 @@ All of ST is released under the Except for the `yt-down` script, which is released under the [GPLv2](https://www.gnu.org/licenses/gpl-2.0.html). - - -Credit --------- -jadedctrl wrote most of ST, but iluaster wrote almost all of -`yt-down` diff --git a/lib/yt-playlist b/lib/yt-playlist new file mode 100755 index 0000000..244c9aa --- /dev/null +++ b/lib/yt-playlist @@ -0,0 +1,150 @@ +##################### +# Name: yt-playlist +# Lisc: ISC +# Main: jadedctrl +# Desc: List a playlist's videos +# in easy-to-read and easy-to +# -parse results +##################### + +# Usage: yt-playlist "$playlist_ID" + +if [ -e $HOME/.config/shelltube ] +then + . $HOME/.config/shelltube +else + results=21 +fi + +if [ -e "./lib/yt-meta" ] +then + alias yt-channel="./lib/yt-channel" + alias yt-search="./lib/yt-down" + alias yt-meta="./lib/yt-meta" + alias yt-search="./lib/yt-search" + alias yt-down="./lib/yt-channel" + alias st-download="./lib/st-download" + alias st-video="./lib/st-video" +fi + +row=0 + +if [ "$1" == "-i" ] +then + interactive_mode=1 + plist="$(echo "$2" | sed 's/ /+/g')" + output="$3" +else + interactive_mode=0 + plist="$(echo "$1" | sed 's/ /+/g')" +fi + +function get_input() { + printf '\033[0;32m>>>\033[0m ' + read -r n + + if [ "$n" == "exit" ] + then + exit + fi + + test $n -ge 0 &> /dev/null + + if [ $? -gt 1 ] + then + echo "Bad input, mate. Type in a valid number or 'exit'." + get_input + elif [ $n -gt 20 ] + then + echo "Out of range. Type in a valid number or 'exit'." + get_input + elif [ $n -gt 0 ] && [ $n -lt 20 ] + then + sed -n ${n}p $temp_file | sed 's/.*data-video-id="//' | sed 's/".*//' > $output + else + echo "Bad input, mate. Type in a valid number or 'exit'." + get_input + fi +} + +# If Google adds any extra features or changes the webpage +# layout, this script'll break immediately, haha. +# ... But at least we aren't using their API, right? + +plist_file="/tmp/$(mktemp -u yt-search_XXXXXX)" + +st-download https://youtube.com/playlist?list=$plist $plist_file + +# Now for displaying the search results +temp_file="/tmp/$(mktemp -u yt-result_XXXXXX)" +grep " $temp_file + +item_num=0 +cat $temp_file | while IFS='' read -r CUR_LINE +do + item_num=$(($item_num+1)) + + if [ $row -eq 1 ] + then + #color='\033[1;34m' + #color2='\033[1;34m' + printf '\033[1;34m' + row=0 + elif [ $row -eq 0 ] + then + #color='\033[1;31m' + #color2='\033[1;31m' + printf '\033[1;31m' + row=1 + fi + + itemid=$(echo "$CUR_LINE" | sed 's/.*data-video-id="//' | sed 's/".*//') + title=$(echo "$CUR_LINE" | sed 's/.*data-title="//' | sed 's/".*//') + author=$(grep -C3 " $(echo $title)" "$plist_file" | grep "by " | sed 's/.*">//' | sed 's^.*^^') + + if [ $item_num -ge $((results+1)) ] + then + break + elif [ $item_num -lt 10 ] + then + printf '%s. ' "$item_num" + else + printf '%s. ' "$item_num" + fi + printf '%s\n' "$title" + printf ' ' + i=0 + while [ $i -lt 16 ] + do + i=$((i+1)) + char=$(echo $author | cut -c$i) + if [ -z $char ] + then + printf ' ' + else + printf '%s' "$char" + fi + done + printf ' | ' + i=0 + while [ $i -lt 5 ] + do + i=$((i+1)) + char=$(echo $duration | cut -c$i) + if [ -z $char ] + then + printf ' ' + else + printf '%s' "$char" + fi + done + printf ' | %s\n' "$itemid" +done + +printf '\033[0m' + +if [ $interactive_mode -eq 1 ] +then + get_input +fi diff --git a/shelltube b/shelltube index 541da0d..11cc7e9 100755 --- a/shelltube +++ b/shelltube @@ -5,11 +5,11 @@ # Lisc: ISC # Main: jadedctrl # Desc: Full-shell YT client that avoids the YT API. - Vers=0.4 + Vers=0.5 ##################### # Roadmap: -# v1.0 - [ ] Playlist support +# v1.0 - [X] Playlist support # [X] Channel support # [ ] Audio dl/stream # [ ] Show related videos @@ -28,10 +28,10 @@ fi if [ -e "./lib/yt-meta" ] then alias yt-channel="./lib/yt-channel" - alias yt-search="./lib/yt-down" alias yt-meta="./lib/yt-meta" + alias yt-playlist="./lib/yt-playlist" alias yt-search="./lib/yt-search" - alias yt-down="./lib/yt-channel" + alias yt-down="./lib/yt-down" alias st-download="./lib/st-download" alias st-video="./lib/st-video" fi @@ -43,6 +43,13 @@ search() { yt-meta "$selected_video" } +playlist() { + output="$(mktemp -u /tmp/yt_XXXXXX)" + yt-playlist -i "$1" "$output" + selected_video="$(cat "$output")" + yt-meta "$selected_video" +} + channel() { output="$(mktemp -u /tmp/yt-channel_XXXXXX)" case "$1" in @@ -58,7 +65,7 @@ channel() { } about() { - printf '\033[35mShelltube v%s\033[m\n' "$Vers" + printf '\n \033[1mshell\033[41m Tube \033[0;1;30m v%s\033[m\n\n' "$Vers" printf '\033[32mDesc: \033[0;34mYT client written in shell.\033[m\n' printf '\033[32mMain: \033[0;34mjadedml@openmailbox.org\033[m\n' printf '\033[32mLisc: \033[0;34mISC; yt-down GPLv2\033[m\n' @@ -72,6 +79,7 @@ download | dl Download the selected video. exit | ctrl+c Exit Shelltube. help | ? Display this message. metadata | md Display selected video's metadata. +playlist | // Display a playlist's videos. search | / Perform a search. channel | chan Show newest videos of a channel. stream | str Stream the selected video. @@ -90,6 +98,12 @@ parse() { help | '?' ) help ;; + playlist ) + playlist "$argument" + ;; + //* ) + playlist "${command#//}" + ;; search ) search "$argument" ;;