Hacker News new | ask | show | jobs
by kragen 1735 days ago
Right now I'm using these kind of shitty shell scripts to download the videos, ls to list them, and mpv on the command line to play them. These use a file called "channels" which contains YouTube channel URLs and space-separated tags, like this:

    https://www.youtube.com/channel/UClaEdLrmti779-tyovta8zw grandpa amu hardware carpentry hacking
    https://www.youtube.com/channel/UCLt9kIslIa1ffiM8A04KORw wm levsha hardware hacking
Here are the scripts, slightly cleaned up:

snarf:

    #!/bin/sh
    echo "snarf $@"
    exec python3 ../youtube-dl -f '[height<769]' -i -r 1M -R 1 \
     --sleep-interval "${wait-227}" --max-filesize "${max_filesize-242m}" \
     --no-mtime --playlist-end ${n-5} --write-info-json --add-metadata \
     --write-description --write-thumbnail --write-auto-sub \
     --write-sub --sub-lang en,es "$@"
snarf-tags:

    #!/bin/sh
    exec ./snarf $(./tag "$@" | shuf | sed 's,$,/videos,')
search:

    #!/bin/sh
    exec ./snarf ytsearch10:"$(echo "$@" | sed 's, ,+,g')"
resnarf:

    #!/bin/sh
    : ${1?Usage: $0 foo.mp4.part}
    
    # example: garbage\ stuff\ -zKLMCO0-How.mp4.part
    
    for x in "$@"; do
     x=$(echo "$x" | perl -ne 'm,(.{11})\.mp4,; print $1')
     ./snarf "https://youtu.be/$x"
    done
tag:

    #!/usr/bin/env python3
    import sys
    
    def match(args, line):
        return (not any('-' + word in args for word in line) 
            and not any(word not in line for word in args if word[0] != '-'))
    
    def main(args, input, output):
        for line in input:
            words = line.split()
            if match(args, words):
                output.write(words[0] + "\n")
    
    if __name__ == '__main__':
        main(sys.argv[1:], open('channels'), sys.stdout)
So my searchbar is "wait=3 ./search japanese hornets" or "./search electrochemical machining advances", and periodically I run "./snarf-tags" to download any new videos over the next few hours, which I can then see with "ls -lart ./*4". And if I want to know where some great search-result video came from so I can add it to the list of channels, why, that's "jq -r .uploader_url Romanes\ Eunt\ Domus\ EXPLAINED\ _\ Monty\ Python\'s\ Life\ of\ Brian\ •\ Fun\ with\ Latin-UfH6gjxTTgE.info.json", which sounds horrible but it's really more like ^Rjq^A M-f M-f M-f ^K Ro<TAB>.

Suggested videos and thumbnail display, not to mention buttons to press for the above things, would be a welcome addition, but thumbnail display is difficult in the terminal. Also, it would be pretty great to have a way to not redownload a video after I deleted it, and for youtube-dl to not wait the 227 seconds before deciding not to download a video because it's a four-hour snoozefest recorded livestream.

2 comments

Great. My first thought was: The inverse of (dual to?) the infamous Dropbox comment
Haha! Yeah, I definitely don't mean to imply that the UX of these scripts couldn't be improved, just that these are some bits of functionality that I've found useful, and some very simple ways I've found to implement them that nevertheless worked pretty well. And, maybe as importantly, it may not be hard to have better UX than 25 lines of shell scripts, but it's even easier to have worse UX, so this is kind of the minimum bar for acceptability.
Yeah, there was zero implication about UX on my part though. Instead of just dismissing it with a: "I can do that in 30 lines of Python", you just delivered a solution that works for you and can be built upon by others. Good job, praiseworthy IMHO.
I think UX was precisely the way Dropbox won.
Thanks for this! I’m going to be rigging something like this soon, and I have a lot of feature crossover with what you’ve done here.
Sure! I hope it's helpful!