initial commit

This commit is contained in:
zuckerberg 2021-05-25 06:53:54 -04:00
commit 494822935b
6 changed files with 141 additions and 0 deletions

8
default.nix Normal file
View File

@ -0,0 +1,8 @@
{ pkgs ? import <nixpkgs> { }, self ? ./. }:
pkgs.python3Packages.buildPythonApplication {
pname = "radio";
src = self;
version = "0.1";
propagatedBuildInputs = with pkgs.python3Packages; [ pip ffmpeg-python youtube-dl ];
}

56
downloader.py Normal file
View File

@ -0,0 +1,56 @@
#
# Downloads the video/audio as a stream from a provided link using youtube-dl
# does not save the file, only the most recent fragment is held. Thus, this is
# ideal for devices with little memory
# TODO gather video metadata before download
#
# dirpath = tempfile.mkdtemp()
# sys.path.append(dirpath)
# def import_from_pip(package):
# pip.main(['install', '--target=' + dirpath, '--upgrade', package])
# return __import__(package)
# youtube_dl = import_from_pip('youtube_dl')
import tempfile
import pip
import sys
import youtube_dl
import subprocess
dirpath = tempfile.mkdtemp()
sys.path.append(dirpath)
BUFFER_SIZE = 1024
def execute(cmd):
popen = subprocess.Popen(cmd, stdout=subprocess.PIPE)
# monitor the stdout
for chunk in iter(lambda: popen.stdout.read(BUFFER_SIZE), b''):
yield chunk
popen.stdout.close()
popen.wait()
def updateYoutubeDL():
pip.main(['install', '--target=' + dirpath, '--upgrade', package])
def download(url):
# update youtube-dl
# TODO: do this only every once in a while
#updateYoutubeDL()
# start downloader so that it's stdout (with fragments) may be captured
for s in execute(["python3","downloader.py",url]):
print(s)
def runYoutubeDL(url):
ydl_opts = {
'logtostderr': True,
'outtmpl': '-',
}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
ydl.download([url])
if __name__ == "__main__":
runYoutubeDL(sys.argv[1])

41
flake.lock generated Normal file
View File

@ -0,0 +1,41 @@
{
"nodes": {
"flake-utils": {
"locked": {
"lastModified": 1620759905,
"narHash": "sha256-WiyWawrgmyN0EdmiHyG2V+fqReiVi8bM9cRdMaKQOFg=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "b543720b25df6ffdfcf9227afafc5b8c1fabfae8",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1621784194,
"narHash": "sha256-CQWN/QvVHG8qCn7UhGGwoT3jAPvnJHQUvzBlIt48FGs=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "c5265c01a944b1cecfcfab392d5204d73d65d4ec",
"type": "github"
},
"original": {
"id": "nixpkgs",
"type": "indirect"
}
},
"root": {
"inputs": {
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs"
}
}
},
"root": "root",
"version": 7
}

18
flake.nix Normal file
View File

@ -0,0 +1,18 @@
{
description = "An internet radio service";
inputs.flake-utils.url = "github:numtide/flake-utils";
outputs = { self, nixpkgs, flake-utils }:
flake-utils.lib.eachDefaultSystem (system:
let pkgs = nixpkgs.legacyPackages.${system}; in
rec {
packages = flake-utils.lib.flattenTree {
radio = import ./default.nix { inherit pkgs; inherit self; };
};
defaultPackage = packages.radio;
apps.radio = flake-utils.lib.mkApp { drv = packages.radio; };
defaultApp = apps.radio;
}
);
}

8
radio.py Normal file
View File

@ -0,0 +1,8 @@
import downloader
def run():
downloader.download('https://www.youtube.com/watch?v=BaW_jenozKc')
downloader.download('https://www.youtube.com/watch?v=kgBcg4uBd9Q')
if __name__ == "__main__":
run()

10
setup.py Normal file
View File

@ -0,0 +1,10 @@
from setuptools import setup
setup(
name='radio',
version='0.1',
py_modules=['radio'],
entry_points={
'console_scripts': ['radio = radio:run']
},
)