Kpopminal/Kpop'minal.ipynb

223 lines
12 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "TK6pOEjtZCFB"
},
"source": [
"# Kpop'minal\n",
"Watch k-pop music videos in an ASCII format. \n",
"\n",
"_Uses [`video-to-ascii` by joelibaceta](https://github.com/joelibaceta/video-to-ascii)_. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "NKYqnAEwCPYG",
"cellView": "form"
},
"outputs": [],
"source": [
"# KPOP'MINAL\n",
"# Watch k-pop music videos in an ASCII format. \n",
"\n",
"import os; import subprocess\n",
"from IPython.display import Audio\n",
"\n",
"# selections\n",
"class selection: \n",
" artist = \"Twice\" #@param [\"Twice\"]\n",
" video = \"\" #@param {type:\"string\"}\n",
" video = (video.strip()).lower()\n",
" videoURL = ''\n",
"\n",
"class configs: \n",
" #@markdown ## Configuration\n",
" method = \"ascii-color\" #@param [\"filled-ascii\", \"ascii-color\", \"just-ascii\"]\n",
"\n",
"# Set screen formatting. \n",
"class formatting:\n",
" clear = '\\033[0m'\n",
" class color: \n",
" purple = '\\033[95m'\n",
" cyan = '\\033[96m'\n",
" cyan_dark = '\\033[36m'\n",
" blue = '\\033[94m'\n",
" green = '\\033[92m'\n",
" yellow = '\\033[93m'\n",
" red = '\\033[91m'\n",
" class font:\n",
" bold = '\\033[1m'\n",
" underline = '\\033[4m'\n",
"\n",
"class info: # screen messages\n",
" def status(message):\n",
" print(formatting.font.bold + 'Status: \\t' + formatting.clear + message)\n",
" def err(message):\n",
" print(formatting.font.bold + formatting.color.red + 'Error: \\t\\t' + formatting.clear + formatting.clear + message)\n",
" def warning(message):\n",
" print(formatting.font.bold + formatting.color.yellow + 'Warning: \\t' + formatting.clear + formatting.clear + message)\n",
" def success(message):\n",
" print(formatting.font.bold + formatting.color.green + 'Success: \\t' + formatting.clear + formatting.clear + message)\n",
"\n",
"try: \n",
" from google.colab import files; from google.colab import output\n",
"except: \n",
" info.err(formatting.font.bold + 'Google CoLab is required to run this.' + formatting.clear + ' This requires components only available in Google CoLab servers.')\n",
" os.kill(os.getpid(), 1)\n",
"\n",
"# Install apt programs and python modules. \n",
"def get_dependencies(): \n",
" import subprocess\n",
"\n",
" def install_dependencies_apt(): \n",
" return os.system('apt update && apt install -y ffmpeg libasound-dev portaudio19-dev libportaudiocpp0 libportaudio2 python-pyaudio python3-pyaudio && apt clean && apt autoremove -y')\n",
"\n",
" def install_dependencies_pip():\n",
" return os.system('pip install \"video-to-ascii==1.2.8\" && pip install pyaudio')\n",
"\n",
" def install_dependencies_other(): \n",
" return os.system('cd /tmp && git clone https://people.csail.mit.edu/hubert/git/pyaudio.git && cd pyaudio && ipython setup.py install') # install pyaudio\n",
"\n",
" info.status('Setting up the environment…')\n",
"\n",
" install_dependencies_apt()\n",
" install_dependencies_pip()\n",
" install_dependencies_other()\n",
"\n",
" info.success('The environment has been set up. ')\n",
" output.clear()\n",
"\n",
"def download_video(): \n",
" musicvideos = {\n",
" # Download links for the music videos. Good thing it's available in archive.org. \n",
" # should all be in lower case\n",
" \"Twice\": {\n",
" # Download links available here: https://archive.org/details/twuniverse\n",
" \"like ooh-ahh\": \"https://ia804501.us.archive.org/7/items/twuniverse/Like%20Oohahhoohahh.ia.mp4\",\n",
" \"cheer up\": \"https://ia904501.us.archive.org/7/items/twuniverse/Cheer%20Up%20.ia.mp4\",\n",
" \"tt\": \"https://ia804501.us.archive.org/7/items/twuniverse/Tt%20.ia.mp4\",\n",
" \"knock knock\": \"https://ia904501.us.archive.org/7/items/twuniverse/Knock%20Knock%20.ia.mp4\",\n",
" \"signal\": \"https://ia804501.us.archive.org/7/items/twuniverse/Signal%20.ia.mp4\",\n",
" \"one more time\": \"https://ia804501.us.archive.org/7/items/twuniverse/One%20More%20Time.ia.mp4\",\n",
" \"likey\": \"https://ia904501.us.archive.org/7/items/twuniverse/Likey%20.ia.mp4\",\n",
" \"merry & happy\": \"https://ia904501.us.archive.org/7/items/twuniverse/Merry%20%20Happy%20.ia.mp4\",\n",
" \"candy pop\": \"https://ia804501.us.archive.org/7/items/twuniverse/Candy%20Pop.ia.mp4\",\n",
" \"what is love?\": \"https://ia804501.us.archive.org/7/items/twuniverse/What%20Is%20Love%20.ia.mp4\",\n",
" \"wake me up\": \"https://ia804501.us.archive.org/7/items/twuniverse/Wake%20Me%20Up.ia.mp4\",\n",
" \"i want you back\": \"https://ia804501.us.archive.org/7/items/twuniverse/I%20Want%20You%20Back.ia.mp4\",\n",
" \"dance the night away\": \"https://ia904501.us.archive.org/7/items/twuniverse/Dance%20The%20Night%20Away%20.ia.mp4\",\n",
" \"bdz\": \"https://ia904501.us.archive.org/7/items/twuniverse/Bdz.ia.mp4\",\n",
" \"yes or yes\": \"https://ia804501.us.archive.org/7/items/twuniverse/Yes%20Or%20Yes%20.ia.mp4\",\n",
" \"the best thing i ever did\": \"https://ia804501.us.archive.org/7/items/twuniverse/The%20Best%20Thing%20I%20Ever%20Did.ia.mp4\",\n",
" \"fancy\": \"https://ia904501.us.archive.org/7/items/twuniverse/Fancy%20.ia.mp4\",\n",
" \"breakthrough\": \"https://ia804501.us.archive.org/7/items/twuniverse/Breakthrough.ia.mp4\",\n",
" \"happy happy\": \"https://ia904501.us.archive.org/7/items/twuniverse/Happy%20Happy.ia.mp4\",\n",
" \"feel special\": \"https://ia904501.us.archive.org/7/items/twuniverse/Feel%20Special%20.ia.mp4\",\n",
" \"fake & true\": \"https://ia804501.us.archive.org/7/items/twuniverse/Fake%20%20True%20.ia.mp4\",\n",
" \"more & more\": \"https://ia804501.us.archive.org/7/items/twuniverse/More%20%20More%20.ia.mp4\",\n",
" \"fanfare\": \"https://ia904501.us.archive.org/7/items/twuniverse/Fanfare.ia.mp4\",\n",
" \"i can't stop me\": \"https://ia804501.us.archive.org/7/items/twuniverse/I%20Cant%20Stop%20Me%20.ia.mp4\",\n",
" \"better\": \"https://ia804501.us.archive.org/7/items/twuniverse/Better%20.ia.mp4\",\n",
" \"kura kura\": \"https://ia804501.us.archive.org/7/items/twuniverse/Kura%20Kura%20.ia.mp4\",\n",
" \"alcohol-free\": \"https://ia804501.us.archive.org/7/items/twuniverse/Alcoholfree%20.ia.mp4\"\n",
" }\n",
" }\n",
"\n",
" def check_valid_input():\n",
" try:\n",
" # It should raise an exception if the person did not type the correct music video name. \n",
" if musicvideos[selection.artist][selection.video]: \n",
" selection.videoURL = musicvideos[selection.artist][selection.video]\n",
" \n",
" except:\n",
" info.err(formatting.font.bold + 'The video that you are looking for does not exist. ' + formatting.clear + 'Make sure you have typed it properly. If you did, it was not possibly included. Check out the GitHub discussions for that.')\n",
" os.kill(os.getpid(), 1)\n",
" \n",
" def start_download():\n",
" def check_exists(which=\"new\"):\n",
" if which == \"old\": return os.system(\"cat video.old.mp4\") == 0\n",
" else: return os.system(\"cat video.mp4\") == 0\n",
"\n",
" # Start downloading the video. \n",
" \n",
" os.system('rm -rf sample_data -v')\n",
" if check_exists(): os.system('rm -rf video.old.mp4 -v && mv video.mp4 video.old.mp4 -v')\n",
"\n",
" info.status('Downloading the music video…')\n",
"\n",
" if os.system('curl ' + selection.videoURL + ' -o video.mp4') > 0:\n",
" info.err(formatting.font.bold + 'The download has failed, ' + formatting.clear + 'please re-run this script again. Kindly check the log for more details.'); os.system('rm -rf video.mp4 -v')\n",
" if check_exists(\"old\"): os.system('mv video.old.mp4 video.mp4 -v')\n",
" os.kill(os.getpid(), 1)\n",
" else:\n",
" info.success('The video was successfully downloaded.')\n",
" \n",
" check_valid_input()\n",
" start_download()\n",
"\n",
"\n",
"def render(): \n",
" def check_file_exists(which=\"new\"):\n",
" if which == \"old\": return (os.system('cat output.old.sh') == 0)\n",
" else: return (os.system('cat output.sh') == 0)\n",
"\n",
" def attemptReplace():\n",
" if check_file_exists(): os.system('rm -rf output.old.sh && mv output.sh output.old.sh -v')\n",
"\n",
" def process():\n",
" info.status('Processing the video. This will take some while.')\n",
" !video-to-ascii -f video.mp4 -o output.sh --strategy {configs.method}\n",
"\n",
" def check_success():\n",
" if check_file_exists():\n",
" output.clear()\n",
" info.success('The music video has been successfully processed. ')\n",
" else:\n",
" if check_file_exists(\"old\"): os.system('mv output.old.sh output.sh -v')\n",
" info.err('Unfortunately, an error may have ocurred during processing. Kindly check the log for full details.')\n",
" os.kill(os.getpid(), 1)\n",
"\n",
" attemptReplace()\n",
" process()\n",
" check_success()\n",
"\n",
"def download_results():\n",
" info.status('Downloading the output…')\n",
" try:\n",
" files.download('output.sh')\n",
" except:\n",
" info.err('The file could not be downloaded automatically, but it is available for at the files view in the sidebar.')\n",
"\n",
"def main():\n",
" get_dependencies()\n",
" download_video()\n",
" render()\n",
" download_results()\n",
"\n",
"main()"
]
}
],
"metadata": {
"accelerator": "GPU",
"colab": {
"collapsed_sections": [],
"name": "Kpop'minal.ipynb",
"private_outputs": true,
"provenance": []
},
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
},
"language_info": {
"name": "python"
}
},
"nbformat": 4,
"nbformat_minor": 0
}