{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "1bfcae24",
   "metadata": {},
   "outputs": [],
   "source": [
    "import json\n",
    "import tqdm\n",
    "import os\n",
    "import pandas as pd\n",
    "\n",
    "DATA_DIR = \"/data/suno/data/harvest/genius\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "0314581f",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 48%|█████████████████████████████████████████████████████████████████████▌                                                                          | 645025/1335591 [03:08<03:22, 3415.26it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "645025 items loaded.\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "l = []\n",
    "with open(os.path.join(DATA_DIR, \"youtube_metas.jsonl\")) as f:\n",
    "    for line in f:\n",
    "        line = line.strip()\n",
    "        if len(line) == 0:\n",
    "            continue\n",
    "        m = json.loads(line)\n",
    "        if m[\"success\"]:\n",
    "            continue\n",
    "        l.append({\n",
    "            \"id\": m[\"id\"],\n",
    "            \"fail_type\": m[\"fail_type\"],\n",
    "            \"fail_message\": m[\"fail_message\"],\n",
    "        })\n",
    "df = pd.DataFrame(l)\n",
    "print(len(l), \"items loaded.\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "8cbb68cd",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1000 items loaded.\n"
     ]
    }
   ],
   "source": [
    "l = []\n",
    "with open(os.path.join(DATA_DIR, \"youtube_metas.jsonl\")) as f:\n",
    "    for line in f:\n",
    "        line = line.strip()\n",
    "        if len(line) == 0:\n",
    "            continue\n",
    "        m = json.loads(line)\n",
    "        if not m[\"success\"]:\n",
    "            continue\n",
    "        l.append(m)\n",
    "        if len(l) == 1000:\n",
    "            break\n",
    "df = pd.DataFrame(l)\n",
    "print(len(l), \"items loaded.\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "87a077e4",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "86654f13",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "b9b5eb06",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "4.0 seconds download\n"
     ]
    }
   ],
   "source": [
    "# check bandwidth - 57Mb\n",
    "import time\n",
    "import requests\n",
    "\n",
    "url = (\n",
    "    \"https://dts.podtrac.com/redirect.mp3/chtbl.com/track/8DB4DB/pdst.fm/e/\"\n",
    "    \"nyt.simplecastaudio.com/bbbcc290-ed3b-44a2-8e5d-5513e38cfe20/episodes/\"\n",
    "    \"7e0a3d65-8ce0-4a07-9f0e-4ebe7debd9b9/audio/128/default.mp3\"\n",
    ")\n",
    "\n",
    "US_PROXY = (\n",
    "     \"http://brd-customer-hl_98887cab-zone-us_proxy-route_err-block-country-us:\" +\n",
    "     \"3if5he8elfe7@zproxy.lum-superproxy.io:22225\"\n",
    ")\n",
    "\n",
    "proxies = {\n",
    "    \"http\": US_PROXY,\n",
    "    \"https\": US_PROXY,\n",
    "}\n",
    "\n",
    "\n",
    "t0 = time.time()\n",
    "r = requests.get(url, proxies=proxies)\n",
    "t1 = time.time()\n",
    "\n",
    "with open(\"test.mp3\", \"wb\") as f:\n",
    "    f.write(r.content)\n",
    "assert(int(round(os.path.getsize(\"test.mp3\") / 1e6)) == 59)\n",
    "\n",
    "print(round(t1-t0, 1), \"seconds download\")\n",
    "# 1.0 seconds download - metal\n",
    "# [4.8, 8.6, 4.3] seconds download - proxy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "259bcf7f",
   "metadata": {},
   "outputs": [],
   "source": [
    "50mb per second\n",
    "10mb per second on proxy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c277ebbd",
   "metadata": {},
   "outputs": [],
   "source": [
    "25MB"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "617d33fa",
   "metadata": {},
   "outputs": [],
   "source": [
    "400gb in 9 hours"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "22db1c31",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "12.345679012345679"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "400_000 / 9 / 60 / 60"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "608137ef",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "9bc58b53",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\r\n"
     ]
    }
   ],
   "source": [
    "!ffprobe -v error -select_streams a -show_entries stream=index -of csv=p=0 /data/suno/data/harvest/genius/audio/lufaOsruNoY.m4a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "08aaeaaf",
   "metadata": {},
   "outputs": [],
   "source": [
    "import subprocess"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "3697b548",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Untitled.ipynb\t\t\t get_all_audio.ipynb\ttest.mp3\r\n",
      "german_rap_get_youtube.ipynb\t get_all_lyrics.ipynb\r\n",
      "german_rap_prepare_corpus.ipynb  jIQ6UV2onyI.webm.part\r\n"
     ]
    }
   ],
   "source": [
    "!ls"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "4048ef8f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "88.2 ms ± 5.32 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n"
     ]
    }
   ],
   "source": [
    "%%timeit\n",
    "out = subprocess.check_output((\n",
    "    \"ffprobe -v 0 -hide_banner -of compact=p=0:nk=1 -show_entries packet=pts_time \"\n",
    "    \"-read_intervals 99999%+#1000 test.webm\"\n",
    ").split())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "f0457c2f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "25.4 ms ± 5.56 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)\n"
     ]
    }
   ],
   "source": [
    "%%timeit\n",
    "out = subprocess.check_output((\n",
    "    \"ls test.webm\"\n",
    ").split())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "id": "1e2073d9",
   "metadata": {},
   "outputs": [],
   "source": [
    "from suno_utils.audio.conversion import get_duration_s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "id": "d022beb9",
   "metadata": {},
   "outputs": [],
   "source": [
    "d = \"/data/suno/data/harvest/genius/audio\"\n",
    "fsn = os.listdir(d)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "id": "26d3b659",
   "metadata": {},
   "outputs": [],
   "source": [
    "fns = [fn for fn in fns if fn.split(\".\")[-1] in (\"m4a\", \"webm\")]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "id": "07bfd852",
   "metadata": {},
   "outputs": [],
   "source": [
    "import random"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "id": "4ea143ba",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 100/100 [00:05<00:00, 16.80it/s]\n"
     ]
    }
   ],
   "source": [
    "l = []\n",
    "for fn in tqdm.tqdm(fns[:100]):\n",
    "    l.append(get_duration_s(os.path.join(d, fn)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d4d94efe",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3d55f09c",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "eac6ba47",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "90f4285c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "173.254000\r\n",
      "\r\n"
     ]
    }
   ],
   "source": [
    "!ffprobe -v 0 -hide_banner -of compact=p=0:nk=1 -show_entries packet=pts_time -read_intervals 99999%+#1000 test.webm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "02fd2938",
   "metadata": {},
   "outputs": [],
   "source": [
    "!cp /data/suno/data/harvest/genius/audio/---3IbUKMTk.webm test.webm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "8be7cbf0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ffprobe version 4.4.2-0ubuntu0.22.04.1 Copyright (c) 2007-2021 the FFmpeg developers\r\n",
      "  built with gcc 11 (Ubuntu 11.2.0-19ubuntu1)\r\n",
      "  configuration: --prefix=/usr --extra-version=0ubuntu0.22.04.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-pocketsphinx --enable-librsvg --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared\r\n",
      "  libavutil      56. 70.100 / 56. 70.100\r\n",
      "  libavcodec     58.134.100 / 58.134.100\r\n",
      "  libavformat    58. 76.100 / 58. 76.100\r\n",
      "  libavdevice    58. 13.100 / 58. 13.100\r\n",
      "  libavfilter     7.110.100 /  7.110.100\r\n",
      "  libswscale      5.  9.100 /  5.  9.100\r\n",
      "  libswresample   3.  9.100 /  3.  9.100\r\n",
      "  libpostproc    55.  9.100 / 55.  9.100\r\n",
      "Input #0, matroska,webm, from 'test.webm':\r\n",
      "  Metadata:\r\n",
      "    encoder         : google/video-file\r\n",
      "  Duration: 00:02:53.28, start: -0.007000, bitrate: 56 kb/s\r\n",
      "  Stream #0:0(eng): Audio: opus, 48000 Hz, stereo, fltp (default)\r\n"
     ]
    }
   ],
   "source": [
    "!ffprobe test.webm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "23d8fde3",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "3506b6bf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>success</th>\n",
       "      <th>retry</th>\n",
       "      <th>meta</th>\n",
       "      <th>audio_filename</th>\n",
       "      <th>runtime_s</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>lufaOsruNoY</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>{'id': 'lufaOsruNoY', 'title': '0 hype - Basem...</td>\n",
       "      <td>lufaOsruNoY.m4a</td>\n",
       "      <td>4.6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>-SVPi9j_vRE</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>{'id': '-SVPi9j_vRE', 'title': '0-intend's PER...</td>\n",
       "      <td>-SVPi9j_vRE.m4a</td>\n",
       "      <td>8.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>Xz_HpdEb_KE</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>{'id': 'Xz_HpdEb_KE', 'title': '0%Mercury - Bi...</td>\n",
       "      <td>Xz_HpdEb_KE.m4a</td>\n",
       "      <td>4.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>-6hhv9vV9jk</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>{'id': '-6hhv9vV9jk', 'title': '0%Mercury - Bo...</td>\n",
       "      <td>-6hhv9vV9jk.m4a</td>\n",
       "      <td>7.8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>Sht74F_RAI8</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>{'id': 'Sht74F_RAI8', 'title': '0%Mercury - Ra...</td>\n",
       "      <td>Sht74F_RAI8.m4a</td>\n",
       "      <td>8.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>992</th>\n",
       "      <td>7EGy3Fnn4tU</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>{'id': '7EGy3Fnn4tU', 'title': '1 Way Journey ...</td>\n",
       "      <td>7EGy3Fnn4tU.m4a</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>993</th>\n",
       "      <td>wi87pvf8Fj0</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>{'id': 'wi87pvf8Fj0', 'title': '1 Way Journey ...</td>\n",
       "      <td>wi87pvf8Fj0.m4a</td>\n",
       "      <td>6.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>994</th>\n",
       "      <td>XiAJuz2_DNU</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>{'id': 'XiAJuz2_DNU', 'title': '1 Way Journey ...</td>\n",
       "      <td>XiAJuz2_DNU.m4a</td>\n",
       "      <td>5.1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>995</th>\n",
       "      <td>4jq6AJWlIV8</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>{'id': '4jq6AJWlIV8', 'title': '1 Way Journey ...</td>\n",
       "      <td>4jq6AJWlIV8.m4a</td>\n",
       "      <td>4.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>996</th>\n",
       "      <td>Zg0HkpWh6j8</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>{'id': 'Zg0HkpWh6j8', 'title': '1 Way Journey ...</td>\n",
       "      <td>Zg0HkpWh6j8.m4a</td>\n",
       "      <td>5.8</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>255 rows × 6 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "              id  success  retry  \\\n",
       "6    lufaOsruNoY     True  False   \n",
       "10   -SVPi9j_vRE     True  False   \n",
       "12   Xz_HpdEb_KE     True  False   \n",
       "13   -6hhv9vV9jk     True  False   \n",
       "14   Sht74F_RAI8     True  False   \n",
       "..           ...      ...    ...   \n",
       "992  7EGy3Fnn4tU     True  False   \n",
       "993  wi87pvf8Fj0     True  False   \n",
       "994  XiAJuz2_DNU     True  False   \n",
       "995  4jq6AJWlIV8     True  False   \n",
       "996  Zg0HkpWh6j8     True  False   \n",
       "\n",
       "                                                  meta   audio_filename  \\\n",
       "6    {'id': 'lufaOsruNoY', 'title': '0 hype - Basem...  lufaOsruNoY.m4a   \n",
       "10   {'id': '-SVPi9j_vRE', 'title': '0-intend's PER...  -SVPi9j_vRE.m4a   \n",
       "12   {'id': 'Xz_HpdEb_KE', 'title': '0%Mercury - Bi...  Xz_HpdEb_KE.m4a   \n",
       "13   {'id': '-6hhv9vV9jk', 'title': '0%Mercury - Bo...  -6hhv9vV9jk.m4a   \n",
       "14   {'id': 'Sht74F_RAI8', 'title': '0%Mercury - Ra...  Sht74F_RAI8.m4a   \n",
       "..                                                 ...              ...   \n",
       "992  {'id': '7EGy3Fnn4tU', 'title': '1 Way Journey ...  7EGy3Fnn4tU.m4a   \n",
       "993  {'id': 'wi87pvf8Fj0', 'title': '1 Way Journey ...  wi87pvf8Fj0.m4a   \n",
       "994  {'id': 'XiAJuz2_DNU', 'title': '1 Way Journey ...  XiAJuz2_DNU.m4a   \n",
       "995  {'id': '4jq6AJWlIV8', 'title': '1 Way Journey ...  4jq6AJWlIV8.m4a   \n",
       "996  {'id': 'Zg0HkpWh6j8', 'title': '1 Way Journey ...  Zg0HkpWh6j8.m4a   \n",
       "\n",
       "     runtime_s  \n",
       "6          4.6  \n",
       "10         8.3  \n",
       "12         4.2  \n",
       "13         7.8  \n",
       "14         8.0  \n",
       "..         ...  \n",
       "992        4.0  \n",
       "993        6.5  \n",
       "994        5.1  \n",
       "995        4.3  \n",
       "996        5.8  \n",
       "\n",
       "[255 rows x 6 columns]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[~df[\"audio_filename\"].str.contains(\"webm\")]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "be14dc3a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "id                                                      OzrkFekIbxE\n",
       "success                                                        True\n",
       "retry                                                         False\n",
       "meta              {'id': 'OzrkFekIbxE', 'title': '3 - 0-600 x NE...\n",
       "audio_filename                                     OzrkFekIbxE.webm\n",
       "runtime_s                                                       7.0\n",
       "Name: 0, dtype: object"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.iloc[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ccddf1eb",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1c544bc0",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a8419cf6",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6259ea09",
   "metadata": {},
   "outputs": [],
   "source": [
    "check hoa many discard"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "c0c0ebfd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"ERROR: Unable to download API page: <urlopen error Tunnel connection failed: 407 Account is suspended> (caused by URLError(OSError('Tunnel connection failed: 407 Account is suspended')))\""
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.iloc[-100_000][\"fail_message\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "24445621",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"ERROR: Unable to download API page: <urlopen error Tunnel connection failed: 407 Account is suspended> (caused by URLError(OSError('Tunnel connection failed: 407 Account is suspended')))\""
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.iloc[-2][\"fail_message\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "48461a1e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# df[df[\"fail_message\"].str.contains(\"unable to download video data\")]\n",
    "# df[df[\"fail_message\"].str.contains(\"No video formats found\")]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "11718f42",
   "metadata": {},
   "outputs": [],
   "source": [
    "import requests"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "27ac39e0",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "7c6374ee",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Response [200]>"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "out = requests.get(\"http://www.orf.at\")\n",
    "out"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "40dae089",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Response [200]>"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "proxies = {\n",
    "   'http': \"http://brd-customer-hl_98887cab-zone-us_proxy-route_err-block-country-us:3if5he8elfe7@zproxy.lum-superproxy.io:22225\",\n",
    "   'https': \"http://brd-customer-hl_98887cab-zone-us_proxy-route_err-block-country-us:3if5he8elfe7@zproxy.lum-superproxy.io:22225\",\n",
    "}\n",
    "\n",
    "out = requests.get(\"http://www.orf.at\", proxies=proxies)\n",
    "out"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "2a8a5110",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[youtube] _waFxf7yTiI: Downloading webpage\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING: Unable to download webpage: <urlopen error Tunnel connection failed: 407 Account is suspended>\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[youtube] _waFxf7yTiI: Downloading API JSON\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ERROR: Unable to download API page: <urlopen error Tunnel connection failed: 407 Account is suspended> (caused by URLError(OSError('Tunnel connection failed: 407 Account is suspended')))\n"
     ]
    },
    {
     "ename": "DownloadError",
     "evalue": "ERROR: Unable to download API page: <urlopen error Tunnel connection failed: 407 Account is suspended> (caused by URLError(OSError('Tunnel connection failed: 407 Account is suspended')))",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mOSError\u001b[0m                                   Traceback (most recent call last)",
      "\u001b[0;32m~/anaconda3/envs/ml/lib/python3.8/urllib/request.py\u001b[0m in \u001b[0;36mdo_open\u001b[0;34m(self, http_class, req, **http_conn_args)\u001b[0m\n\u001b[1;32m   1353\u001b[0m             \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1354\u001b[0;31m                 h.request(req.get_method(), req.selector, req.data, headers,\n\u001b[0m\u001b[1;32m   1355\u001b[0m                           encode_chunked=req.has_header('Transfer-encoding'))\n",
      "\u001b[0;32m~/anaconda3/envs/ml/lib/python3.8/http/client.py\u001b[0m in \u001b[0;36mrequest\u001b[0;34m(self, method, url, body, headers, encode_chunked)\u001b[0m\n\u001b[1;32m   1255\u001b[0m         \u001b[0;34m\"\"\"Send a complete request to the server.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1256\u001b[0;31m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_send_request\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmethod\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbody\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mheaders\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencode_chunked\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1257\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/ml/lib/python3.8/http/client.py\u001b[0m in \u001b[0;36m_send_request\u001b[0;34m(self, method, url, body, headers, encode_chunked)\u001b[0m\n\u001b[1;32m   1301\u001b[0m             \u001b[0mbody\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_encode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbody\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'body'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1302\u001b[0;31m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mendheaders\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbody\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencode_chunked\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mencode_chunked\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1303\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/ml/lib/python3.8/http/client.py\u001b[0m in \u001b[0;36mendheaders\u001b[0;34m(self, message_body, encode_chunked)\u001b[0m\n\u001b[1;32m   1250\u001b[0m             \u001b[0;32mraise\u001b[0m \u001b[0mCannotSendHeader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1251\u001b[0;31m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_send_output\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmessage_body\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencode_chunked\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mencode_chunked\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1252\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/ml/lib/python3.8/http/client.py\u001b[0m in \u001b[0;36m_send_output\u001b[0;34m(self, message_body, encode_chunked)\u001b[0m\n\u001b[1;32m   1010\u001b[0m         \u001b[0;32mdel\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_buffer\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1011\u001b[0;31m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmsg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1012\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/ml/lib/python3.8/http/client.py\u001b[0m in \u001b[0;36msend\u001b[0;34m(self, data)\u001b[0m\n\u001b[1;32m    950\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mauto_open\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 951\u001b[0;31m                 \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconnect\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    952\u001b[0m             \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/ml/lib/python3.8/http/client.py\u001b[0m in \u001b[0;36mconnect\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m   1417\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1418\u001b[0;31m             \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconnect\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1419\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/ml/lib/python3.8/http/client.py\u001b[0m in \u001b[0;36mconnect\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    926\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_tunnel_host\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 927\u001b[0;31m             \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_tunnel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    928\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/ml/lib/python3.8/http/client.py\u001b[0m in \u001b[0;36m_tunnel\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    904\u001b[0m             \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mclose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 905\u001b[0;31m             raise OSError(\"Tunnel connection failed: %d %s\" % (code,\n\u001b[0m\u001b[1;32m    906\u001b[0m                                                                message.strip()))\n",
      "\u001b[0;31mOSError\u001b[0m: Tunnel connection failed: 407 Account is suspended",
      "\nDuring handling of the above exception, another exception occurred:\n",
      "\u001b[0;31mURLError\u001b[0m                                  Traceback (most recent call last)",
      "\u001b[0;32m~/anaconda3/envs/ml/lib/python3.8/site-packages/youtube_dl/extractor/common.py\u001b[0m in \u001b[0;36m_request_webpage\u001b[0;34m(self, url_or_request, video_id, note, errnote, fatal, data, headers, query, expected_status)\u001b[0m\n\u001b[1;32m    633\u001b[0m         \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 634\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_downloader\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0murlopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0murl_or_request\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    635\u001b[0m         \u001b[0;32mexcept\u001b[0m \u001b[0mtuple\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mexceptions\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/ml/lib/python3.8/site-packages/youtube_dl/YoutubeDL.py\u001b[0m in \u001b[0;36murlopen\u001b[0;34m(self, req)\u001b[0m\n\u001b[1;32m   2299\u001b[0m             \u001b[0mreq\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msanitized_Request\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mreq\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2300\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_opener\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mreq\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_socket_timeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   2301\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/ml/lib/python3.8/urllib/request.py\u001b[0m in \u001b[0;36mopen\u001b[0;34m(self, fullurl, data, timeout)\u001b[0m\n\u001b[1;32m    524\u001b[0m         \u001b[0msys\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maudit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'urllib.Request'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mreq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfull_url\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mreq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mreq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mheaders\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mreq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_method\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 525\u001b[0;31m         \u001b[0mresponse\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_open\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mreq\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    526\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/ml/lib/python3.8/urllib/request.py\u001b[0m in \u001b[0;36m_open\u001b[0;34m(self, req, data)\u001b[0m\n\u001b[1;32m    541\u001b[0m         \u001b[0mprotocol\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mreq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtype\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 542\u001b[0;31m         result = self._call_chain(self.handle_open, protocol, protocol +\n\u001b[0m\u001b[1;32m    543\u001b[0m                                   '_open', req)\n",
      "\u001b[0;32m~/anaconda3/envs/ml/lib/python3.8/urllib/request.py\u001b[0m in \u001b[0;36m_call_chain\u001b[0;34m(self, chain, kind, meth_name, *args)\u001b[0m\n\u001b[1;32m    501\u001b[0m             \u001b[0mfunc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mhandler\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmeth_name\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 502\u001b[0;31m             \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    503\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/ml/lib/python3.8/site-packages/youtube_dl/utils.py\u001b[0m in \u001b[0;36mhttps_open\u001b[0;34m(self, req)\u001b[0m\n\u001b[1;32m   2780\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2781\u001b[0;31m         return self.do_open(functools.partial(\n\u001b[0m\u001b[1;32m   2782\u001b[0m             _create_http_connection, self, conn_class, True),\n",
      "\u001b[0;32m~/anaconda3/envs/ml/lib/python3.8/urllib/request.py\u001b[0m in \u001b[0;36mdo_open\u001b[0;34m(self, http_class, req, **http_conn_args)\u001b[0m\n\u001b[1;32m   1356\u001b[0m             \u001b[0;32mexcept\u001b[0m \u001b[0mOSError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# timeout error\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1357\u001b[0;31m                 \u001b[0;32mraise\u001b[0m \u001b[0mURLError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0merr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1358\u001b[0m             \u001b[0mr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mh\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgetresponse\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mURLError\u001b[0m: <urlopen error Tunnel connection failed: 407 Account is suspended>",
      "\nDuring handling of the above exception, another exception occurred:\n",
      "\u001b[0;31mExtractorError\u001b[0m                            Traceback (most recent call last)",
      "\u001b[0;32m~/anaconda3/envs/ml/lib/python3.8/site-packages/youtube_dl/YoutubeDL.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m    815\u001b[0m             \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 816\u001b[0;31m                 \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    817\u001b[0m             \u001b[0;32mexcept\u001b[0m \u001b[0mGeoRestrictedError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/ml/lib/python3.8/site-packages/youtube_dl/YoutubeDL.py\u001b[0m in \u001b[0;36m__extract_info\u001b[0;34m(self, url, ie, download, extra_info, process)\u001b[0m\n\u001b[1;32m    836\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m__extract_info\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mie\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdownload\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mextra_info\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprocess\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 837\u001b[0;31m         \u001b[0mie_result\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mie\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextract\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0murl\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    838\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mie_result\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m  \u001b[0;31m# Finished already (backwards compatibility; listformats and friends should be moved here)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/ml/lib/python3.8/site-packages/youtube_dl/extractor/common.py\u001b[0m in \u001b[0;36mextract\u001b[0;34m(self, url)\u001b[0m\n\u001b[1;32m    533\u001b[0m                     \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minitialize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 534\u001b[0;31m                     \u001b[0mie_result\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_real_extract\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0murl\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    535\u001b[0m                     \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_x_forwarded_for_ip\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/ml/lib/python3.8/site-packages/youtube_dl/extractor/youtube.py\u001b[0m in \u001b[0;36m_real_extract\u001b[0;34m(self, url)\u001b[0m\n\u001b[1;32m   1681\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mplayer_response\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1682\u001b[0;31m             player_response = self._call_api(\n\u001b[0m\u001b[1;32m   1683\u001b[0m                 'player', {'videoId': video_id}, video_id)\n",
      "\u001b[0;32m~/anaconda3/envs/ml/lib/python3.8/site-packages/youtube_dl/extractor/youtube.py\u001b[0m in \u001b[0;36m_call_api\u001b[0;34m(self, ep, query, video_id, fatal)\u001b[0m\n\u001b[1;32m    292\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 293\u001b[0;31m         return self._download_json(\n\u001b[0m\u001b[1;32m    294\u001b[0m             \u001b[0;34m'https://www.youtube.com/youtubei/v1/%s'\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0mep\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvideo_id\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mvideo_id\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/ml/lib/python3.8/site-packages/youtube_dl/extractor/common.py\u001b[0m in \u001b[0;36m_download_json\u001b[0;34m(self, url_or_request, video_id, note, errnote, transform_source, fatal, encoding, data, headers, query, expected_status)\u001b[0m\n\u001b[1;32m    894\u001b[0m         \"\"\"\n\u001b[0;32m--> 895\u001b[0;31m         res = self._download_json_handle(\n\u001b[0m\u001b[1;32m    896\u001b[0m             \u001b[0murl_or_request\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvideo_id\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnote\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnote\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merrnote\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0merrnote\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/ml/lib/python3.8/site-packages/youtube_dl/extractor/common.py\u001b[0m in \u001b[0;36m_download_json_handle\u001b[0;34m(self, url_or_request, video_id, note, errnote, transform_source, fatal, encoding, data, headers, query, expected_status)\u001b[0m\n\u001b[1;32m    873\u001b[0m         \"\"\"\n\u001b[0;32m--> 874\u001b[0;31m         res = self._download_webpage_handle(\n\u001b[0m\u001b[1;32m    875\u001b[0m             \u001b[0murl_or_request\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvideo_id\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnote\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merrnote\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfatal\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfatal\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/ml/lib/python3.8/site-packages/youtube_dl/extractor/common.py\u001b[0m in \u001b[0;36m_download_webpage_handle\u001b[0;34m(self, url_or_request, video_id, note, errnote, fatal, encoding, data, headers, query, expected_status)\u001b[0m\n\u001b[1;32m    666\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 667\u001b[0;31m         \u001b[0murlh\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_request_webpage\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0murl_or_request\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvideo_id\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnote\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merrnote\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfatal\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mheaders\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mheaders\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mquery\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mquery\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mexpected_status\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mexpected_status\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    668\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0murlh\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/ml/lib/python3.8/site-packages/youtube_dl/extractor/common.py\u001b[0m in \u001b[0;36m_request_webpage\u001b[0;34m(self, url_or_request, video_id, note, errnote, fatal, data, headers, query, expected_status)\u001b[0m\n\u001b[1;32m    651\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0mfatal\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 652\u001b[0;31m                 \u001b[0;32mraise\u001b[0m \u001b[0mExtractorError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0merrmsg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msys\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexc_info\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcause\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0merr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    653\u001b[0m             \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mExtractorError\u001b[0m: Unable to download API page: <urlopen error Tunnel connection failed: 407 Account is suspended> (caused by URLError(OSError('Tunnel connection failed: 407 Account is suspended')))",
      "\nDuring handling of the above exception, another exception occurred:\n",
      "\u001b[0;31mDownloadError\u001b[0m                             Traceback (most recent call last)",
      "\u001b[0;32m/tmp/ipykernel_348179/2920504971.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m     18\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0myoutube_dl\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mYoutubeDL\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mYDL_OPTS\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mydl\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     19\u001b[0m \u001b[0;31m#     timer.start()\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 20\u001b[0;31m     \u001b[0minfo\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mydl\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextract_info\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdownload\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     21\u001b[0m \u001b[0;31m#     timer.cancel()\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/ml/lib/python3.8/site-packages/youtube_dl/YoutubeDL.py\u001b[0m in \u001b[0;36mextract_info\u001b[0;34m(self, url, download, ie_key, extra_info, process, force_generic_extractor)\u001b[0m\n\u001b[1;32m    807\u001b[0m                                     'and will probably not work.')\n\u001b[1;32m    808\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 809\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__extract_info\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mie\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdownload\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mextra_info\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprocess\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    810\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    811\u001b[0m             \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreport_error\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'no suitable InfoExtractor for URL %s'\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0murl\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/ml/lib/python3.8/site-packages/youtube_dl/YoutubeDL.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m    823\u001b[0m                 \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreport_error\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmsg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    824\u001b[0m             \u001b[0;32mexcept\u001b[0m \u001b[0mExtractorError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m  \u001b[0;31m# An error we somewhat expected\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 825\u001b[0;31m                 \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreport_error\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcompat_str\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat_traceback\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    826\u001b[0m             \u001b[0;32mexcept\u001b[0m \u001b[0mMaxDownloadsReached\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    827\u001b[0m                 \u001b[0;32mraise\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/ml/lib/python3.8/site-packages/youtube_dl/YoutubeDL.py\u001b[0m in \u001b[0;36mreport_error\u001b[0;34m(self, message, tb)\u001b[0m\n\u001b[1;32m    627\u001b[0m             \u001b[0m_msg_header\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'ERROR:'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    628\u001b[0m         \u001b[0merror_message\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'%s %s'\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0m_msg_header\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmessage\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 629\u001b[0;31m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrouble\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0merror_message\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    630\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    631\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mreport_file_already_downloaded\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfile_name\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/ml/lib/python3.8/site-packages/youtube_dl/YoutubeDL.py\u001b[0m in \u001b[0;36mtrouble\u001b[0;34m(self, message, tb)\u001b[0m\n\u001b[1;32m    597\u001b[0m             \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    598\u001b[0m                 \u001b[0mexc_info\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msys\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexc_info\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 599\u001b[0;31m             \u001b[0;32mraise\u001b[0m \u001b[0mDownloadError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmessage\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mexc_info\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    600\u001b[0m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_download_retcode\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    601\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mDownloadError\u001b[0m: ERROR: Unable to download API page: <urlopen error Tunnel connection failed: 407 Account is suspended> (caused by URLError(OSError('Tunnel connection failed: 407 Account is suspended')))"
     ]
    }
   ],
   "source": [
    "import youtube_dl\n",
    "US_PROXY = (\n",
    "     \"http://brd-customer-hl_a8c79c59-zone-us_pool:\" +\n",
    "     \"cdojde57liiz@zproxy.lum-superproxy.io:22225\"\n",
    ")\n",
    "\n",
    "YDL_OPTS = {\n",
    "    \"format\": \"worstaudio\",\n",
    "    \"outtmpl\": \"%(id)s.%(ext)s\",\n",
    "    \"proxy\": US_PROXY,\n",
    "}\n",
    "\n",
    "youtube_id = \"_waFxf7yTiI\"\n",
    "\n",
    "url = \"https://www.youtube.com/watch?v=\" + youtube_id\n",
    "\n",
    "# timer = Timer(2.0, _raise)\n",
    "with youtube_dl.YoutubeDL(YDL_OPTS) as ydl:\n",
    "#     timer.start()\n",
    "    info = ydl.extract_info(url, download=True)\n",
    "#     timer.cancel()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "f1e82f53",
   "metadata": {},
   "outputs": [],
   "source": [
    "!rm *.webm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "2f416190",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<class 'youtube_dl.utils.DownloadError'>    87561\n",
       "<class 'FileNotFoundError'>                   108\n",
       "Name: fail_type, dtype: int64"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[\"fail_type\"].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d099780f",
   "metadata": {},
   "outputs": [],
   "source": [
    "ERROR: unable to download video data: HTTP Error 403: Forbidden                                                                                                                                                                                                        13107\n",
    "ERROR: No video formats found; please report this issue on https://yt-dl.org/bug . Make sure you are using the latest version; see  https://yt-dl.org/update  on how to update. Be sure to call youtube-dl with the --verbose flag and include its complete output.    12864"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "81c1bca1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>fail_type</th>\n",
       "      <th>fail_message</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>968</th>\n",
       "      <td>UHF8kHKB7B8</td>\n",
       "      <td>&lt;class 'youtube_dl.utils.DownloadError'&gt;</td>\n",
       "      <td>ERROR: No video formats found; please report t...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>969</th>\n",
       "      <td>0e_jDvsCZP8</td>\n",
       "      <td>&lt;class 'youtube_dl.utils.DownloadError'&gt;</td>\n",
       "      <td>ERROR: No video formats found; please report t...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>985</th>\n",
       "      <td>EV_Nqp3sgGE</td>\n",
       "      <td>&lt;class 'youtube_dl.utils.DownloadError'&gt;</td>\n",
       "      <td>ERROR: No video formats found; please report t...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>986</th>\n",
       "      <td>Cid9cFd02i8</td>\n",
       "      <td>&lt;class 'youtube_dl.utils.DownloadError'&gt;</td>\n",
       "      <td>ERROR: No video formats found; please report t...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>998</th>\n",
       "      <td>LhI3LSn7uus</td>\n",
       "      <td>&lt;class 'youtube_dl.utils.DownloadError'&gt;</td>\n",
       "      <td>ERROR: No video formats found; please report t...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>87608</th>\n",
       "      <td>MKm0i5YJquk</td>\n",
       "      <td>&lt;class 'youtube_dl.utils.DownloadError'&gt;</td>\n",
       "      <td>ERROR: No video formats found; please report t...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>87649</th>\n",
       "      <td>9Tq3gsVBCMU</td>\n",
       "      <td>&lt;class 'youtube_dl.utils.DownloadError'&gt;</td>\n",
       "      <td>ERROR: No video formats found; please report t...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>87656</th>\n",
       "      <td>Vl4icod-FLo</td>\n",
       "      <td>&lt;class 'youtube_dl.utils.DownloadError'&gt;</td>\n",
       "      <td>ERROR: No video formats found; please report t...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>87662</th>\n",
       "      <td>3UK2ny9SrXM</td>\n",
       "      <td>&lt;class 'youtube_dl.utils.DownloadError'&gt;</td>\n",
       "      <td>ERROR: No video formats found; please report t...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>87668</th>\n",
       "      <td>DPsenU-4TBo</td>\n",
       "      <td>&lt;class 'youtube_dl.utils.DownloadError'&gt;</td>\n",
       "      <td>ERROR: No video formats found; please report t...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>12864 rows × 3 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                id                                 fail_type  \\\n",
       "968    UHF8kHKB7B8  <class 'youtube_dl.utils.DownloadError'>   \n",
       "969    0e_jDvsCZP8  <class 'youtube_dl.utils.DownloadError'>   \n",
       "985    EV_Nqp3sgGE  <class 'youtube_dl.utils.DownloadError'>   \n",
       "986    Cid9cFd02i8  <class 'youtube_dl.utils.DownloadError'>   \n",
       "998    LhI3LSn7uus  <class 'youtube_dl.utils.DownloadError'>   \n",
       "...            ...                                       ...   \n",
       "87608  MKm0i5YJquk  <class 'youtube_dl.utils.DownloadError'>   \n",
       "87649  9Tq3gsVBCMU  <class 'youtube_dl.utils.DownloadError'>   \n",
       "87656  Vl4icod-FLo  <class 'youtube_dl.utils.DownloadError'>   \n",
       "87662  3UK2ny9SrXM  <class 'youtube_dl.utils.DownloadError'>   \n",
       "87668  DPsenU-4TBo  <class 'youtube_dl.utils.DownloadError'>   \n",
       "\n",
       "                                            fail_message  \n",
       "968    ERROR: No video formats found; please report t...  \n",
       "969    ERROR: No video formats found; please report t...  \n",
       "985    ERROR: No video formats found; please report t...  \n",
       "986    ERROR: No video formats found; please report t...  \n",
       "998    ERROR: No video formats found; please report t...  \n",
       "...                                                  ...  \n",
       "87608  ERROR: No video formats found; please report t...  \n",
       "87649  ERROR: No video formats found; please report t...  \n",
       "87656  ERROR: No video formats found; please report t...  \n",
       "87662  ERROR: No video formats found; please report t...  \n",
       "87668  ERROR: No video formats found; please report t...  \n",
       "\n",
       "[12864 rows x 3 columns]"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[df[\"fail_message\"].str.contains(\"No video formats found\")]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "ff5e749e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "ERROR: Video unavailable\\nThis video is not available                                                                                                                                                                                                                  20732\n",
       "ERROR: Video unavailable                                                                                                                                                                                                                                               15072\n",
       "ERROR: Private video\\nSign in if you've been granted access to this video                                                                                                                                                                                              13791\n",
       "ERROR: unable to download video data: HTTP Error 403: Forbidden                                                                                                                                                                                                        13107\n",
       "ERROR: No video formats found; please report this issue on https://yt-dl.org/bug . Make sure you are using the latest version; see  https://yt-dl.org/update  on how to update. Be sure to call youtube-dl with the --verbose flag and include its complete output.    12864\n",
       "ERROR: Video unavailable\\nThis video is no longer available because the YouTube account associated with this video has been terminated.                                                                                                                                 5621\n",
       "ERROR: Video unavailable\\nThe uploader has not made this video available in your country                                                                                                                                                                                2313\n",
       "ERROR: Sign in to confirm your age\\nThis video may be inappropriate for some users.                                                                                                                                                                                     1379\n",
       "ERROR: Video unavailable\\nThis video has been removed by the uploader                                                                                                                                                                                                    168\n",
       "ERROR: Video unavailable\\nThis video contains content from SME, who has blocked it in your country on copyright grounds                                                                                                                                                  164\n",
       "ERROR: Video unavailable\\nThis video contains content from vidsum Music, who has blocked it on copyright grounds                                                                                                                                                         160\n",
       "ERROR: Video unavailable\\nThe uploader has not made this video available.                                                                                                                                                                                                122\n",
       "ERROR: This video is only available to Music Premium members                                                                                                                                                                                                             101\n",
       "ERROR: Video unavailable\\nThis video contains content from WMG, who has blocked it in your country on copyright grounds                                                                                                                                                   79\n",
       "ERROR: Video unavailable\\nThis video contains content from The Orchard Music, who has blocked it in your country on copyright grounds                                                                                                                                     63\n",
       "ERROR: Video unavailable\\nThis video contains content from UMG, who has blocked it in your country on copyright grounds                                                                                                                                                   61\n",
       "ERROR: giving up after 0 fragment retries                                                                                                                                                                                                                                 60\n",
       "ERROR: Video unavailable\\nThis video contains content from WMG, who has blocked it on copyright grounds                                                                                                                                                                   42\n",
       "ERROR: Video unavailable\\nThis video is no longer available due to a copyright claim by WMG                                                                                                                                                                               39\n",
       "ERROR: requested format not available                                                                                                                                                                                                                                     38\n",
       "Name: fail_message, dtype: int64"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[\"fail_message\"].value_counts().iloc[:20]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "cbaad943",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'id': 'IsNfjhXIY3M',\n",
       " 'success': False,\n",
       " 'fail_type': \"<class 'youtube_dl.utils.DownloadError'>\",\n",
       " 'fail_message': 'ERROR: Video unavailable',\n",
       " 'runtime_s': 0.5}"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "7c7ae8f6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:>"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "df[df[\"success\"]][\"runtime_s\"].clip(upper=60).hist(bins=50)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "97164ae0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:>"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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ZSkUCpHTVWbOnKnDhw+ro6PD/po8ebIeffRRdXR06NOf/jR53UAoFNLx48c1ZswY/m5dw7Rp04b8Gozf//739gdsj3hmt/3lzveIxsZGKzEx0dqyZYt17Ngxq6qqykpNTbX+8Ic/jPSpjbi+vj7r7bfftt5++21LkrVu3Trr7bfftk6dOmVZlmU999xzltvttn75y19ahw8ftr71rW9ZY8aMsXp7e0f4zO+8f/7nf7bcbrf1xhtvWJ2dnfbX5cuX7Rny+sDy5cutN9980zp58qT1u9/9zvr+979vfexjH7MCgYBlWeQ0nA+/68qyyOvDqqurrTfeeMN69913rf3791vl5eVWWlqa/d9zsop08OBBKyEhwVq1apX1zjvvWNu3b7dSUlKshoYGe2YkM6PoxNC//du/Wffff7+VlJRk/f3f/739luB73W9+8xtL0pCvxx57zLKsD956+IMf/MDyeDyWy+WyvvKVr1iHDx8e2ZMeIdfKSZL10ksv2TPk9YF//Md/tL/fPvnJT1ozZ860S45lkdNwri465PW/vvnNb1pjxoyxEhMTLa/Xa82fP986evSovZ+shvqv//ovq6CgwHK5XNbnPvc568UXX4zYP5KZxVmWZd3+60YAAAB3Hq/RAQAAxqLoAAAAY1F0AACAsSg6AADAWBQdAABgLIoOAAAwFkUHAAAYi6IDAACMRdEBAADGougAAABjUXQAAICxKDoAAMBY/w82h72r9cYpRwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "df[\"runtime_s\"].clip(upper=60).hist(bins=50)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "0b414e04",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>success</th>\n",
       "      <th>runtime_s</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>43033</th>\n",
       "      <td>MEzU1HvBo6Y</td>\n",
       "      <td>True</td>\n",
       "      <td>670.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>48761</th>\n",
       "      <td>8HDDlBRNatE</td>\n",
       "      <td>True</td>\n",
       "      <td>651.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75144</th>\n",
       "      <td>4IhFCmd9yuo</td>\n",
       "      <td>True</td>\n",
       "      <td>2891.8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75146</th>\n",
       "      <td>NTcI1qxLTJ4</td>\n",
       "      <td>True</td>\n",
       "      <td>1326.6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>121272</th>\n",
       "      <td>Ibh7muFoB_0</td>\n",
       "      <td>True</td>\n",
       "      <td>605.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>123889</th>\n",
       "      <td>d__zr3uwBRA</td>\n",
       "      <td>True</td>\n",
       "      <td>1003.6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>168154</th>\n",
       "      <td>yr0hle_dRRc</td>\n",
       "      <td>True</td>\n",
       "      <td>525.7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>204249</th>\n",
       "      <td>ywpcPjM17wI</td>\n",
       "      <td>True</td>\n",
       "      <td>1603.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 id  success  runtime_s\n",
       "43033   MEzU1HvBo6Y     True      670.3\n",
       "48761   8HDDlBRNatE     True      651.2\n",
       "75144   4IhFCmd9yuo     True     2891.8\n",
       "75146   NTcI1qxLTJ4     True     1326.6\n",
       "121272  Ibh7muFoB_0     True      605.5\n",
       "123889  d__zr3uwBRA     True     1003.6\n",
       "168154  yr0hle_dRRc     True      525.7\n",
       "204249  ywpcPjM17wI     True     1603.0"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[df[\"runtime_s\"] >= 500]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "c412ea19",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[youtube] 4IhFCmd9yuo: Downloading webpage\n",
      "[download] Destination: 4IhFCmd9yuo.webm\n",
      "[download] 100% of 35.87MiB in 00:1422MiB/s ETA 00:005\n"
     ]
    }
   ],
   "source": [
    "US_PROXY = (\n",
    "     \"http://brd-customer-hl_a8c79c59-zone-us_pool:\" +\n",
    "     \"cdojde57liiz@zproxy.lum-superproxy.io:22225\"\n",
    ")\n",
    "\n",
    "YDL_OPTS = {\n",
    "    \"format\": \"worstaudio\",\n",
    "    \"outtmpl\": \"%(id)s.%(ext)s\",\n",
    "#     \"writesubtitles\": True,\n",
    "#     \"allsubtitles\": True,\n",
    "#     \"subtitlesformat\": \"best\",\n",
    "    \"proxy\": US_PROXY,\n",
    "#     \"socket_timeout\": 2.0,\n",
    "}\n",
    "\n",
    "youtube_id = \"4IhFCmd9yuo\"\n",
    "\n",
    "url = \"https://www.youtube.com/watch?v=\" + youtube_id\n",
    "\n",
    "# timer = Timer(2.0, _raise)\n",
    "with youtube_dl.YoutubeDL(YDL_OPTS) as ydl:\n",
    "#     timer.start()\n",
    "    info = ydl.extract_info(url, download=True)\n",
    "#     timer.cancel()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "d97df836",
   "metadata": {},
   "outputs": [],
   "source": [
    "!rm jIQ6UV2onyI.webm.part"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "5823f5a6",
   "metadata": {},
   "outputs": [],
   "source": [
    "from threading import Timer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "8ae54d66",
   "metadata": {},
   "outputs": [],
   "source": [
    "def _raise():\n",
    "    raise ValueError(\"blabla\")\n",
    "    \n",
    "timer = Timer(3.0, _raise)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "cda53963",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Exception in thread Thread-5:\n",
      "Traceback (most recent call last):\n",
      "  File \"/home/georg/anaconda3/envs/ml/lib/python3.8/threading.py\", line 932, in _bootstrap_inner\n",
      "    self.run()\n",
      "  File \"/home/georg/anaconda3/envs/ml/lib/python3.8/threading.py\", line 1254, in run\n",
      "    self.function(*self.args, **self.kwargs)\n",
      "  File \"/tmp/ipykernel_13152/2362935068.py\", line 2, in _raise\n",
      "ValueError: blabla\n"
     ]
    }
   ],
   "source": [
    "timer.start()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9f47c3a7",
   "metadata": {},
   "outputs": [],
   "source": [
    "from threading import Timer\n",
    "\n",
    "def run(cmd, timeout_sec):\n",
    "    proc = Popen(cmd.split(), stdout=PIPE, stderr=PIPE)\n",
    "    timer = Timer(timeout_sec, proc.kill)\n",
    "    try:\n",
    "        timer.start()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "85ab3343",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Untitled.ipynb\t\t\t get_all_audio.ipynb\r\n",
      "german_rap_get_youtube.ipynb\t get_all_lyrics.ipynb\r\n",
      "german_rap_prepare_corpus.ipynb\r\n"
     ]
    }
   ],
   "source": [
    "!ls"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "240495cd",
   "metadata": {},
   "outputs": [],
   "source": [
    "from threading import Timer, Thread"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "df54de87",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "524c6bbc",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ta\n",
      "ta\n",
      "ta\n",
      "ta\n",
      "ta\n"
     ]
    }
   ],
   "source": [
    "from threading import Timer, Thread\n",
    "import time\n",
    "\n",
    "def foo():\n",
    "    for _ in range(5):\n",
    "        time.sleep(1)\n",
    "        print(\"ta\")\n",
    "\n",
    "t = Thread(target=foo)\n",
    "timer = Timer(2.0, t.join)\n",
    "t.start()\n",
    "timer.cancel()\n",
    "t.join()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a2633233",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "3b541a16",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      ".\n",
      "True\n",
      "other\n"
     ]
    }
   ],
   "source": [
    "import time\n",
    "import signal\n",
    "from contextlib import contextmanager\n",
    "\n",
    "class TimeoutException(Exception): pass\n",
    "\n",
    "@contextmanager\n",
    "def time_limit(seconds):\n",
    "    seconds = int(round(seconds))\n",
    "    def signal_handler(signum, frame):\n",
    "        raise TimeoutException(\"Timed out!\")\n",
    "    signal.signal(signal.SIGALRM, signal_handler)\n",
    "    signal.alarm(seconds)\n",
    "    try:\n",
    "        yield\n",
    "    finally:\n",
    "        signal.alarm(0)\n",
    "\n",
    "def foo():\n",
    "    for _ in range(5):\n",
    "        time.sleep(1)\n",
    "        print(\".\")\n",
    "\n",
    "timeout_s = 2.0\n",
    "try:\n",
    "#     raise ValueError(\"\")\n",
    "    with time_limit(timeout_s):\n",
    "        foo()\n",
    "# except TimeoutException as e:\n",
    "#     print(\"Timed out!\")\n",
    "except Exception as e:\n",
    "    print(\"TimeoutException\" in str(type(e)))\n",
    "    print(\"other\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e0dbe978",
   "metadata": {},
   "outputs": [],
   "source": [
    "# check which types of errors we shoult retry on"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "865ef834",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9d500803",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b06efd68",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "id": "0cad28cf",
   "metadata": {},
   "outputs": [],
   "source": [
    "import threading\n",
    "import ctypes\n",
    "import time\n",
    "  \n",
    "class thread_with_exception(threading.Thread):\n",
    "    def __init__(self, *args, **kwargs):\n",
    "        threading.Thread.__init__(self, *args, **kwargs)\n",
    "             \n",
    "    def run(self):\n",
    "        for _ in range(5):\n",
    "            time.sleep(1)\n",
    "            print(\"running...\")\n",
    "          \n",
    "    def get_id(self):\n",
    "        if hasattr(self, '_thread_id'):\n",
    "            return self._thread_id\n",
    "        for thread_id, thread in threading._active.items():\n",
    "            if thread is self:\n",
    "                return thread_id\n",
    "  \n",
    "    def raise_exception(self):\n",
    "        thread_id = self.get_id()\n",
    "        res = ctypes.pythonapi.PyThreadState_SetAsyncExc(thread_id, ctypes.py_object(SystemExit))\n",
    "        print(res)\n",
    "        if res > 1:\n",
    "            ctypes.pythonapi.PyThreadState_SetAsyncExc(thread_id, 0)\n",
    "            print('Exception raise failure')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "id": "c351ccb2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "py_object(<class 'SystemExit'>)"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ctypes.py_object(SystemExit)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "id": "1c1621a8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "running...\n",
      "running...\n",
      "running...\n",
      "running...\n",
      "running...\n"
     ]
    }
   ],
   "source": [
    "t = thread_with_exception()#target=foo)\n",
    "t.start()\n",
    "time.sleep(0.5)\n",
    "t.raise_exception()\n",
    "t.join()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8d9405a7",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c4ad3bfd",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b738afbe",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "72e795c9",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 2705405/2705405 [01:16<00:00, 35332.60it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2705405 items loaded.\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "l = []\n",
    "with open(os.path.join(DATA_DIR, \"song_details_with_youtube.jsonl\")) as f:\n",
    "    for line in tqdm.tqdm(f, total=2705405):\n",
    "        line = line.strip()\n",
    "        if len(line) == 0:\n",
    "            continue\n",
    "        l.append(json.loads(line)[\"lang\"])\n",
    "print(len(l), \"items loaded.\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0bf196b1",
   "metadata": {},
   "outputs": [],
   "source": [
    "s.value_counts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "90608528",
   "metadata": {},
   "outputs": [],
   "source": [
    "# s = pd.Series(l)\n",
    "# vc = (s.value_counts(normalize=True) * 100).round(1)\n",
    "# vc[vc > 0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e7ca1289",
   "metadata": {},
   "outputs": [],
   "source": [
    "for row vc[vc > 0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "758e5d09",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f8073f87",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "42d4b214",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
