Rewrite in nushell
This commit is contained in:
commit
5b0189cc37
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
result
|
||||||
|
.direnv
|
61
flake.lock
Normal file
61
flake.lock
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"flake-utils": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1705309234,
|
||||||
|
"narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1708655239,
|
||||||
|
"narHash": "sha256-ZrP/yACUvDB+zbqYJsln4iwotbH6CTZiTkANJ0AgDv4=",
|
||||||
|
"owner": "nixos",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "cbc4211f0afffe6dfd2478a62615dd5175a13f9a",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nixos",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils",
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
52
flake.nix
Normal file
52
flake.nix
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
{ description = "Extremely basic flake";
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||||
|
flake-utils.url = "github:numtide/flake-utils";
|
||||||
|
};
|
||||||
|
outputs = { self, nixpkgs, flake-utils}:
|
||||||
|
flake-utils.lib.eachDefaultSystem (system:
|
||||||
|
let pkgs = import nixpkgs { inherit system; };
|
||||||
|
in {
|
||||||
|
|
||||||
|
packages = {
|
||||||
|
default = pkgs.stdenvNoCC.mkDerivation {
|
||||||
|
name = "arbit-nu";
|
||||||
|
version = "2.0";
|
||||||
|
src = ./src;
|
||||||
|
|
||||||
|
nativeBuildInputs = with pkgs; [
|
||||||
|
scdoc
|
||||||
|
];
|
||||||
|
|
||||||
|
propagatedBuikdInputs = with pkgs; [
|
||||||
|
pipe-viewer
|
||||||
|
yt-dlp
|
||||||
|
mpv
|
||||||
|
libnotify
|
||||||
|
xclip
|
||||||
|
];
|
||||||
|
|
||||||
|
buildInputs = with pkgs; [
|
||||||
|
nushell
|
||||||
|
];
|
||||||
|
|
||||||
|
preConfigure = ''
|
||||||
|
patchShebangs ./bin/*
|
||||||
|
'';
|
||||||
|
|
||||||
|
buildPhase = ''
|
||||||
|
scdoc < manpages/arbit.1.scd > arbit.1
|
||||||
|
'';
|
||||||
|
|
||||||
|
installPhase = ''
|
||||||
|
mkdir -p $out/{bin,share/{man/man1,zsh/site-functions}}
|
||||||
|
cp bin/arbit $out/bin/
|
||||||
|
cp arbit.1 $out/share/man/man1/
|
||||||
|
cp completions/_arbit $out/share/zsh/site-functions/
|
||||||
|
'';
|
||||||
|
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
87
src/bin/arbit
Executable file
87
src/bin/arbit
Executable file
|
@ -0,0 +1,87 @@
|
||||||
|
#!/usr/bin/env nu
|
||||||
|
# Copyright 2024 Marty Sluijtman <marty.wanderer@disroot.org>
|
||||||
|
# Distributed under the terms of the GPLv3 license
|
||||||
|
|
||||||
|
let videoDir = $env.XDG_VIDEOS_DIR? | default $"($env.HOME)/Videos"
|
||||||
|
let downloadDir = $env.ARBITDIR? | default $"($videoDir)/YouTube"
|
||||||
|
let clipboardContent = xclip -o
|
||||||
|
|
||||||
|
# Ensure the download directory exists
|
||||||
|
def init_dir [] {
|
||||||
|
if ($downloadDir | path exists) == false {
|
||||||
|
$"Creating download directory: '($downloadDir)'..."
|
||||||
|
mkdir $downloadDir
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Generic notification wrapper
|
||||||
|
def notify [message: string] {
|
||||||
|
init_dir # annoying way to ensure the download directory exists
|
||||||
|
notify-send "Arbit" $message
|
||||||
|
}
|
||||||
|
|
||||||
|
# Notification error function
|
||||||
|
def die [exit_code: int, error?: string] {
|
||||||
|
let message = $error. | default "Failed"
|
||||||
|
notify $"($message), exiting with exit status ($exit_code)..."
|
||||||
|
$"($message), exiting with exit status ($exit_code)..."
|
||||||
|
}
|
||||||
|
|
||||||
|
# Documentation for mpv_clip
|
||||||
|
def play_video [url: string, message: string] {
|
||||||
|
notify $message
|
||||||
|
let mpvStatus = do { mpv --force-window $url } | complete
|
||||||
|
if $mpvStatus.exit_code != 0 {
|
||||||
|
die $mpvStatus.exit_code $mpvStatus.stdout
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Documentation for download_video
|
||||||
|
def download_video [url: string, message: string] {
|
||||||
|
notify $message
|
||||||
|
let ytdlpStatus = do { yt-dlp --embed-chapters --embed-metadata --embed-subs -o $"($downloadDir)/%\(title\)s - %\(uploader\)s.%\(ext\)s" $url } | complete
|
||||||
|
if $ytdlpStatus.exit_code != 0 {
|
||||||
|
die $ytdlpStatus.exit_code $ytdlpStatus.stderr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Documentation for pipe-viewer_search
|
||||||
|
def pipe-viewer_search [query: string] {
|
||||||
|
pipe-viewer --player=mpv "$query"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Documentation for main
|
||||||
|
def main [] {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
# Open the given argument with 'mpv'
|
||||||
|
def "main url" [url: string] {
|
||||||
|
play_video $url "Opening URL with mpv..."
|
||||||
|
}
|
||||||
|
|
||||||
|
# Take the contents of the clipboard and open them using 'mpv'
|
||||||
|
def "main clipboard-url" [] {
|
||||||
|
play_video $clipboardContent "Opening clipboard content with mpv..."
|
||||||
|
}
|
||||||
|
|
||||||
|
# Open the given argument with 'yt-dlp'
|
||||||
|
def "main download" [url: string] {
|
||||||
|
download_video $url $"Downloading video to '($downloadDir)'..."
|
||||||
|
}
|
||||||
|
|
||||||
|
# Take the contents of the clipboard and open them using 'yt-dlp'
|
||||||
|
def "main download-url" [] {
|
||||||
|
download_video $clipboardContent $"Downloading video to '($downloadDir)'..."
|
||||||
|
}
|
||||||
|
|
||||||
|
# Query YouTube using the given string with 'pipe-viewer'
|
||||||
|
def "main search" [query: string] {
|
||||||
|
pipe-viewer_search $query
|
||||||
|
}
|
||||||
|
|
||||||
|
# Query YouTube using the contents of the clipboard with 'pipe-viewer'
|
||||||
|
def "main clipboard-content" [] {
|
||||||
|
notify $"Searching YouTube with:\n\n($clipboardContent)"
|
||||||
|
pipe-viewer_search $clipboardContent
|
||||||
|
}
|
6
src/completions/_arbit
Normal file
6
src/completions/_arbit
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
#compdef arbit _arbit
|
||||||
|
|
||||||
|
_arguments -C \
|
||||||
|
"1: :(clipboard-url clipboard-content download-url search url download)" \
|
||||||
|
"*::args:->args"
|
||||||
|
_arguments : $arguments
|
48
src/manpages/arbit.1.scd
Normal file
48
src/manpages/arbit.1.scd
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
arbit(1)
|
||||||
|
|
||||||
|
# NAME
|
||||||
|
|
||||||
|
arbit - A wrapper around yt-dlp, mpv and pipe-viewer to watch aribtrary videos
|
||||||
|
without a browser
|
||||||
|
|
||||||
|
# SYNOPSIS
|
||||||
|
|
||||||
|
*arbit* _<clipboard-url|clipboard-content|download-url>_
|
||||||
|
|
||||||
|
# DESCRIPTION
|
||||||
|
|
||||||
|
A little video watch and download script made to be used in tandem with
|
||||||
|
minimalist window managers.
|
||||||
|
|
||||||
|
# CONFIGURATION
|
||||||
|
|
||||||
|
*arbit* saves it's output to '*~/Videos/YouTube*' by default.
|
||||||
|
This can be changed by setting the *$ARBITDIR* environment variable.
|
||||||
|
|
||||||
|
# COMMANDS
|
||||||
|
|
||||||
|
*clipboard-url*
|
||||||
|
Open the contents of the clipboard either in *pipe-viewer(1)* or directly in
|
||||||
|
*mpv(1)*. If a given URL contains either 'youtube' or 'youtu.be', it will be
|
||||||
|
opened in pipe-viewer. Any other URLs will be opened directly using mpv.
|
||||||
|
|
||||||
|
*clipboard-content*
|
||||||
|
Open *pipe-viewer(1)* with the contents of the clipboard as search query.
|
||||||
|
|
||||||
|
*download-url*
|
||||||
|
Open *yt-dlp(1)* with the contents of the clipboard to download the
|
||||||
|
resulting file.
|
||||||
|
|
||||||
|
*search* _<search-query>_
|
||||||
|
Query YouTube using *pipe-viewer(1)*
|
||||||
|
|
||||||
|
*url*
|
||||||
|
Open a given URL either in *pipe-viewer(1)* or directly in
|
||||||
|
*mpv(1)*.
|
||||||
|
|
||||||
|
*download* _<url>_
|
||||||
|
Open *yt-dlp(1)* with the contents of the given URL to download the
|
||||||
|
resulting file.
|
||||||
|
|
||||||
|
# SEE ALSO
|
||||||
|
*mpv(1)*, *pipe-viewer(1)*, *yt-dlp(1)*
|
Loading…
Reference in a new issue