{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "cartella_elaborazioni = \"elaborazioni\"\n",
    "result_video_name = \"result.mp4\"\n",
    "result_folder = \"result\"\n",
    "margine_bordi_video = 77 # sec\n",
    "\n",
    "read_from_media = True\n",
    "lunghezza_video_originale_in_sec = 31\n",
    "lunghezza_video_finale_in_sec = 24 # un minuto\n",
    "fattore_schiacciamento = 0.48\n",
    "fattore_desat = 0.79\n",
    "applica_sottotitoli = False\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "0. copiare video in elab"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import random\n",
    "import shutil\n",
    "\n",
    "\n",
    "#cartoni = \"byschii/hoarding/cartoni/The Simpsons\"\n",
    "cartoni = \"byschii/hoarding/4. cartoni\"\n",
    "cartoni = \"byschii/hoarding/4. cartoni/leone cane fifone\"\n",
    "\n",
    "def copia_da_fs(cartella_destinazione):\n",
    "    remote_folder = \"/media/\" + cartoni\n",
    "    # 0.3 esplora sotto-cartelle\n",
    "\n",
    "    # use os.walk to get all files in the path\n",
    "    files = []\n",
    "    for path, dirs, filenames in os.walk(remote_folder):\n",
    "        for filename in filenames:\n",
    "            files.append(os.path.join(path, filename))\n",
    "\n",
    "    # pick a file at random\n",
    "    episodio_path = random.choice(files)\n",
    "\n",
    "    # 0.4 copia un episodio a caso\n",
    "    shutil.copy(episodio_path, cartella_destinazione)\n",
    "\n",
    "\n",
    "\n",
    "# 0.1 trovare un video dei Simpson\n",
    "from ftplib import FTP_TLS, FTP\n",
    "import pysftp\n",
    "from stat import S_ISDIR\n",
    "\n",
    "# write a function that takes an sftp connection and a remotepath\n",
    "# and similar to os.walk, returns a list of all files in the path\n",
    "# the file will be a tuple of (path, filename)\n",
    "# in a way that you can use os.path.join(remotepath, path, filename) to get the full path\n",
    "def sftp_walk(sftp, remotepath):\n",
    "    path = remotepath\n",
    "    files = []\n",
    "    folders = []\n",
    "    for f in sftp.listdir_attr(remotepath):\n",
    "        if S_ISDIR(f.st_mode):\n",
    "            folders.append(f.filename)\n",
    "        else:\n",
    "            files.append(f.filename)\n",
    "    if files:\n",
    "        yield path, files\n",
    "    for folder in folders:\n",
    "        new_path = os.path.join(remotepath, folder)\n",
    "        for x in sftp_walk(sftp, new_path):\n",
    "            yield x\n",
    "\n",
    "def copia_da_sfpt(cartella_destinazione):\n",
    "\n",
    "    with pysftp.Connection(host=\"192.168.1.43\", username=\"byschii\", password=\"pylover\") as ftp: \n",
    "        remote_folder = \"/media/\" + cartoni\n",
    "\n",
    "        files = []\n",
    "        for path, filename in sftp_walk(ftp, remote_folder):\n",
    "            for f in filename:\n",
    "                files.append(os.path.join(path, f))\n",
    "\n",
    "        # pick a file at random\n",
    "        file = random.choice(files)\n",
    "        print(file)\n",
    "        # copy it to the local folder\n",
    "        ftp.get(file, cartella_destinazione+\"/\"+os.path.basename(file))\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "# 0.1 creare cartella 'elab' se non esiste\n",
    "shutil.rmtree(cartella_elaborazioni, ignore_errors=True)\n",
    "if not os.path.exists(cartella_elaborazioni):\n",
    "    os.mkdir(cartella_elaborazioni)\n",
    "\n",
    "# 0.2 copiare un video dei Simpson\n",
    "if read_from_media:\n",
    "    copia_da_fs(cartella_elaborazioni)\n",
    "else:\n",
    "    copia_da_sfpt(cartella_elaborazioni)\n",
    "\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1. Prendere uno spezzone di cartone 1:10/1:20 secondi"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'elaborazioni/simpson.mp4'"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\n",
    "# 1.1 rinominare il file in 'simpson.' (mantenere l'estensione)\n",
    "\n",
    "# leggi l unico file nella cartella\n",
    "files = os.listdir(cartella_elaborazioni)\n",
    "file = files[0]\n",
    "\n",
    "# rinomina il file\n",
    "nuovo_nome = \"simpson.\" + file.split(\".\")[-1]\n",
    "nuovo_nome_path = os.path.join(cartella_elaborazioni, nuovo_nome)\n",
    "shutil.move(os.path.join(cartella_elaborazioni, file), nuovo_nome_path)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "DURATA: 22.0 min\n",
      "INIZIO: 13.0 min\n",
      "FINE: 14.0 min\n"
     ]
    }
   ],
   "source": [
    "# 1.2 lunghezza del video con ffprobe\n",
    "import subprocess\n",
    "import json\n",
    "\n",
    "ffprobe_cmd = \"ffprobe -v quiet -print_format json -show_format -show_streams\".split()\n",
    "ffprobe_cmd.append(nuovo_nome_path)\n",
    "ffprobe = subprocess.Popen(ffprobe_cmd, stdout=subprocess.PIPE)\n",
    "ffprobe = json.loads(ffprobe.stdout.read().decode(\"utf-8\"))\n",
    "\n",
    "duration = float(ffprobe[\"format\"][\"duration\"])\n",
    "print(\"DURATA:\", duration // 60, \"min\")\n",
    "\n",
    "# 1.3 prendere un punto a caso del video\n",
    "# preferibilemente con una distribuzione normale, leggermente meno probabile all'inizio e alla fine, più probabile al centro\n",
    "minutaggio_massimo = duration - margine_bordi_video\n",
    "minutaggio = random.gauss(duration/2, duration/6)\n",
    "minutaggio = min(max(minutaggio, margine_bordi_video), minutaggio_massimo)\n",
    "inizio_video = minutaggio - lunghezza_video_originale_in_sec/2\n",
    "fine_video = minutaggio + lunghezza_video_originale_in_sec/2\n",
    "\n",
    "print(\"INIZIO:\", inizio_video // 60, \"min\")\n",
    "print(\"FINE:\", fine_video // 60, \"min\")\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ffmpeg version 4.4.2-0ubuntu0.22.04.1 Copyright (c) 2000-2021 the FFmpeg developers\n",
      "  built with gcc 11 (Ubuntu 11.2.0-19ubuntu1)\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\n",
      "  libavutil      56. 70.100 / 56. 70.100\n",
      "  libavcodec     58.134.100 / 58.134.100\n",
      "  libavformat    58. 76.100 / 58. 76.100\n",
      "  libavdevice    58. 13.100 / 58. 13.100\n",
      "  libavfilter     7.110.100 /  7.110.100\n",
      "  libswscale      5.  9.100 /  5.  9.100\n",
      "  libswresample   3.  9.100 /  3.  9.100\n",
      "  libpostproc    55.  9.100 / 55.  9.100\n",
      "Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'elaborazioni/simpson.mp4':\n",
      "  Metadata:\n",
      "    major_brand     : isom\n",
      "    minor_version   : 512\n",
      "    compatible_brands: isomiso2avc1mp41\n",
      "  Duration: 00:22:44.64, start: 0.000000, bitrate: 1402 kb/s\n",
      "  Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 848x636 [SAR 1:1 DAR 4:3], 1200 kb/s, 24 fps, 48 tbr, 90k tbn, 48 tbc (default)\n",
      "    Metadata:\n",
      "      handler_name    : VideoHandler\n",
      "      vendor_id       : [0][0][0][0]\n",
      "  Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 195 kb/s (default)\n",
      "    Metadata:\n",
      "      handler_name    : VideoHandler\n",
      "      vendor_id       : [0][0][0][0]\n",
      "Stream mapping:\n",
      "  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))\n",
      "  Stream #0:1 -> #0:1 (aac (native) -> aac (native))\n",
      "Press [q] to stop, [?] for help\n",
      "[libx264 @ 0x557f4b8e2dc0] using SAR=1/1\n",
      "[libx264 @ 0x557f4b8e2dc0] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2\n",
      "[libx264 @ 0x557f4b8e2dc0] profile High, level 3.1, 4:2:0, 8-bit\n",
      "[libx264 @ 0x557f4b8e2dc0] 264 - core 163 r3060 5db6aa6 - H.264/MPEG-4 AVC codec - Copyleft 2003-2021 - http://www.videolan.org/x264.html - options: cabac=1 ref=1 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=2 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=0 threads=12 lookahead_threads=4 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=1 keyint=250 keyint_min=24 scenecut=40 intra_refresh=0 rc_lookahead=10 rc=crf mbtree=1 crf=18.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00\n",
      "Output #0, matroska, to 'elaborazioni/simpson_cut.mkv':\n",
      "  Metadata:\n",
      "    major_brand     : isom\n",
      "    minor_version   : 512\n",
      "    compatible_brands: isomiso2avc1mp41\n",
      "    encoder         : Lavf58.76.100\n",
      "  Stream #0:0(und): Video: h264 (H264 / 0x34363248), yuv420p(progressive), 848x636 [SAR 1:1 DAR 4:3], q=2-31, 24 fps, 1k tbn (default)\n",
      "    Metadata:\n",
      "      handler_name    : VideoHandler\n",
      "      vendor_id       : [0][0][0][0]\n",
      "      encoder         : Lavc58.134.100 libx264\n",
      "    Side data:\n",
      "      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A\n",
      "  Stream #0:1(und): Audio: aac (LC) ([255][0][0][0] / 0x00FF), 44100 Hz, stereo, fltp, 128 kb/s (default)\n",
      "    Metadata:\n",
      "      handler_name    : VideoHandler\n",
      "      vendor_id       : [0][0][0][0]\n",
      "      encoder         : Lavc58.134.100 aac\n",
      "frame=  588 fps= 34 q=23.0 size=    3328kB time=00:00:25.14 bitrate=1084.2kbits/s dup=0 drop=13 speed=1.47x    \r"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "frame=  726 fps= 41 q=-1.0 Lsize=    4868kB time=00:00:30.99 bitrate=1286.4kbits/s dup=0 drop=17 speed=1.76x    \n",
      "video:4365kB audio:487kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.320757%\n",
      "[libx264 @ 0x557f4b8e2dc0] frame I:10    Avg QP:13.02  size: 73559\n",
      "[libx264 @ 0x557f4b8e2dc0] frame P:221   Avg QP:16.56  size: 12064\n",
      "[libx264 @ 0x557f4b8e2dc0] frame B:495   Avg QP:18.61  size:  2156\n",
      "[libx264 @ 0x557f4b8e2dc0] consecutive B-frames:  3.3% 16.5%  2.5% 77.7%\n",
      "[libx264 @ 0x557f4b8e2dc0] mb I  I16..4: 23.6%  8.5% 68.0%\n",
      "[libx264 @ 0x557f4b8e2dc0] mb P  I16..4:  6.7%  0.8%  2.7%  P16..4: 26.0%  6.2%  6.1%  0.0%  0.0%    skip:51.6%\n",
      "[libx264 @ 0x557f4b8e2dc0] mb B  I16..4:  0.3%  0.1%  0.1%  B16..8:  6.7%  2.5%  1.0%  direct: 6.0%  skip:83.2%  L0:41.2% L1:48.0% BI:10.8%\n",
      "[libx264 @ 0x557f4b8e2dc0] 8x8 transform intra:8.5% inter:6.5%\n",
      "[libx264 @ 0x557f4b8e2dc0] coded y,uvDC,uvAC intra: 45.3% 74.1% 62.3% inter: 5.8% 13.4% 2.3%\n",
      "[libx264 @ 0x557f4b8e2dc0] i16 v,h,dc,p: 74% 18%  7%  1%\n",
      "[libx264 @ 0x557f4b8e2dc0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 15% 48% 22%  3%  2%  1%  3%  2%  5%\n",
      "[libx264 @ 0x557f4b8e2dc0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 22% 25% 15%  6%  7%  6%  7%  5%  7%\n",
      "[libx264 @ 0x557f4b8e2dc0] i8c dc,h,v,p: 47% 29% 17%  7%\n",
      "[libx264 @ 0x557f4b8e2dc0] Weighted P-Frames: Y:0.0% UV:0.0%\n",
      "[libx264 @ 0x557f4b8e2dc0] kb/s:1154.92\n",
      "[aac @ 0x557f4b9a0740] Qavg: 223.311\n"
     ]
    }
   ],
   "source": [
    "# 1.6 tagliare il video con ffmpeg e salvare in questa cartella\n",
    "\n",
    "ffmpeg_cmd = \"ffmpeg -i\".split()\n",
    "ffmpeg_cmd.append(nuovo_nome_path)\n",
    "ffmpeg_cmd.append(\"-ss\")\n",
    "ffmpeg_cmd.append(str(inizio_video))\n",
    "ffmpeg_cmd.append(\"-to\")\n",
    "ffmpeg_cmd.append(str(fine_video))\n",
    "ffmpeg_cmd.append(\"-c:v\")\n",
    "ffmpeg_cmd.append(\"libx264\")\n",
    "ffmpeg_cmd.append(\"-c:a\")\n",
    "ffmpeg_cmd.append(\"aac\")\n",
    "ffmpeg_cmd.append(\"-strict\")\n",
    "ffmpeg_cmd.append(\"-2\")\n",
    "ffmpeg_cmd.append(\"-crf\")\n",
    "ffmpeg_cmd.append(\"18\")\n",
    "ffmpeg_cmd.append(\"-preset\")\n",
    "ffmpeg_cmd.append(\"veryfast\")\n",
    "ffmpeg_cmd.append(cartella_elaborazioni+\"/simpson_cut.mkv\")\n",
    "\n",
    "ffmpeg = subprocess.Popen(ffmpeg_cmd, stdout=subprocess.PIPE)\n",
    "ffmpeg = ffmpeg.stdout.read().decode(\"utf-8\")\n",
    "print(ffmpeg)\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1bis. calcola sottotitoli"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "whisper_init_from_file_no_state: loading model from '../whisper.cpp/models/ggml-small.bin'\n",
      "whisper_model_load: loading model\n",
      "whisper_model_load: n_vocab       = 51865\n",
      "whisper_model_load: n_audio_ctx   = 1500\n",
      "whisper_model_load: n_audio_state = 768\n",
      "whisper_model_load: n_audio_head  = 12\n",
      "whisper_model_load: n_audio_layer = 12\n",
      "whisper_model_load: n_text_ctx    = 448\n",
      "whisper_model_load: n_text_state  = 768\n",
      "whisper_model_load: n_text_head   = 12\n",
      "whisper_model_load: n_text_layer  = 12\n",
      "whisper_model_load: n_mels        = 80\n",
      "whisper_model_load: ftype         = 1\n",
      "whisper_model_load: qntvr         = 0\n",
      "whisper_model_load: type          = 3\n",
      "whisper_init_from_file_no_state: loading model from '../whisper.cpp/models/ggml-small.bin'\n",
      "whisper_model_load: loading model\n",
      "whisper_model_load: n_vocab       = 51865\n",
      "whisper_model_load: n_audio_ctx   = 1500\n",
      "whisper_model_load: n_audio_state = 768\n",
      "whisper_model_load: n_audio_head  = 12\n",
      "whisper_model_load: n_audio_layer = 12\n",
      "whisper_model_load: n_text_ctx    = 448\n",
      "whisper_model_load: n_text_state  = 768\n",
      "whisper_model_load: n_text_head   = 12\n",
      "whisper_model_load: n_text_layer  = 12\n",
      "whisper_model_load: n_mels        = 80\n",
      "whisper_model_load: ftype         = 1\n",
      "whisper_model_load: qntvr         = 0\n",
      "whisper_model_load: type          = 3\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Popen: returncode: None args: ['../whisper.cpp/main', '--model', '../whispe...>"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 1bis.1 estrarre wav 16khz\n",
    "command1 = f\"ffmpeg -i {cartella_elaborazioni}/simpson_cut.mkv -ar 16000 -ac 1 -c:a pcm_s16le {cartella_elaborazioni}/episode.wav\"\n",
    "subprocess.Popen(command1.split(), stdout=subprocess.PIPE)\n",
    "\n",
    "# 1bis.2 elaborare wav con whisper\n",
    "command = f\"../whisper.cpp/main --model ../whisper.cpp/models/ggml-small.bin --language it --output-srt -f {cartella_elaborazioni}/episode.wav\"\n",
    "subprocess.Popen(command.split(), stdout=subprocess.PIPE)\n",
    "\n",
    "\n",
    "# 1bis.2 elaborare wav con whisper\n",
    "command = f\"../whisper.cpp/main --model ../whisper.cpp/models/ggml-small.bin --language it --output-txt -f {cartella_elaborazioni}/episode.wav\"\n",
    "subprocess.Popen(command.split(), stdout=subprocess.PIPE)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "2. Velocizzare il cartone in 1min/50sec"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ffmpeg version 4.4.2-0ubuntu0.22.04.1 Copyright (c) 2000-2021 the FFmpeg developers\n",
      "  built with gcc 11 (Ubuntu 11.2.0-19ubuntu1)\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\n",
      "  libavutil      56. 70.100 / 56. 70.100\n",
      "  libavcodec     58.134.100 / 58.134.100\n",
      "  libavformat    58. 76.100 / 58. 76.100\n",
      "  libavdevice    58. 13.100 / 58. 13.100\n",
      "  libavfilter     7.110.100 /  7.110.100\n",
      "  libswscale      5.  9.100 /  5.  9.100\n",
      "  libswresample   3.  9.100 /  3.  9.100\n",
      "  libpostproc    55.  9.100 / 55.  9.100\n",
      "Input #0, matroska,webm, from 'elaborazioni/simpson_cut.mkv':\n",
      "  Metadata:\n",
      "    COMPATIBLE_BRANDS: isomiso2avc1mp41\n",
      "    MAJOR_BRAND     : isom\n",
      "    MINOR_VERSION   : 512\n",
      "    ENCODER         : Lavf58.76.100\n",
      "  Duration: 00:00:31.02, start: 0.000000, bitrate: 1285 kb/s\n",
      "  Stream #0:0: Video: h264 (High), yuv420p(progressive), 848x636 [SAR 1:1 DAR 4:3], 24 fps, 24 tbr, 1k tbn, 48 tbc (default)\n",
      "    Metadata:\n",
      "      HANDLER_NAME    : VideoHandler\n",
      "      VENDOR_ID       : [0][0][0][0]\n",
      "      ENCODER         : Lavc58.134.100 libx264\n",
      "      DURATION        : 00:00:31.023000000\n",
      "  Stream #0:1: Audio: aac (LC), 44100 Hz, stereo, fltp (default)\n",
      "    Metadata:\n",
      "      HANDLER_NAME    : VideoHandler\n",
      "      VENDOR_ID       : [0][0][0][0]\n",
      "      ENCODER         : Lavc58.134.100 aac\n",
      "      DURATION        : 00:00:31.023000000\n",
      "Stream mapping:\n",
      "  Stream #0:1 -> #0:0 (aac (native) -> pcm_s16le (native))\n",
      "Press [q] to stop, [?] for help\n",
      "Output #0, wav, to 'elaborazioni/episode.wav':\n",
      "  Metadata:\n",
      "    COMPATIBLE_BRANDS: isomiso2avc1mp41\n",
      "    MAJOR_BRAND     : isom\n",
      "    MINOR_VERSION   : 512\n",
      "    ISFT            : Lavf58.76.100\n",
      "  Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 16000 Hz, mono, s16, 256 kb/s (default)\n",
      "    Metadata:\n",
      "      HANDLER_NAME    : VideoHandler\n",
      "      VENDOR_ID       : [0][0][0][0]\n",
      "      DURATION        : 00:00:31.023000000\n",
      "      encoder         : Lavc58.134.100 pcm_s16le\n",
      "size=     970kB time=00:00:31.04 bitrate= 256.0kbits/s speed= 487x    \n",
      "video:0kB audio:970kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.007851%\n",
      "ffmpeg version 4.4.2-0ubuntu0.22.04.1 Copyright (c) 2000-2021 the FFmpeg developers\n",
      "  built with gcc 11 (Ubuntu 11.2.0-19ubuntu1)\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\n",
      "  libavutil      56. 70.100 / 56. 70.100\n",
      "  libavcodec     58.134.100 / 58.134.100\n",
      "  libavformat    58. 76.100 / 58. 76.100\n",
      "  libavdevice    58. 13.100 / 58. 13.100\n",
      "  libavfilter     7.110.100 /  7.110.100\n",
      "  libswscale      5.  9.100 /  5.  9.100\n",
      "  libswresample   3.  9.100 /  3.  9.100\n",
      "  libpostproc    55.  9.100 / 55.  9.100\n",
      "Input #0, matroska,webm, from 'elaborazioni/simpson_cut.mkv':\n",
      "  Metadata:\n",
      "    COMPATIBLE_BRANDS: isomiso2avc1mp41\n",
      "    MAJOR_BRAND     : isom\n",
      "    MINOR_VERSION   : 512\n",
      "    ENCODER         : Lavf58.76.100\n",
      "  Duration: 00:00:31.02, start: 0.000000, bitrate: 1285 kb/s\n",
      "  Stream #0:0: Video: h264 (High), yuv420p(progressive), 848x636 [SAR 1:1 DAR 4:3], 24 fps, 24 tbr, 1k tbn, 48 tbc (default)\n",
      "    Metadata:\n",
      "      HANDLER_NAME    : VideoHandler\n",
      "      VENDOR_ID       : [0][0][0][0]\n",
      "      ENCODER         : Lavc58.134.100 libx264\n",
      "      DURATION        : 00:00:31.023000000\n",
      "  Stream #0:1: Audio: aac (LC), 44100 Hz, stereo, fltp (default)\n",
      "    Metadata:\n",
      "      HANDLER_NAME    : VideoHandler\n",
      "      VENDOR_ID       : [0][0][0][0]\n",
      "      ENCODER         : Lavc58.134.100 aac\n",
      "      DURATION        : 00:00:31.023000000\n",
      "Stream mapping:\n",
      "  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))\n",
      "  Stream #0:1 -> #0:1 (aac (native) -> vorbis (libvorbis))\n",
      "Press [q] to stop, [?] for help\n",
      "[libx264 @ 0x564eae814c40] using SAR=1/1\n",
      "[libx264 @ 0x564eae814c40] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2\n",
      "[libx264 @ 0x564eae814c40] profile High, level 3.1, 4:2:0, 8-bit\n",
      "[libx264 @ 0x564eae814c40] 264 - core 163 r3060 5db6aa6 - H.264/MPEG-4 AVC codec - Copyleft 2003-2021 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=12 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=24 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00\n",
      "Output #0, matroska, to 'elaborazioni/simpson_velocizzato.mkv':\n",
      "  Metadata:\n",
      "    COMPATIBLE_BRANDS: isomiso2avc1mp41\n",
      "    MAJOR_BRAND     : isom\n",
      "    MINOR_VERSION   : 512\n",
      "    encoder         : Lavf58.76.100\n",
      "  Stream #0:0: Video: h264 (H264 / 0x34363248), yuv420p(progressive), 848x636 [SAR 1:1 DAR 4:3], q=2-31, 24 fps, 1k tbn (default)\n",
      "    Metadata:\n",
      "      HANDLER_NAME    : VideoHandler\n",
      "      VENDOR_ID       : [0][0][0][0]\n",
      "      DURATION        : 00:00:31.023000000\n",
      "      encoder         : Lavc58.134.100 libx264\n",
      "    Side data:\n",
      "      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A\n",
      "  Stream #0:1: Audio: vorbis (oV[0][0] / 0x566F), 44100 Hz, stereo, fltp (default)\n",
      "    Metadata:\n",
      "      HANDLER_NAME    : VideoHandler\n",
      "      VENDOR_ID       : [0][0][0][0]\n",
      "      DURATION        : 00:00:31.023000000\n",
      "      encoder         : Lavc58.134.100 libvorbis\n",
      "frame=    1 fps=0.0 q=0.0 size=       5kB time=00:00:00.21 bitrate= 185.8kbits/s speed=9.52x    \r"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "velocizzando x 1.2916666666666667\n",
      "eseguiendo: ffmpeg -i elaborazioni/simpson_cut.mkv -map 0 -map -0:s -vf setpts=0.7741935483870968*PTS -af atempo=1.2916666666666667 elaborazioni/simpson_velocizzato.mkv\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "whisper_model_load: adding 1608 extra tokens\n",
      "whisper_model_load: model ctx     =  464.68 MB\n",
      "whisper_model_load: adding 1608 extra tokens\n",
      "whisper_model_load: model ctx     =  464.68 MB\n",
      "whisper_model_load: model size    =  464.44 MB\n",
      "whisper_model_load: model size    =  464.44 MB\n",
      "whisper_init_state: kv self size  =   15.75 MB\n",
      "whisper_init_state: kv self size  =   15.75 MB\n",
      "whisper_init_state: kv cross size =   52.73 MB\n",
      "whisper_init_state: kv cross size =   52.73 MB\n",
      "whisper_init_state: compute buffer (conv)   =   19.96 MB\n",
      "whisper_init_state: compute buffer (conv)   =   19.96 MB\n",
      "whisper_init_state: compute buffer (encode) =  122.04 MB44 bitrate=  27.7kbits/s dup=0 drop=7 speed=2.71x    \n",
      "whisper_init_state: compute buffer (cross)  =    5.86 MB\n",
      "whisper_init_state: compute buffer (decode) =   36.17 MB\n",
      "\n",
      "system_info: n_threads = 4 / 8 | AVX = 1 | AVX2 = 1 | AVX512 = 0 | FMA = 1 | NEON = 0 | ARM_FMA = 0 | METAL = 0 | F16C = 1 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 0 | SSE3 = 1 | SSSE3 = 1 | VSX = 0 | COREML = 0 | OPENVINO = 0 | \n",
      "\n",
      "main: processing 'elaborazioni/episode.wav' (496721 samples, 31.0 sec), 4 threads, 1 processors, lang = it, task = transcribe, timestamps = 1 ...\n",
      "\n",
      "whisper_init_state: compute buffer (encode) =  122.04 MB\n",
      "whisper_init_state: compute buffer (cross)  =    5.86 MB\n",
      "whisper_init_state: compute buffer (decode) =   36.17 MB\n",
      "\n",
      "system_info: n_threads = 4 / 8 | AVX = 1 | AVX2 = 1 | AVX512 = 0 | FMA = 1 | NEON = 0 | ARM_FMA = 0 | METAL = 0 | F16C = 1 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 0 | SSE3 = 1 | SSSE3 = 1 | VSX = 0 | COREML = 0 | OPENVINO = 0 | \n",
      "\n",
      "main: processing 'elaborazioni/episode.wav' (496721 samples, 31.0 sec), 4 threads, 1 processors, lang = it, task = transcribe, timestamps = 1 ...\n",
      "\n",
      "frame=  577 fps= 20 q=-1.0 Lsize=    2838kB time=00:00:24.04 bitrate= 966.7kbits/s dup=0 drop=149 speed=0.841x    \n",
      "video:2540kB audio:280kB subtitle:0kB other streams:0kB global headers:4kB muxing overhead: 0.639804%\n",
      "[libx264 @ 0x564eae814c40] frame I:10    Avg QP:16.70  size: 60265\n",
      "[libx264 @ 0x564eae814c40] frame P:180   Avg QP:20.43  size:  7838\n",
      "[libx264 @ 0x564eae814c40] frame B:387   Avg QP:24.26  size:  1516\n",
      "[libx264 @ 0x564eae814c40] consecutive B-frames:  4.3% 15.6%  9.4% 70.7%\n",
      "[libx264 @ 0x564eae814c40] mb I  I16..4: 22.6% 15.3% 62.2%\n",
      "[libx264 @ 0x564eae814c40] mb P  I16..4:  1.9%  2.4%  2.3%  P16..4: 25.4%  6.3%  4.6%  0.0%  0.0%    skip:57.0%\n",
      "[libx264 @ 0x564eae814c40] mb B  I16..4:  0.2%  0.2%  0.2%  B16..8: 13.3%  2.7%  0.9%  direct: 1.2%  skip:81.4%  L0:43.0% L1:52.3% BI: 4.7%\n",
      "[libx264 @ 0x564eae814c40] 8x8 transform intra:27.4% inter:45.4%\n",
      "[libx264 @ 0x564eae814c40] coded y,uvDC,uvAC intra: 51.5% 79.8% 61.4% inter: 4.3% 9.8% 1.5%\n",
      "[libx264 @ 0x564eae814c40] i16 v,h,dc,p: 52% 32% 10%  6%\n",
      "[libx264 @ 0x564eae814c40] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 17% 25% 39%  3%  3%  3%  3%  3%  5%\n",
      "[libx264 @ 0x564eae814c40] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 23% 24% 16%  6%  7%  6%  7%  5%  7%\n",
      "[libx264 @ 0x564eae814c40] i8c dc,h,v,p: 42% 32% 18%  9%\n",
      "[libx264 @ 0x564eae814c40] Weighted P-Frames: Y:0.0% UV:0.0%\n",
      "[libx264 @ 0x564eae814c40] ref P L0: 74.2%  3.9% 14.5%  7.4%\n",
      "[libx264 @ 0x564eae814c40] ref B L0: 85.1% 12.3%  2.6%\n",
      "[libx264 @ 0x564eae814c40] ref B L1: 95.1%  4.9%\n",
      "[libx264 @ 0x564eae814c40] kb/s:865.27\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "#2.1 usare ffmpeg per velocizzare il video, senza corromperlo\n",
    "\n",
    "fattore_velocita_video = lunghezza_video_finale_in_sec / lunghezza_video_originale_in_sec\n",
    "fattore_velocita_audio = lunghezza_video_originale_in_sec / lunghezza_video_finale_in_sec\n",
    "\n",
    "ffmpeg_cmd = \"ffmpeg -i\".split()\n",
    "ffmpeg_cmd.append(cartella_elaborazioni+\"/simpson_cut.mkv\")\n",
    "ffmpeg_cmd.append(\"-map\")\n",
    "ffmpeg_cmd.append(\"0\")\n",
    "ffmpeg_cmd.append(\"-map\")\n",
    "ffmpeg_cmd.append(\"-0:s\")\n",
    "ffmpeg_cmd.append(\"-vf\")\n",
    "ffmpeg_cmd.append(\"setpts=\" + str(fattore_velocita_video) + \"*PTS\")\n",
    "ffmpeg_cmd.append(\"-af\")\n",
    "ffmpeg_cmd.append(\"atempo=\" + str(fattore_velocita_audio))\n",
    "ffmpeg_cmd.append(cartella_elaborazioni+\"/simpson_velocizzato.mkv\")\n",
    "\n",
    "print(\"velocizzando x\", fattore_velocita_audio)\n",
    "print(\"eseguiendo:\", \" \".join(ffmpeg_cmd))\n",
    "\n",
    "\n",
    "ffmpeg = subprocess.Popen(ffmpeg_cmd, stdout=subprocess.PIPE)\n",
    "ffmpeg = ffmpeg.stdout.read().decode(\"utf-8\")\n",
    "print(ffmpeg)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "2bis velocizzare sottotitoli"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "..."
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "output_srt: saving output to 'elaborazioni/episode.wav.srt'\n",
      "\n",
      "whisper_print_timings:     load time =   643.93 ms\n",
      "whisper_print_timings:     fallbacks =   0 p /   0 h\n",
      "whisper_print_timings:      mel time =    91.96 ms\n",
      "whisper_print_timings:   sample time =   200.22 ms /   125 runs (    1.60 ms per run)\n",
      "whisper_print_timings:   encode time = 43312.82 ms /     2 runs (21656.41 ms per run)\n",
      "whisper_print_timings:   decode time = 10328.53 ms /   119 runs (   86.79 ms per run)\n",
      "whisper_print_timings:   prompt time =   459.10 ms /     4 runs (  114.77 ms per run)\n",
      "whisper_print_timings:    total time = 55364.02 ms\n",
      "output_txt: saving output to 'elaborazioni/episode.wav.txt'\n",
      "\n",
      "whisper_print_timings:     load time =   638.48 ms\n",
      "whisper_print_timings:     fallbacks =   0 p /   0 h\n",
      "whisper_print_timings:      mel time =    97.83 ms\n",
      "whisper_print_timings:   sample time =   216.74 ms /   125 runs (    1.73 ms per run)\n",
      "whisper_print_timings:   encode time = 43353.21 ms /     2 runs (21676.60 ms per run)\n",
      "whisper_print_timings:   decode time = 10196.76 ms /   119 runs (   85.69 ms per run)\n",
      "whisper_print_timings:   prompt time =   525.55 ms /     4 runs (  131.39 ms per run)\n",
      "whisper_print_timings:    total time = 55438.02 ms\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "."
     ]
    }
   ],
   "source": [
    "import pysrt\n",
    "import time\n",
    "\n",
    "# controlla se il file srt esiste\n",
    "while not os.path.exists(cartella_elaborazioni+\"/episode.wav.srt\"):\n",
    "    time.sleep(8)\n",
    "    print(\".\", end=\"\")\n",
    "\n",
    "subs = pysrt.open(cartella_elaborazioni+\"/episode.wav.srt\")\n",
    "\n",
    "for sub in subs:\n",
    "    sub.start *= fattore_velocita_video\n",
    "    sub.end *= fattore_velocita_video\n",
    "\n",
    "subs.save(cartella_elaborazioni+\"/episode_velocizzato.wav.srt\", encoding='utf-8')"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "3. Applicare distorsioni"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "aspect_ratio 4:3 848 x 636\n",
      "schiacciando x 0.479\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ffmpeg version 4.4.2-0ubuntu0.22.04.1 Copyright (c) 2000-2021 the FFmpeg developers\n",
      "  built with gcc 11 (Ubuntu 11.2.0-19ubuntu1)\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\n",
      "  libavutil      56. 70.100 / 56. 70.100\n",
      "  libavcodec     58.134.100 / 58.134.100\n",
      "  libavformat    58. 76.100 / 58. 76.100\n",
      "  libavdevice    58. 13.100 / 58. 13.100\n",
      "  libavfilter     7.110.100 /  7.110.100\n",
      "  libswscale      5.  9.100 /  5.  9.100\n",
      "  libswresample   3.  9.100 /  3.  9.100\n",
      "  libpostproc    55.  9.100 / 55.  9.100\n",
      "Input #0, matroska,webm, from 'elaborazioni/simpson_velocizzato.mkv':\n",
      "  Metadata:\n",
      "    MINOR_VERSION   : 512\n",
      "    COMPATIBLE_BRANDS: isomiso2avc1mp41\n",
      "    MAJOR_BRAND     : isom\n",
      "    ENCODER         : Lavf58.76.100\n",
      "  Duration: 00:00:24.09, start: 0.000000, bitrate: 965 kb/s\n",
      "  Stream #0:0: Video: h264 (High), yuv420p(progressive), 848x636 [SAR 1:1 DAR 4:3], 24 fps, 24 tbr, 1k tbn, 48 tbc (default)\n",
      "    Metadata:\n",
      "      HANDLER_NAME    : VideoHandler\n",
      "      VENDOR_ID       : [0][0][0][0]\n",
      "      ENCODER         : Lavc58.134.100 libx264\n",
      "      DURATION        : 00:00:24.087000000\n",
      "  Stream #0:1: Audio: vorbis, 44100 Hz, stereo, fltp (default)\n",
      "    Metadata:\n",
      "      HANDLER_NAME    : VideoHandler\n",
      "      VENDOR_ID       : [0][0][0][0]\n",
      "      ENCODER         : Lavc58.134.100 libvorbis\n",
      "      DURATION        : 00:00:24.050000000\n",
      "Multiple -filter, -af or -vf options specified for stream 0, only the last option '-filter:v scale=w=0.479*iw:ih,setsar=1' will be used.\n",
      "Stream mapping:\n",
      "  Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))\n",
      "  Stream #0:1 -> #0:1 (vorbis (native) -> vorbis (libvorbis))\n",
      "Press [q] to stop, [?] for help\n",
      "[libx264 @ 0x5651bae13540] using SAR=1/1\n",
      "[libx264 @ 0x5651bae13540] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2\n",
      "[libx264 @ 0x5651bae13540] profile High, level 3.0, 4:2:0, 8-bit\n",
      "[libx264 @ 0x5651bae13540] 264 - core 163 r3060 5db6aa6 - H.264/MPEG-4 AVC codec - Copyleft 2003-2021 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=12 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=24 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00\n",
      "Output #0, matroska, to 'elaborazioni/simpson_edit.mkv':\n",
      "  Metadata:\n",
      "    MINOR_VERSION   : 512\n",
      "    COMPATIBLE_BRANDS: isomiso2avc1mp41\n",
      "    MAJOR_BRAND     : isom\n",
      "    encoder         : Lavf58.76.100\n",
      "  Stream #0:0: Video: h264 (H264 / 0x34363248), yuv420p(tv, progressive), 406x636 [SAR 1:1 DAR 203:318], q=2-31, 24 fps, 1k tbn (default)\n",
      "    Metadata:\n",
      "      HANDLER_NAME    : VideoHandler\n",
      "      VENDOR_ID       : [0][0][0][0]\n",
      "      DURATION        : 00:00:24.087000000\n",
      "      encoder         : Lavc58.134.100 libx264\n",
      "    Side data:\n",
      "      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A\n",
      "  Stream #0:1: Audio: vorbis (oV[0][0] / 0x566F), 44100 Hz, stereo, fltp (default)\n",
      "    Metadata:\n",
      "      HANDLER_NAME    : VideoHandler\n",
      "      VENDOR_ID       : [0][0][0][0]\n",
      "      DURATION        : 00:00:24.050000000\n",
      "      encoder         : Lavc58.134.100 libvorbis\n",
      "frame=  514 fps=203 q=28.0 size=    1280kB time=00:00:21.71 bitrate= 482.9kbits/s speed=8.58x    \r"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "frame=  577 fps=196 q=-1.0 Lsize=    1822kB time=00:00:24.04 bitrate= 620.6kbits/s speed=8.17x    \n",
      "video:1547kB audio:257kB subtitle:0kB other streams:0kB global headers:4kB muxing overhead: 0.984732%\n",
      "[libx264 @ 0x5651bae13540] frame I:10    Avg QP:17.86  size: 41613\n",
      "[libx264 @ 0x5651bae13540] frame P:173   Avg QP:21.39  size:  4654\n",
      "[libx264 @ 0x5651bae13540] frame B:394   Avg QP:26.55  size:   920\n",
      "[libx264 @ 0x5651bae13540] consecutive B-frames:  3.6% 13.2%  8.3% 74.9%\n",
      "[libx264 @ 0x5651bae13540] mb I  I16..4:  8.7% 36.8% 54.5%\n",
      "[libx264 @ 0x5651bae13540] mb P  I16..4:  0.8%  2.0%  2.5%  P16..4: 20.4%  7.8%  6.1%  0.0%  0.0%    skip:60.5%\n",
      "[libx264 @ 0x5651bae13540] mb B  I16..4:  0.1%  0.2%  0.2%  B16..8: 12.4%  3.5%  1.3%  direct: 0.7%  skip:81.7%  L0:42.5% L1:51.6% BI: 5.9%\n",
      "[libx264 @ 0x5651bae13540] 8x8 transform intra:37.0% inter:40.8%\n",
      "[libx264 @ 0x5651bae13540] coded y,uvDC,uvAC intra: 62.2% 83.6% 71.0% inter: 4.6% 7.6% 1.6%\n",
      "[libx264 @ 0x5651bae13540] i16 v,h,dc,p: 47% 28% 14% 12%\n",
      "[libx264 @ 0x5651bae13540] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 26% 17% 29%  4%  4%  5%  4%  5%  6%\n",
      "[libx264 @ 0x5651bae13540] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 36% 14% 15%  5%  5%  9%  4%  8%  4%\n",
      "[libx264 @ 0x5651bae13540] i8c dc,h,v,p: 40% 21% 28% 10%\n",
      "[libx264 @ 0x5651bae13540] Weighted P-Frames: Y:0.0% UV:0.0%\n",
      "[libx264 @ 0x5651bae13540] ref P L0: 69.6%  5.6% 16.6%  8.3%\n",
      "[libx264 @ 0x5651bae13540] ref B L0: 85.5% 11.7%  2.8%\n",
      "[libx264 @ 0x5651bae13540] ref B L1: 95.6%  4.4%\n",
      "[libx264 @ 0x5651bae13540] kb/s:526.97\n"
     ]
    }
   ],
   "source": [
    "# 3.1 get current aspect ratio (specifiy its mp4)\n",
    "def clac_frame_info(filename):\n",
    "    ffprobe_cmd = (\"ffprobe -v quiet -print_format json -show_streams \"+ filename).split()\n",
    "    ffprobe = subprocess.Popen(ffprobe_cmd, stdout=subprocess.PIPE)\n",
    "    ffprobe = json.loads(ffprobe.stdout.read().decode(\"utf-8\"))\n",
    "    aspect_ratio = ffprobe[\"streams\"][0][\"display_aspect_ratio\"]\n",
    "    altezza = ffprobe[\"streams\"][0][\"height\"]\n",
    "    lunghezza = ffprobe[\"streams\"][0][\"width\"]\n",
    "    return aspect_ratio, lunghezza,  altezza\n",
    "\n",
    "\n",
    "aspect_ratio, lunghezza,  altezza = clac_frame_info(cartella_elaborazioni+\"/simpson_velocizzato.mkv\")\n",
    "print(\"aspect_ratio\", aspect_ratio, lunghezza, \"x\", altezza)\n",
    "\n",
    "\n",
    "\n",
    "while int(lunghezza * fattore_schiacciamento)%2 != 0:\n",
    "    fattore_schiacciamento -= 0.001\n",
    "    print(\"schiacciando x\", fattore_schiacciamento)\n",
    "\n",
    "\n",
    "# 3.2 mettere filtri riflettere il video sull asse y\n",
    "ffmpeg_cmd = f\"ffmpeg -y -i {cartella_elaborazioni}/simpson_velocizzato.mkv \"\n",
    "ffmpeg_cmd += \" -vf 'hflip' \"            # flip\n",
    "ffmpeg_cmd += f\" -vf eq=saturation={fattore_desat} \"        # meno saturazione \n",
    "ffmpeg_cmd += f\" -vf scale=w={fattore_schiacciamento}*iw:ih,setsar=1 \"  # schiacciamento\n",
    "ffmpeg_cmd += f\"{cartella_elaborazioni}/simpson_edit.mkv\"\n",
    "ffmpeg = subprocess.Popen(ffmpeg_cmd.split(), stdout=subprocess.PIPE)\n",
    "ffmpeg = ffmpeg.stdout.read().decode(\"utf-8\")\n",
    "print(ffmpeg)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "aspect_ratio 203:318 406 x 636\n",
      "aspect_ratio 89:159 356 x 636\n"
     ]
    }
   ],
   "source": [
    "\n",
    "aspect_ratio, lunghezza,  altezza = clac_frame_info(cartella_elaborazioni+\"/simpson_edit.mkv\")\n",
    "print(\"aspect_ratio\", aspect_ratio, lunghezza, \"x\", altezza)\n",
    "\n",
    "\n",
    "# 3.4 riportare a 9:16 con crop\n",
    "calc_new_width = int(altezza * (9 / 16))\n",
    "ffmpeg_cmd = f\"ffmpeg -v quiet -i {cartella_elaborazioni}/simpson_edit.mkv \"\n",
    "ffmpeg_cmd += f\"-vf crop={calc_new_width}:{altezza} \"\n",
    "ffmpeg_cmd += f\" {cartella_elaborazioni}/simpson_cropped.mp4\"\n",
    "\n",
    "ffmpeg = subprocess.Popen(ffmpeg_cmd.split(), stdout=subprocess.PIPE)\n",
    "ffmpeg = ffmpeg.stdout.read().decode(\"utf-8\")\n",
    "\n",
    "aspect_ratio, lunghezza,  altezza = clac_frame_info(f\"{cartella_elaborazioni}/simpson_cropped.mp4\")\n",
    "print(\"aspect_ratio\", aspect_ratio, lunghezza, \"x\", altezza)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "4. applica sottotitoli"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [],
   "source": [
    "if applica_sottotitoli:\n",
    "    ffmpeg_cmd = f\"ffmpeg -y -i {cartella_elaborazioni}/simpson_cropped.mp4 \"\n",
    "    ffmpeg_cmd += f\"-vf subtitles={cartella_elaborazioni}/episode_velocizzato.wav.srt\"\n",
    "    ffmpeg_cmd += \" -c:a copy \"\n",
    "    ffmpeg_cmd += f\" {cartella_elaborazioni}/{result_video_name}\"\n",
    "\n",
    "    ffmpeg = subprocess.Popen(ffmpeg_cmd.split(), stdout=subprocess.PIPE)\n",
    "    ffmpeg = ffmpeg.stdout.read().decode(\"utf-8\")\n",
    "else :\n",
    "    shutil.copyfile(f\"{cartella_elaborazioni}/simpson_cropped.mp4\", f\"{cartella_elaborazioni}/{result_video_name}\")\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "4. sposta il risultato"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "# crea cartella result se non esiste\n",
    "shutil.rmtree(result_folder, ignore_errors=True)\n",
    "if not os.path.exists(result_folder):\n",
    "    os.mkdir(result_folder)\n",
    "\n",
    "\n",
    "# 4.1 copia il video nella cartella result\n",
    "shutil.copy(os.path.join(cartella_elaborazioni, result_video_name), result_folder)\n",
    "\n",
    "# 4.2 copia il sottotitolo nella cartella result\n",
    "shutil.copy(os.path.join(cartella_elaborazioni, \"episode.wav.txt\"), result_folder)\n",
    "shutil.copy(os.path.join(cartella_elaborazioni, \"episode_velocizzato.wav.srt\"), result_folder)\n",
    "\n",
    "# 4.3 elimina la cartella elaborazioni\n",
    "shutil.rmtree(cartella_elaborazioni, ignore_errors=True)\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Note: you may need to restart the kernel to use updated packages.\n"
     ]
    }
   ],
   "source": [
    "%pip -q install google-auth google-auth-oauthlib google-auth-httplib2 google-api-python-client"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " Prima lo cattureremo e poi lo riporteremo da dove proviene.\n",
      " Non sembra fatto carino.\n",
      " Hey, marino!\n",
      " Chiudi la finestra!\n",
      " Allora, oggi dite dove il verne o vi friggiamo?\n",
      " Devo proprio dirvelo, non siete molto gentili.\n",
      " Diteci dove il verne o vi friggiamo.\n",
      " Per favore?\n",
      " No!\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# stampa contenuto della cartella result/episode.wav.txt\n",
    "with open(os.path.join(result_folder, \"episode.wav.txt\")) as f:\n",
    "    print(f.read())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "import os\n",
    "import google.oauth2.credentials\n",
    "from google_auth_oauthlib.flow import InstalledAppFlow\n",
    "from googleapiclient.discovery import build\n",
    "from googleapiclient.http import MediaFileUpload\n",
    "\n",
    "# Define the scopes and API version\n",
    "SCOPES = [\"https://www.googleapis.com/auth/youtube.upload\"]\n",
    "API_VERSION = \"v3\"\n",
    "\n",
    "def authenticate_and_upload_video(client_secret_file, video_file_path, video_title, video_description):\n",
    "\n",
    "    # Create the flow object to handle the OAuth 2.0 authorization flow.\n",
    "    flow = InstalledAppFlow.from_client_secrets_file(client_secret_file, SCOPES)\n",
    "    credentials = flow.run_local_server()\n",
    "\n",
    "    # save credentials as token to reuse later\n",
    "    with open(\"token.txt\", \"w\") as f:\n",
    "        f.write(credentials)\n",
    "\n",
    "\n",
    "\n",
    "    # Build the YouTube API service\n",
    "    youtube = build(\"youtube\", API_VERSION, credentials=credentials)\n",
    "\n",
    "    # Upload video\n",
    "    request_body = {\n",
    "        \"snippet\": {\n",
    "            \"title\": video_title,\n",
    "            \"description\": video_description,\n",
    "        },\n",
    "        \"status\": {\n",
    "            # \"privacyStatus\": \"public\",  # You can change this privacy status\n",
    "            # \"madeForKids\": False,\n",
    "            \"selfDeclaredMadeForKids\": False\n",
    "        },\n",
    "        # category: fun\n",
    "        \"category\": \"24\",\n",
    "    }\n",
    "\n",
    "    media = MediaFileUpload(video_file_path)\n",
    "\n",
    "    response = youtube.videos().insert(\n",
    "        part=\"snippet,status\",\n",
    "        body=request_body,\n",
    "        media_body=media,\n",
    "        \n",
    "    ).execute()\n",
    "\n",
    "    print(\"Video uploaded:\", response['snippet']['title'])\n",
    "\n",
    "VIDEO_TITLE = input(\"Title for your video\")\n",
    "VIDEO_DESCRIPTION = input(\"descrizione\")\n",
    "\n",
    "# authenticate_and_upload_video(CLIENT_SECRET_FILE, VIDEO_FILE_PATH, VIDEO_TITLE, VIDEO_DESCRIPTION)\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [],
   "source": [
    "from playwright.async_api import Playwright, async_playwright, expect\n",
    "\n",
    "\n",
    "playwright = await async_playwright().start()\n",
    "browser = await playwright.firefox.launch(headless = False, slow_mo=500)\n",
    "page = await browser.new_page()\n",
    "await page.goto(\"https://accounts.google.com/v3/signin/identifier?continue=https%3A%2F%2Fstudio.youtube.com%2F&followup=https%3A%2F%2Fstudio.youtube.com%2F&ifkv=AYZoVhe-1OkH6jYWAlTi4JzkSKeJ9qCCMy4ZWeOvhXr2J74P6WTl6RUAWM3Z5cdsrifLIqvAFU9b9g&passive=1209600&service=youtube&flowName=GlifWebSignIn&flowEntry=ServiceLogin&dsh=S-1676791964%3A1696371531471641&theme=glif\")\n",
    "await page.get_by_role(\"textbox\", name=\"Email or phone\").fill(\"scarpedimianonna@gmail.com\")\n",
    "await page.get_by_role(\"button\", name=\"Next\").click()\n",
    "await page.get_by_role(\"textbox\", name=\"Enter your password\").click()\n",
    "await page.get_by_role(\"textbox\", name=\"Enter your password\").fill(\"Gazzettino22\")\n",
    "await page.get_by_role(\"button\", name=\"Next\").click()\n",
    "\n",
    "await page.get_by_role(\"button\", name=\"Carica video\").click()\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [],
   "source": [
    "# await page.get_by_role(\"button\", name=\"Seleziona file\").click()\n",
    "# await page.get_by_role(\"button\", name=\"Seleziona file\").set_input_files(\"result/result.mp4\")\n",
    "# drag and drop 'result/result.mp4' on get_by_role(\"button\", name=\"Seleziona file\")\n",
    "# use filechooser \n",
    "\n",
    "\n",
    "await page.locator(\"#title-wrapper\").get_by_text(\"result\").click()\n",
    "await page.locator(\"#title-wrapper\").get_by_text(\"result\").dblclick()\n",
    "await page.locator(\"#title-wrapper\").get_by_text(\"result\").fill(VIDEO_TITLE)\n",
    "await page.locator(\"#description-wrapper #textbox\").fill(VIDEO_DESCRIPTION)\n",
    "await page.get_by_role(\"radio\", name=\"No, non sono destinati ai bambini\").click()\n",
    "await page.get_by_role(\"button\", name=\"Mostra altro\").click()\n",
    "await page.locator(\"#language-input\").get_by_text(\"Seleziona\").click()\n",
    "await page.get_by_text(\"Italiano\").click()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [
    {
     "ename": "Error",
     "evalue": "Error: strict mode violation: get_by_text(\"Intrattenimento\") resolved to 2 elements:\n    1) <span class=\"dropdown-trigger-text style-scope ytcp-te…>↵    Intrattenimento↵  </span> aka locator(\"#category\").get_by_text(\"Intrattenimento\")\n    2) <yt-formatted-string class=\"item-text main-text style-scope ytcp-text…>Intrattenimento</yt-formatted-string> aka get_by_role(\"option\", name=\"Intrattenimento\").get_by_text(\"Intrattenimento\")\n\n=========================== logs ===========================\nwaiting for get_by_text(\"Intrattenimento\")\n============================================================",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mError\u001b[0m                                     Traceback (most recent call last)",
      "Cell \u001b[0;32mIn[90], line 6\u001b[0m\n\u001b[1;32m      2\u001b[0m \u001b[39mawait\u001b[39;00m page\u001b[39m.\u001b[39mlocator(\u001b[39m\"\u001b[39m\u001b[39m#category\u001b[39m\u001b[39m\"\u001b[39m)\u001b[39m.\u001b[39mhover()\n\u001b[1;32m      4\u001b[0m \u001b[39mawait\u001b[39;00m page\u001b[39m.\u001b[39mlocator(\u001b[39m\"\u001b[39m\u001b[39m#category\u001b[39m\u001b[39m\"\u001b[39m)\u001b[39m.\u001b[39mclick()\n\u001b[0;32m----> 6\u001b[0m \u001b[39mawait\u001b[39;00m page\u001b[39m.\u001b[39mget_by_text(\u001b[39m\"\u001b[39m\u001b[39mIntrattenimento\u001b[39m\u001b[39m\"\u001b[39m)\u001b[39m.\u001b[39mclick()\n",
      "File \u001b[0;32m~/.local/lib/python3.10/site-packages/playwright/async_api/_generated.py:15298\u001b[0m, in \u001b[0;36mLocator.click\u001b[0;34m(self, modifiers, position, delay, button, click_count, timeout, force, no_wait_after, trial)\u001b[0m\n\u001b[1;32m  15211\u001b[0m \u001b[39masync\u001b[39;00m \u001b[39mdef\u001b[39;00m \u001b[39mclick\u001b[39m(\n\u001b[1;32m  15212\u001b[0m     \u001b[39mself\u001b[39m,\n\u001b[1;32m  15213\u001b[0m     \u001b[39m*\u001b[39m,\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m  15224\u001b[0m     trial: typing\u001b[39m.\u001b[39mOptional[\u001b[39mbool\u001b[39m] \u001b[39m=\u001b[39m \u001b[39mNone\u001b[39;00m\n\u001b[1;32m  15225\u001b[0m ) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m \u001b[39mNone\u001b[39;00m:\n\u001b[1;32m  15226\u001b[0m \u001b[39m    \u001b[39m\u001b[39m\"\"\"Locator.click\u001b[39;00m\n\u001b[1;32m  15227\u001b[0m \n\u001b[1;32m  15228\u001b[0m \u001b[39m    Click an element.\u001b[39;00m\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m  15294\u001b[0m \u001b[39m        to `false`. Useful to wait until the element is ready for the action without performing it.\u001b[39;00m\n\u001b[1;32m  15295\u001b[0m \u001b[39m    \"\"\"\u001b[39;00m\n\u001b[1;32m  15297\u001b[0m     \u001b[39mreturn\u001b[39;00m mapping\u001b[39m.\u001b[39mfrom_maybe_impl(\n\u001b[0;32m> 15298\u001b[0m         \u001b[39mawait\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_impl_obj\u001b[39m.\u001b[39mclick(\n\u001b[1;32m  15299\u001b[0m             modifiers\u001b[39m=\u001b[39mmapping\u001b[39m.\u001b[39mto_impl(modifiers),\n\u001b[1;32m  15300\u001b[0m             position\u001b[39m=\u001b[39mposition,\n\u001b[1;32m  15301\u001b[0m             delay\u001b[39m=\u001b[39mdelay,\n\u001b[1;32m  15302\u001b[0m             button\u001b[39m=\u001b[39mbutton,\n\u001b[1;32m  15303\u001b[0m             clickCount\u001b[39m=\u001b[39mclick_count,\n\u001b[1;32m  15304\u001b[0m             timeout\u001b[39m=\u001b[39mtimeout,\n\u001b[1;32m  15305\u001b[0m             force\u001b[39m=\u001b[39mforce,\n\u001b[1;32m  15306\u001b[0m             noWaitAfter\u001b[39m=\u001b[39mno_wait_after,\n\u001b[1;32m  15307\u001b[0m             trial\u001b[39m=\u001b[39mtrial,\n\u001b[1;32m  15308\u001b[0m         )\n\u001b[1;32m  15309\u001b[0m     )\n",
      "File \u001b[0;32m~/.local/lib/python3.10/site-packages/playwright/_impl/_locator.py:146\u001b[0m, in \u001b[0;36mLocator.click\u001b[0;34m(self, modifiers, position, delay, button, clickCount, timeout, force, noWaitAfter, trial)\u001b[0m\n\u001b[1;32m    133\u001b[0m \u001b[39masync\u001b[39;00m \u001b[39mdef\u001b[39;00m \u001b[39mclick\u001b[39m(\n\u001b[1;32m    134\u001b[0m     \u001b[39mself\u001b[39m,\n\u001b[1;32m    135\u001b[0m     modifiers: List[KeyboardModifier] \u001b[39m=\u001b[39m \u001b[39mNone\u001b[39;00m,\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m    143\u001b[0m     trial: \u001b[39mbool\u001b[39m \u001b[39m=\u001b[39m \u001b[39mNone\u001b[39;00m,\n\u001b[1;32m    144\u001b[0m ) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m \u001b[39mNone\u001b[39;00m:\n\u001b[1;32m    145\u001b[0m     params \u001b[39m=\u001b[39m locals_to_params(\u001b[39mlocals\u001b[39m())\n\u001b[0;32m--> 146\u001b[0m     \u001b[39mreturn\u001b[39;00m \u001b[39mawait\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_frame\u001b[39m.\u001b[39mclick(\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_selector, strict\u001b[39m=\u001b[39m\u001b[39mTrue\u001b[39;00m, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mparams)\n",
      "File \u001b[0;32m~/.local/lib/python3.10/site-packages/playwright/_impl/_frame.py:489\u001b[0m, in \u001b[0;36mFrame.click\u001b[0;34m(self, selector, modifiers, position, delay, button, clickCount, timeout, force, noWaitAfter, strict, trial)\u001b[0m\n\u001b[1;32m    475\u001b[0m \u001b[39masync\u001b[39;00m \u001b[39mdef\u001b[39;00m \u001b[39mclick\u001b[39m(\n\u001b[1;32m    476\u001b[0m     \u001b[39mself\u001b[39m,\n\u001b[1;32m    477\u001b[0m     selector: \u001b[39mstr\u001b[39m,\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m    487\u001b[0m     trial: \u001b[39mbool\u001b[39m \u001b[39m=\u001b[39m \u001b[39mNone\u001b[39;00m,\n\u001b[1;32m    488\u001b[0m ) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m \u001b[39mNone\u001b[39;00m:\n\u001b[0;32m--> 489\u001b[0m     \u001b[39mawait\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_channel\u001b[39m.\u001b[39msend(\u001b[39m\"\u001b[39m\u001b[39mclick\u001b[39m\u001b[39m\"\u001b[39m, locals_to_params(\u001b[39mlocals\u001b[39m()))\n",
      "File \u001b[0;32m~/.local/lib/python3.10/site-packages/playwright/_impl/_connection.py:44\u001b[0m, in \u001b[0;36mChannel.send\u001b[0;34m(self, method, params)\u001b[0m\n\u001b[1;32m     43\u001b[0m \u001b[39masync\u001b[39;00m \u001b[39mdef\u001b[39;00m \u001b[39msend\u001b[39m(\u001b[39mself\u001b[39m, method: \u001b[39mstr\u001b[39m, params: Dict \u001b[39m=\u001b[39m \u001b[39mNone\u001b[39;00m) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m Any:\n\u001b[0;32m---> 44\u001b[0m     \u001b[39mreturn\u001b[39;00m \u001b[39mawait\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_connection\u001b[39m.\u001b[39mwrap_api_call(\n\u001b[1;32m     45\u001b[0m         \u001b[39mlambda\u001b[39;00m: \u001b[39mself\u001b[39m\u001b[39m.\u001b[39minner_send(method, params, \u001b[39mFalse\u001b[39;00m)\n\u001b[1;32m     46\u001b[0m     )\n",
      "File \u001b[0;32m~/.local/lib/python3.10/site-packages/playwright/_impl/_connection.py:419\u001b[0m, in \u001b[0;36mConnection.wrap_api_call\u001b[0;34m(self, cb, is_internal)\u001b[0m\n\u001b[1;32m    417\u001b[0m     \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_api_zone\u001b[39m.\u001b[39mset(metadata)\n\u001b[1;32m    418\u001b[0m \u001b[39mtry\u001b[39;00m:\n\u001b[0;32m--> 419\u001b[0m     \u001b[39mreturn\u001b[39;00m \u001b[39mawait\u001b[39;00m cb()\n\u001b[1;32m    420\u001b[0m \u001b[39mfinally\u001b[39;00m:\n\u001b[1;32m    421\u001b[0m     \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_api_zone\u001b[39m.\u001b[39mset(\u001b[39mNone\u001b[39;00m)\n",
      "File \u001b[0;32m~/.local/lib/python3.10/site-packages/playwright/_impl/_connection.py:79\u001b[0m, in \u001b[0;36mChannel.inner_send\u001b[0;34m(self, method, params, return_as_dict)\u001b[0m\n\u001b[1;32m     77\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m callback\u001b[39m.\u001b[39mfuture\u001b[39m.\u001b[39mdone():\n\u001b[1;32m     78\u001b[0m     callback\u001b[39m.\u001b[39mfuture\u001b[39m.\u001b[39mcancel()\n\u001b[0;32m---> 79\u001b[0m result \u001b[39m=\u001b[39m \u001b[39mnext\u001b[39;49m(\u001b[39miter\u001b[39;49m(done))\u001b[39m.\u001b[39;49mresult()\n\u001b[1;32m     80\u001b[0m \u001b[39m# Protocol now has named return values, assume result is one level deeper unless\u001b[39;00m\n\u001b[1;32m     81\u001b[0m \u001b[39m# there is explicit ambiguity.\u001b[39;00m\n\u001b[1;32m     82\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m result:\n",
      "\u001b[0;31mError\u001b[0m: Error: strict mode violation: get_by_text(\"Intrattenimento\") resolved to 2 elements:\n    1) <span class=\"dropdown-trigger-text style-scope ytcp-te…>↵    Intrattenimento↵  </span> aka locator(\"#category\").get_by_text(\"Intrattenimento\")\n    2) <yt-formatted-string class=\"item-text main-text style-scope ytcp-text…>Intrattenimento</yt-formatted-string> aka get_by_role(\"option\", name=\"Intrattenimento\").get_by_text(\"Intrattenimento\")\n\n=========================== logs ===========================\nwaiting for get_by_text(\"Intrattenimento\")\n============================================================"
     ]
    }
   ],
   "source": [
    "# page.locator(\"#category\") into view \n",
    "await page.locator(\"#category\").hover()\n",
    "\n",
    "await page.locator(\"#category\").click()\n",
    "\n",
    "await page.get_by_text(\"Intrattenimento\").click()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "# await page.get_by_role(\"button\", name=\"Avanti\").click()\n",
    "# await page.get_by_role(\"button\", name=\"Avanti\").click()\n",
    "# await page.get_by_role(\"button\", name=\"Avanti\").click()\n",
    "# await page.get_by_role(\"radio\", name=\"Pubblico\").click()\n",
    "# await page.get_by_role(\"button\", name=\"Pubblica\").click()\n",
    "\n",
    "await browser.close()\n",
    "await playwright.stop()"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "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.10.12"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
