{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "c8c338f7",
   "metadata": {},
   "outputs": [],
   "source": [
    "# !mv German.zip /mnt/data-ssd-1/data/private/customer/speechly/2022-11-06_multilingual-50h/external"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 445,
   "id": "beb1c391",
   "metadata": {},
   "outputs": [],
   "source": [
    "import regex as re\n",
    "import os\n",
    "import json\n",
    "import string\n",
    "\n",
    "import textract\n",
    "import docx2txt\n",
    "from striprtf.striprtf import rtf_to_text\n",
    "import pandas as pd\n",
    "import odf \n",
    "\n",
    "from suno_utils.web.harvest import get_filename\n",
    "from suno_utils.utils.text import normalize_whitespace\n",
    "\n",
    "BASE_DIR = \"/mnt/data-ssd-1/data/private/customer/speechly/2022-11-06_multilingual-50h/external\"\n",
    "GCP_DIR = \"/mnt/data-ssd-1/data/private/customer/speechly/gcp_bucket\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 488,
   "id": "27958c9a",
   "metadata": {},
   "outputs": [],
   "source": [
    "def _tag_repl(m):\n",
    "    s = m.group()[1:-1]\n",
    "    s = normalize_whitespace(s)#.lower()\n",
    "#     s = s.replace(\" \", \"_\")\n",
    "    if len(s) == 0 or \":\" in s:\n",
    "        return \"\"\n",
    "    if s[0] == \"<\":\n",
    "        return s\n",
    "    return f\"[{s}]\"\n",
    "\n",
    "# speechly style choices\n",
    "repeat_ptn = r\"\"\n",
    "for a, b in zip(string.ascii_uppercase, string.ascii_lowercase):\n",
    "    repeat_ptn += r\"[\" + a + b + r\"]\" + b + \"{2,}|\"\n",
    "repeat_ptn = repeat_ptn[:-1]\n",
    "\n",
    "def _repeat_repl(m):\n",
    "    return m.group()[:2]\n",
    "\n",
    "def get_metas(expected_ids, transcript_dir, lang_code):\n",
    "    if lang_code not in (\"es\", \"fr\", \"pt\", \"de\"):\n",
    "        raise ValueError(f\"lang_code `{lang_code}` not supported.\")\n",
    "    fns = []\n",
    "    seen_ids = set()\n",
    "    duplicate_ids = set()\n",
    "    extra_ids = set()\n",
    "    for fn in os.listdir(transcript_dir):\n",
    "        _id = fn.split(\".\")[0]\n",
    "        if _id not in expected_ids:\n",
    "            if _id.strip() in expected_ids:\n",
    "                _id = _id.strip()\n",
    "            elif \"-\" + _id in expected_ids:\n",
    "                _id = \"-\" + _id\n",
    "            elif _id == \"7004616298617507018\":\n",
    "                _id = \"7004616298617507078\"\n",
    "            elif _id == \"_ifXxXfd\":\n",
    "                _id = \"_ifXxXfd-Gc\"\n",
    "            elif _id == \"agld5Wn6qvs\":\n",
    "                _id = \"agId5Wn6qvs\"\n",
    "            elif _id == \"j2oZwMiXfhw]\":\n",
    "                _id = \"j2oZwMiXfhw\"\n",
    "        if _id not in expected_ids:\n",
    "            extra_ids.add(_id)\n",
    "            continue\n",
    "        if _id in seen_ids:\n",
    "            duplicate_ids.add(_id)\n",
    "            continue\n",
    "        fns.append((_id, fn))\n",
    "        seen_ids.add(_id)\n",
    "    missing_ids = expected_ids - set([_id for _id, _ in fns])\n",
    "    if len(missing_ids) > 0:\n",
    "        print(\"missing ids:\", missing_ids)\n",
    "    if len(extra_ids) > 0:\n",
    "        print(\"extra ids:\", extra_ids)\n",
    "    if len(duplicate_ids) > 0:\n",
    "        print(\"duplicate ids:\", duplicate_ids)\n",
    "    metas = []\n",
    "    for _id, fn in fns:\n",
    "        fp = os.path.join(transcript_dir, fn)\n",
    "        text = None\n",
    "        if fn.endswith(\".docx\"):\n",
    "            try:\n",
    "                text = docx2txt.process(fp)\n",
    "            except:\n",
    "                print(f\"{fp} broken\")\n",
    "        elif fn.endswith(\".doc\"):\n",
    "            try:\n",
    "                text = textract.process(fp).decode(\"utf8\")\n",
    "            except:\n",
    "                print(f\"{fp} broken\")\n",
    "        elif fn.endswith(\".odt\"):\n",
    "            try:\n",
    "                textdoc = odf.opendocument.load(fp)\n",
    "                allparas = textdoc.getElementsByType(odf.text.P)\n",
    "                text = \"\\n\".join([odf.teletype.extractText(p) for p in allparas])\n",
    "            except:\n",
    "                print(f\"{fp} broken\")\n",
    "        elif fn.endswith(\".rtf\"):\n",
    "            with open(fp) as f:\n",
    "                text = f.read()\n",
    "            # apple text edit escapes stuff\n",
    "            text = text.replace(\"\\\\'e8\", \"è\")\n",
    "            text = text.replace(\"\\\\'ea\", \"ê\")\n",
    "            text = text.replace(\"\\\\'e7\", \"ç\")\n",
    "            text = text.replace(\"\\\\'e0\", \"à\")\n",
    "            text = rtf_to_text(text, errors=\"ignore\")\n",
    "#             print(fp)\n",
    "#             break\n",
    "        else:\n",
    "            raise ValueError(\"extension `{}` not found.\".format(fn.split(\".\")[-1]))\n",
    "        if text is not None:\n",
    "            lines = []\n",
    "            for line in text.split(\"\\n\"):\n",
    "                # rando mistakes\n",
    "                line = line.replace(f\"<f:{lang_code}>\", \" \")\n",
    "                line = re.sub(r\"[0-9]{2}\\:[0-9]{2}\\:[0-9]{2}\", \" \", line)\n",
    "                # speaker stuff\n",
    "                line = re.sub(r\"\\s*[A-Z][a-zA-Z0-9\\s]{,15}\\s*\\:\", \" \", line)\n",
    "                # meta tags\n",
    "                line = re.sub(r\"\\[.*?\\]\", _tag_repl, line)\n",
    "                line = line.replace(\"(\", \"[\").replace(\")\", \"]\")\n",
    "                line = line.replace(\"{\", \"[\").replace(\"}\", \"]\")\n",
    "                # repetitions\n",
    "                line = re.sub(repeat_ptn, _repeat_repl, line)\n",
    "                line = re.sub(r\"\\!{2,}\", \"!\", line)\n",
    "                line = re.sub(r\"\\?{2,}\", \"?\", line)\n",
    "                # trim and add\n",
    "                line = normalize_whitespace(line)\n",
    "                if len(line) == 0:\n",
    "                    continue\n",
    "                if re.match(r\"speaker\\s*[0-9]*\\s*\\:?\", line.lower()):\n",
    "                    continue\n",
    "                lines.append(line)\n",
    "            if len(lines) > 0 and (\n",
    "                (len(lines[0].split()) == 1 and re.match(r\"[a-zA-Z0-9]\", lines[0][-1])) or\n",
    "                lines[0].strip().endswith(\".wav\") or\n",
    "                re.search(r\"[0-9]{15,}\", lines[0])\n",
    "            ):\n",
    "                lines = lines[1:]\n",
    "            if len(lines) > 0 and len(lines[0].split()) == 1 and lines[0].strip().endswith(\".wav\"):\n",
    "                lines = lines[1:]\n",
    "            text = \"\\n\".join(lines)\n",
    "            # newline and hesitations\n",
    "            text = re.sub(r\"([a-z])\\n([A-Z])\", \"\\\\1 -- \\\\2\", text)\n",
    "            text = re.sub(r\"\\.\\.+\", \" -- \", text)\n",
    "            text = text.replace(\"…\", \" -- \")\n",
    "            text = text.strip(\" -\")\n",
    "            text = re.sub(r\"[\\s\\-]*\\-\\-[\\s\\-]*\", \" -- \", text)\n",
    "            text = text.replace(\" -- ]\", \"]\")\n",
    "            text = text.replace(\"[ -- \", \"[\")\n",
    "            # other messups\n",
    "            text = re.sub(r\"\\s+([\\,\\.\\!\\?\\:\\;])\", \"\\\\1\", text)\n",
    "            text = text.replace(\"[u]\", \"<u>\")\n",
    "            text = text.replace(\"[inaudible]\", \"<u>\")\n",
    "            text = text.replace(\"[END OF TRANSCRIPT]\", \"\")\n",
    "            text = re.sub(r\"Speaker[\\s0-9]*\\:\", \" \", text)\n",
    "            text = normalize_whitespace(text)\n",
    "            #normalize\n",
    "            text_norm = text.lower()\n",
    "            text_norm = re.sub(r\"(?![\\'\\-\\<\\>\\[\\]])\\p{P}+\", \" \", text_norm)\n",
    "            text_norm = re.sub(r\"--\", \" \", text_norm)\n",
    "            text_norm = normalize_whitespace(text_norm)\n",
    "        metas.append({\n",
    "            \"id\": _id,\n",
    "            \"filepath\": fp,\n",
    "            \"text\": text,\n",
    "            \"text_norm\": text_norm,\n",
    "        })\n",
    "    return metas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 489,
   "id": "065036af",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "de youtube\n",
      "----------\n",
      "de tiktok\n",
      "----------\n",
      "fr youtube\n",
      "----------\n",
      "fr tiktok\n",
      "----------\n",
      "es youtube\n",
      "----------\n",
      "es tiktok\n",
      "----------\n",
      "pt youtube\n",
      "----------\n",
      "pt tiktok\n",
      "----------\n"
     ]
    }
   ],
   "source": [
    "print(\"de youtube\")\n",
    "expected_ids = set([fn.split(\".\")[0] for fn in os.listdir(os.path.join(GCP_DIR, \"youtube/multilingual-50h/de\"))])\n",
    "transcript_dir = os.path.join(BASE_DIR, \"de\", \"YouTube\")\n",
    "de_youtube_metas = get_metas(expected_ids, transcript_dir, \"de\")\n",
    "print(\"-\"*10)\n",
    "\n",
    "print(\"de tiktok\")\n",
    "expected_ids = set([fn.split(\".\")[0] for fn in os.listdir(os.path.join(GCP_DIR, \"titktok/multilingual-50h/de\"))])\n",
    "transcript_dir = os.path.join(BASE_DIR, \"de\", \"TikTok\")\n",
    "de_tiktok_metas = get_metas(expected_ids, transcript_dir, \"de\")\n",
    "print(\"-\"*10)\n",
    "\n",
    "print(\"fr youtube\")\n",
    "expected_ids = set([fn.split(\".\")[0] for fn in os.listdir(os.path.join(GCP_DIR, \"youtube/multilingual-50h/fr\"))])\n",
    "transcript_dir = os.path.join(BASE_DIR, \"fr\", \"YouTube\")\n",
    "fr_youtube_metas = get_metas(expected_ids, transcript_dir, \"fr\")\n",
    "print(\"-\"*10)\n",
    "\n",
    "print(\"fr tiktok\")\n",
    "expected_ids = set([fn.split(\".\")[0] for fn in os.listdir(os.path.join(GCP_DIR, \"titktok/multilingual-50h/fr\"))])\n",
    "transcript_dir = os.path.join(BASE_DIR, \"fr\", \"TikTok\")\n",
    "fr_tiktok_metas = get_metas(expected_ids, transcript_dir, \"fr\")\n",
    "print(\"-\"*10)\n",
    "\n",
    "print(\"es youtube\")\n",
    "expected_ids = set([fn.split(\".\")[0] for fn in os.listdir(os.path.join(GCP_DIR, \"youtube/multilingual-50h/es\"))])\n",
    "transcript_dir = os.path.join(BASE_DIR, \"es\", \"YouTube\")\n",
    "es_youtube_metas = get_metas(expected_ids, transcript_dir, \"es\")\n",
    "print(\"-\"*10)\n",
    "\n",
    "print(\"es tiktok\")\n",
    "expected_ids = set([fn.split(\".\")[0] for fn in os.listdir(os.path.join(GCP_DIR, \"titktok/multilingual-50h/es\"))])\n",
    "transcript_dir = os.path.join(BASE_DIR, \"es\", \"TikTok\")\n",
    "es_tiktok_metas = get_metas(expected_ids, transcript_dir, \"es\")\n",
    "print(\"-\"*10)\n",
    "\n",
    "print(\"pt youtube\")\n",
    "expected_ids = set([fn.split(\".\")[0] for fn in os.listdir(os.path.join(GCP_DIR, \"youtube/multilingual-50h/pt\"))])\n",
    "transcript_dir = os.path.join(BASE_DIR, \"pt\", \"YouTube\")\n",
    "pt_youtube_metas = get_metas(expected_ids, transcript_dir, \"pt\")\n",
    "print(\"-\"*10)\n",
    "\n",
    "print(\"pt tiktok\")\n",
    "expected_ids = set([fn.split(\".\")[0] for fn in os.listdir(os.path.join(GCP_DIR, \"titktok/multilingual-50h/pt\"))])\n",
    "transcript_dir = os.path.join(BASE_DIR, \"pt\", \"TikTok\")\n",
    "pt_tiktok_metas = get_metas(expected_ids, transcript_dir, \"pt\")\n",
    "print(\"-\"*10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 490,
   "id": "31626372",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# es_tiktok_metas[:3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 491,
   "id": "d4563d39",
   "metadata": {},
   "outputs": [],
   "source": [
    "# de_tiktok_metas[:3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 492,
   "id": "a3e63f04",
   "metadata": {},
   "outputs": [],
   "source": [
    "# de_youtube_metas[:3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 495,
   "id": "214cda8b",
   "metadata": {},
   "outputs": [],
   "source": [
    "def write_file(metas, fp):\n",
    "    with open(fp, \"w\") as f:\n",
    "        for m in metas:\n",
    "            mm = {\n",
    "                \"id\": m[\"id\"],\n",
    "                \"transcript\": m[\"text_norm\"],\n",
    "                \"transcript_full\": m[\"text\"],\n",
    "            }\n",
    "            f.write(json.dumps(mm, ensure_ascii=False) + \"\\n\")\n",
    "\n",
    "write_file(de_youtube_metas, os.path.join(BASE_DIR, \"delivery\", \"de_youtube_delivery_meta.jsonl\"))\n",
    "write_file(de_tiktok_metas, os.path.join(BASE_DIR, \"delivery\", \"de_tiktok_delivery_meta.jsonl\"))\n",
    "write_file(fr_youtube_metas, os.path.join(BASE_DIR, \"delivery\", \"fr_youtube_delivery_meta.jsonl\"))\n",
    "write_file(fr_tiktok_metas, os.path.join(BASE_DIR, \"delivery\", \"fr_tiktok_delivery_meta.jsonl\"))\n",
    "write_file(es_youtube_metas, os.path.join(BASE_DIR, \"delivery\", \"es_youtube_delivery_meta.jsonl\"))\n",
    "write_file(es_tiktok_metas, os.path.join(BASE_DIR, \"delivery\", \"es_tiktok_delivery_meta.jsonl\"))\n",
    "write_file(pt_youtube_metas, os.path.join(BASE_DIR, \"delivery\", \"pt_youtube_delivery_meta.jsonl\"))\n",
    "write_file(pt_tiktok_metas, os.path.join(BASE_DIR, \"delivery\", \"pt_tiktok_delivery_meta.jsonl\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 245,
   "id": "b664192a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Notes\n",
    "\n",
    "# _D2A6QLxghM: song lyrics not sonsistentlyn transcribed \n",
    "# _D2A6QLxghM: meta tags wrong like [inaudible] in german\n",
    "# 7042242912641486085: terrible german"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "39a96dc4",
   "metadata": {},
   "source": [
    "gsutil -m cp /mnt/data-ssd-1/data/private/customer/speechly/2022-11-06_multilingual-50h/external/delivery/de_youtube_delivery_meta.jsonl gs://speechly-suno-wtyfeusyax/youtube/output/de_annotations.jsonl\n",
    "\n",
    "gsutil -m cp /mnt/data-ssd-1/data/private/customer/speechly/2022-11-06_multilingual-50h/external/delivery/de_tiktok_delivery_meta.jsonl gs://speechly-suno-wtyfeusyax/titktok/output/de_annotations.jsonl\n",
    "\n",
    "\n",
    "gsutil -m cp /mnt/data-ssd-1/data/private/customer/speechly/2022-11-06_multilingual-50h/external/delivery/fr_youtube_delivery_meta.jsonl gs://speechly-suno-wtyfeusyax/youtube/output/fr_annotations.jsonl\n",
    "\n",
    "gsutil -m cp /mnt/data-ssd-1/data/private/customer/speechly/2022-11-06_multilingual-50h/external/delivery/fr_tiktok_delivery_meta.jsonl gs://speechly-suno-wtyfeusyax/titktok/output/fr_annotations.jsonl\n",
    "\n",
    "\n",
    "gsutil -m cp /mnt/data-ssd-1/data/private/customer/speechly/2022-11-06_multilingual-50h/external/delivery/es_youtube_delivery_meta.jsonl gs://speechly-suno-wtyfeusyax/youtube/output/es_annotations.jsonl\n",
    "\n",
    "gsutil -m cp /mnt/data-ssd-1/data/private/customer/speechly/2022-11-06_multilingual-50h/external/delivery/es_tiktok_delivery_meta.jsonl gs://speechly-suno-wtyfeusyax/titktok/output/es_annotations.jsonl\n",
    "\n",
    "\n",
    "gsutil -m cp /mnt/data-ssd-1/data/private/customer/speechly/2022-11-06_multilingual-50h/external/delivery/pt_youtube_delivery_meta.jsonl gs://speechly-suno-wtyfeusyax/youtube/output/pt_annotations.jsonl\n",
    "\n",
    "gsutil -m cp /mnt/data-ssd-1/data/private/customer/speechly/2022-11-06_multilingual-50h/external/delivery/pt_tiktok_delivery_meta.jsonl gs://speechly-suno-wtyfeusyax/titktok/output/pt_annotations.jsonl"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "70a452bd",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c749c145",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d78dfeb0",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "16772000",
   "metadata": {},
   "source": [
    "## Playground"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 479,
   "id": "ba3d304f",
   "metadata": {},
   "outputs": [],
   "source": [
    "# analyze\n",
    "import random\n",
    "docs = []\n",
    "docs_norm = []\n",
    "for m in (\n",
    "    de_youtube_metas + de_tiktok_metas +\n",
    "    fr_youtube_metas + fr_tiktok_metas +\n",
    "    es_youtube_metas + es_tiktok_metas + \n",
    "    pt_youtube_metas + pt_tiktok_metas\n",
    "):\n",
    "#     if m[\"text\"] is None:\n",
    "#         continue\n",
    "    docs.append(m[\"text\"])\n",
    "    docs_norm.append(m[\"text_norm\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 474,
   "id": "69bd1b88",
   "metadata": {},
   "outputs": [],
   "source": [
    "# look at random ones\n",
    "# look at Speaker left in there (Locuteur 1 :)\n",
    "# check norm\n",
    "# \"\\u00f6re\" → 'öre'\n",
    "# \"\\u201c \\u201eMaus.\\u201c \\u201e\" → '\" „Maus.\" „'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 487,
   "id": "be67820e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['Uma coisa, muda, altera o texto <n> [é, mas só que eu acho] entendeu, Bola? <n> Para de arrotar, mano. <n> Altera o texto, tá ligado? Então eu ficava assim, porra, eu vou perder a fidelidade do teatro, eu levo muito a sério, pra galera que vai pra lá, <n> e do tipo, mano, aqui eu vou tocar o puteiro mesmo e dane-se, porque estamos entre quatro paredes, agora a partir de um momento você bota uma câmera, até peço para a galera que está com o celular na mão, galera, porra, porque fode o artista, né meu, filmar e expor e põe fora. [sim, sim, pega só aquele pedaço] É como se o Bola estivesse num tchutheiro e alguém estivesse filmando você lá [concordo] [fala, puta piruzinho] <n> [Ae, ó] [Opa] Então, Bola [foi nada] Então [misofonia, foda-se] <n> Então, então, então, Mateuszão [Mateus empolgou] É, é, eu vi esse teu show, confesso, eu estava, eu e <n> minha esposa e mais uma pessoa e uma hora eu não aguentei memo, sério, eu falei, caralho [Quem era a pessoa?] A pessoa da família [E cê falou, não vou assistir?] Não, eu dei uma parada, porque tu já mandou essa porra da, da, da, do oito infinito [veja se o oito infinito é pesado, Bola] [Hum, vamo ver, Matheus vai falar do oito infinito agora, muita atenção] [não consigo nem olhar para o público] [Muita atenção, por favor] [Cara, não é por nada não, mas se vocês pegarem esse momento aqui agora e colocar como corte, enfim Matheus fala do oito infinito] [Boa, boa dica] [Olha eu aqui] [Explosão] [Vai] [Você que está ai assistindo isso, vocês também aqui, como funciona o oito infinito? O oito infinito não é uma piada, é uma dica sexual para se fazer com sua esposa] [Perfeito] [Que que você tem que fazer? Chegar em casa, falar pra sua esposa arrancar a roupa] [Ele ta rindo] [Sentar na cama com as costas, sentar na cama com as costas na cabeceira] [Ham] [Se a cama não tiver cabeceira é melhor] [Na parede] [É, porque ela vai encostar as costas na parede gelada, o bico do peito fica duro na hora] [Certo] [Aí ela vai achar que tá com tesão] [Certo] [Aí você pede pra ela ficar com a perna assim né, o pezinho na cama, perninha dobrada assim sabe quando *cê senta com a perna dobrada] [Sei] [Abrir a perna vai tá o] Nojento isso [A xereca] [A xoxota aqui] [Certo] [Aí você vem com a língua <n> na ponta do grelo aqui, certo?] [Certo] [E sem você passar a língua nos buraco, nos orifício, você faz o movimento de oito infinito aqui ó, no grelo, cu] <n> [É um oito infinito aqui, ó, *cê faz de novo aqui ó, grelo, cu, grelo, cu] <n> [Cinco minutos já começa a ver a baba do quiabo minando aqui] <n> [E não para, Bola, presta atenção, não para, grelo, cu, gre* quando tu ver a mulher começa a esfregar a bunda na cama e jogando a buceta na tua cara e tu dominando grelo, cu, grelo, cu, grelo, cu, <n> quando vê ela já tá com o cu no pé da cama, tú olha na cama ta um rastro de lesma <n> fora a fora na cama] <n> [Isso é uma preliminar, é uma preliminar] <n> [Um rastro de lesma, ai caralho] [Porque fica aquele rastrinho de lesma] <n> [Que inclusive] [Ai não tem condição cara, juro] [Que inclusive, aquele rastrinho de lesma] [Eu não sei viu, eu *to com uma vergonha, cara] [Tu fez implante, né?] [Fez] Eu fiz transplante [Transplante, o, o rastrinho de lesma, <n> aquela babinha, não, olha aqui, bicho] [É maravilhoso] <n> Eu não consigo ne olhar, cara [Aquela babinha] É muito pesado [Aquela babinha que sai da buceta quando mulher começa a ficar com tesão, a primeira, olha aqui, Bola, sabe a primeira que tu faz com o dedo assim?] Eu fico imaginando a minha mãe, a minha mãe assistindo isso [A primeira, a primeira] [Não é pra assistir, a primeira que tu passa o dedo e fa assim ó] [Fala pra tua mãe não ver] [Dá até uma liguinha] [Dá liguinha] [Então se você pega aquilo ali] [Ai pai do céu] [E passar aqui ó, onde o cabelo ta caindo, o cabelo nasce grosso, fibroso, ó, olha aqui, ta vendo ó, agora presta atenção Carioca] [Foi o que o carioca fez] [Aí ó, eu ainda *to careca] [Ai eu *to passando mal] [Mas ó cavanhaque] <n> Mano tu é muito escroto, brother, assim, você e o Carlinhos olha] [Sou não, uma vez comer o cu dum cara] <n> [Isso é escroto, presta atenção, isso é escroto] Não, para [Uma vez eu fui comer o cu dum cara] Eu vou embora [Eu preciso mijar cara, pera] Vai contando ai, vai [O que que é isso, os caras me deixaram no programa deles aqui] Eu *to com vergonha, eu vou mijar, *ce vai, vai contando pra galera ai [Não, eu não, tem que ter plateia, pô, dia quatorze a gente estreia o show, o novo produto do Matheus Ceará, que é o bora papear com a sua esposa Bianca Campos, segue a gente aí no Youtube, no Facebook e no Instagram, é tudo Matheus Ceará, a gente da prêmios, da pix e da tudo e eu vou embora também, tchau, encera assim?] [Não, não vai embora não] [Onde que eles vão, eu achei que estava encerrando] [Não, eles *tão no banheiro] [Puta merda] [Espera um pouquinho] Pode fazer [Sodiê Doces, a Sodiê Doces, a maior marca de doces] Sodiê é bom, né meu [Bom pra caralho, bicho, bom pra caralho] [E la tem doce zero] [E eles mandam no camarim do show pra mim] [Que legal, que legal] [Agora estão com salgados também, tem a Sodiê Salgados também, bom pra caralho] [Ai meu pai] [Que que foi, velho?] [Ainda bem que não tinha ninguém aqui] [Por que, vomitou?] [Não eu não, vomitei, ta maravilhoso, cara] [Ah eu ia falar a história, *cês saíram] [Não, agora não dá, porque chegou criança, meu] Porra [Ah mas a gente está comendo tapioca aqui] [*Cês não estavam assistindo] [E passei mal até, pelo amor de deus, *cê é muito louco, qual *cê ia contar a história do que? Não é do oito infinito] [Não que eu comi o cu dum cara] [Ah é, ele vai contar] Eu falei que não era pra contar a da lesma, agora eu vou contar da pessoa que *cê pediu pra não falar também, filha da puta [Ta bom] Só pra saber, *cê fez da lesma, só pra saber [Não] Não, não fez? Só pra saber [Os caras brigando] [Uma vez eu fui comer o cu dum cara, na hora que eu botei o pau e tirei, saiu] Não, não, não brother, não, não, não, caralho [Saiu uma casca de feijão, eu falei, porra, bicho, uma casca de feijão? Ele falou, por dez reais *cê queria o que filé com fritas?] [O cara pagou dez cruzeiros, vei, que bosta, ai Matheus você não da cara, na boa mesmo] Não da, não da [Você é um puta cara louco, cara] Sério, sério que eu fico com vergonha, cara, eu não consigo olhar [Eu *tô tentando recuperar cara] [Depois que gravou edita, não vai pro ar] Mas ta ao vivo, caralho {Então beleza] Agora já era [Eu vou comer, cara] Eu não sei mais [Eu vou comer que eu ganho mais] Conta umas piadas boas ai que cê lembra, não, não assim, caralho, eu falei pra a lesma [Ah vamos fazer vocês pedem e eu conto, pra galera pedir pra participar] Ta bom [Fala o nome do cara e quem pediu, é uma boa, *cê que ta assistindo aí ó] Ta tão rápido o chat aqui que eu já nem sei mais [A galera ta rindo pelo menos ou tão me excomungando] Não, tão rindo né, chorando e tal, é lógi*, puta piada escrota pô, tem umas mais light não? Que cê pôs <u> [Mais light] [Ah tem uma] Vai, la vem ele [Uma vez eu estava andando num trem] Vai sem parar, uma piada na outra, vai [Aí uma moça sentou de frente comigo assim, com uma saia] Hum [Sabe aquela saia que tem uma racha que vem até a racha assim] Hum, qual que saia, como é que é? [Tem uma racha, um rasgo] [Tem uma racha que vem até a racha] Eu nunca vi essa saia [A saia] [Que é aberta, que tem um corte] A sei, sei, executiva, mais apertada [Aí eu *tava no trem olhando de frente assim, ela sem calcinha, eu fiquei olhando, ela viu que eu estava olhando eu fiquei sem graça, falei porra, aí ela olhou pra mim e falou assim, manda um beijo pra ela, eu falei ah *cê ta zoando, ela falou manda procê ver, aí eu mandei um beijo pra xoxota dela <n>, a xoxota <n>, eu falei não pode ser, eu mandei uma beijo <n> a xoxota <n> ai eu mandei outro beijo, a <n>, acho que a mulher ficou com tesão e falou, enfia um dedo, ai eu falei ah vai falar que ela assovia também] <n> [Porque] <n> [Criança também, *cê falou que tem criança, mas criança não ta nem aí mais] <n> [Esses dias eu estava no quarto comendo a minha esposa, tranquilo, feliz] <n> [De repente, meu filho abriu a porta do quarto falou, papai o que o senhor ta fazendo, eu falei papai ta procurando um rato, ele falou, vai comer o cu dele também?] <n> Porque que eu adoro piada escrota, cara? Ai mas eu não sei se eu posso [Cara, tem, tem, hoje em dia, Matheus] [Isso nunca no Jovem Pan ia contar] [Nunca] Nunca, jamais [Esquece] Nunca [O que eu ia te pergunta é se hoje em dia ainda tem] É isso, se inscreve aí nesse canal aqui que vos fala, dá o like aí nesse vídeo [Esquecemos alguma coisa, Gean?] Não, é isso aí mesmo [É isso] É isso.']"
      ]
     },
     "execution_count": 487,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[s for s in docs if \"{\" in s][:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 484,
   "id": "d21fa5c2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['Wenn ihr diesen Moment, wenn ihr an ihr so rum rubbeln müsst, damit ihr überhaupt mal was passiert. Mann. Die Batterie ist alle.',\n",
       " 'O ganado lá de casa, vou atrás das <u>',\n",
       " 'Solo quería decirte que donde sea que estés en el mundo, te voy a volver a encontrar, pase lo que pase.',\n",
       " '¿Os imagináis cosiendo mi moño? A ver, os vais a reír, pero yo mismo yo lo tengo guardado allí de recuerdo. Uy, aquí está mi moño que tanto tiempo hemos pasado juntos, hemos pasado muchísimas batallas y yo no sé ni cómo no se me cayó de tantos tintes que me echaba un producto del pelo. Lo siento corazones, pero esta bolita no tiene precio y de tenerlo nadie podría pagarlo. Tiqui moño.',\n",
       " 'Ja, Jetzt habe ich die Schnauze voll. Jetzt weiß ich Bescheid. Nein, ich lasse mich nicht verarschen.']"
      ]
     },
     "execution_count": 484,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "random.shuffle(docs)\n",
    "docs[:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 486,
   "id": "71e26d98",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['die bundesregierung will haschisch und marihuana legalisieren wie taliban regierung in afghanistan ist bereit zu liefern offenbar sind die vorbereitungen bereits in vollem gange ein sprecher der talibanregierung bestätigte der bildzeitung dass die deutsche firma eci entwicklungsgesellschaft pharma international 400 millionen euro investieren will nach vertragsabschluss würde im gegenzug dann eine art cannabismonopol entstehen die firma bestätigte den deal glaubt dass viele von hunger und armut bedrohte bauern davon profitieren könnten solange die vereinten nationen aber die taliban regierungen nicht anerkennen sind geschäfte mit dem regime der radikalen islamisten legal kaum möglich',\n",
       " \"si vous et moi avons la merci madame on a passé une bonne soirée quand même mon chat n'en mais sinon les tickets resto bien sûr messieurs oublie ceux qui se permettent de voir la crevards c'est pas tout les soirs\",\n",
       " 'cabelo cabelo meu porque tu só fica bonito quando tá só você e eu quebra esse espelho',\n",
       " 'ando como en mi casa hoy estuvo muy rico ya terminé y luis lava los platos a mí no mamá yo no voy a lavar nada además tengo mucha tarea ah pero cuando como en casa ajena mm estuvo muy rico todo qué vas a hacer voy a lavar todos los trastes si es que yo en mi casa estoy acostumbrado a lavar todos los trastes no no no dejá ahí sí no no no yo se los lavo es más si quiere le lavo la ropa',\n",
       " 'was ist das was ist das jetzt mal ehrlich was ist das die uhr eins dann hier die tausender dann hier die millionen milliarden billionen billiarden dann hier erstmal trillionen trilliarden quadrillionen quadrilliarden quintillionen quintilliarden sextillionen sextilliarde septillion septilliarden oktillionen oktilliarden bis einhundert neunhundert oktillionen']"
      ]
     },
     "execution_count": 486,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "random.shuffle(docs_norm)\n",
    "docs_norm[:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "58444006",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "00ffbfb5",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "id": "92ae332b",
   "metadata": {},
   "outputs": [],
   "source": [
    "# french\n",
    "d = \"/mnt/data-ssd-1/data/private/customer/speechly/2022-11-06_multilingual-50h/external\"\n",
    "fns_tiktok_new = [\n",
    "    (fn.split(\".\")[0], fn) \n",
    "    for fn in os.listdir(os.path.join(d, \"TikTok\"))\n",
    "]\n",
    "fns_youtube_new = [\n",
    "    (fn.split(\".\")[0], fn) \n",
    "    for fn in os.listdir(os.path.join(d, \"YouTube\"))\n",
    "]\n",
    "\n",
    "fns_tiktok_old = [\n",
    "    (fn.split(\".\")[0], fn) \n",
    "    for fn in os.listdir(os.path.join(d, \"fr/tiktok\"))\n",
    "]\n",
    "fns_youtube_old = [\n",
    "    (fn.split(\".\")[0], fn) \n",
    "    for fn in os.listdir(os.path.join(d, \"fr/youtube\"))\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b43cf77c",
   "metadata": {},
   "outputs": [],
   "source": [
    "# figure out which ones we need to delete and then movel all"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 160,
   "id": "bc0e406b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "915"
      ]
     },
     "execution_count": 160,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "to_repl_ids = set([e[0] for e in fns_tiktok_new])\n",
    "to_del_fps = []\n",
    "for _id, fn in fns_tiktok_old:\n",
    "    if _id in to_repl_ids:\n",
    "        to_del_fps.append(fn)\n",
    "len(to_del_fps)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 161,
   "id": "64e50ef7",
   "metadata": {},
   "outputs": [],
   "source": [
    "for fn in to_del_fps:\n",
    "    os.remove(os.path.join(d, \"fr/tiktok\", fn))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 162,
   "id": "31e7913e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "('7003317993547648261', '7003317993547648261.docx')"
      ]
     },
     "execution_count": 162,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fns_tiktok_new[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 167,
   "id": "f54c02c4",
   "metadata": {},
   "outputs": [],
   "source": [
    "for _, fn in fns_tiktok_new:\n",
    "    os.rename(\n",
    "        os.path.join(d, \"TikTok\", fn),\n",
    "        os.path.join(d, \"fr/tiktok\", fn),\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 171,
   "id": "e9dfd09d",
   "metadata": {},
   "outputs": [],
   "source": [
    "for _, fn in fns_youtube_new:\n",
    "    os.rename(\n",
    "        os.path.join(d, \"YouTube\", fn),\n",
    "        os.path.join(d, \"fr/youtube\", fn),\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 155,
   "id": "ae0991b3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "27"
      ]
     },
     "execution_count": 155,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "to_repl_ids = set([e[0] for e in fns_youtube_new])\n",
    "to_del_fps = []\n",
    "for _id, fn in fns_youtube_old:\n",
    "    if _id in to_repl_ids:\n",
    "        to_del_fps.append(fn)\n",
    "len(to_del_fps)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 157,
   "id": "348dd328",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'/mnt/data-ssd-1/data/private/customer/speechly/2022-11-06_multilingual-50h/external/fr/youtube/6Jwv_BNiubE.docx'"
      ]
     },
     "execution_count": 157,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "os.path.join(d, \"fr/youtube\", '6Jwv_BNiubE.docx')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 158,
   "id": "25eebc39",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/mnt/data-ssd-1/data/private/customer/speechly/2022-11-06_multilingual-50h/external/fr/youtube/6Jwv_BNiubE.docx\r\n"
     ]
    }
   ],
   "source": [
    "!ls /mnt/data-ssd-1/data/private/customer/speechly/2022-11-06_multilingual-50h/external/fr/youtube/6Jwv_BNiubE.docx"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fec6a94d",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6724abfb",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "07a6f1aa",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "aac72769",
   "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.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
