From 7eecbe06879f5ac4885f0471c224dfb1ada6b436 Mon Sep 17 00:00:00 2001 From: puffaboo Date: Fri, 1 Jul 2022 20:59:48 +0100 Subject: [PATCH] added fullscreening of video, chrome using default data dir --- src/browser.rs | 67 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 57 insertions(+), 10 deletions(-) diff --git a/src/browser.rs b/src/browser.rs index ae4b185..6be2553 100644 --- a/src/browser.rs +++ b/src/browser.rs @@ -1,23 +1,56 @@ -use std::{thread, time::Duration}; +use std::{env, path::Path}; -use futures::TryFutureExt; -use thirtyfour::{ - prelude::ElementQueryable, session::handle::SessionHandle, By, DesiredCapabilities, WebDriver, -}; +use thirtyfour::{session::handle::SessionHandle, By, DesiredCapabilities, WebDriver}; pub struct BrowserSession { driver: WebDriver, } +const DATA_DIR_ARG: &str = "--user-data-dir"; +#[cfg(target_os = "linux")] +const DATA_DIR_CHROMIUM: &str = "/.config/chromium"; +#[cfg(target_os = "linux")] +const DATA_DIR_CHROME: &str = "~/.config/google-chrome"; +#[cfg(target_os = "linux")] +const HOME_VARIABLE: &str = "HOME"; +#[cfg(target_os = "windows")] +const DATA_DIR_CHROME: &str = "\\Google\\Chrome\\User Data"; +#[cfg(target_os = "windows")] +const DATA_DIR_CHROMIUM: &str = "\\Google\\Chromium\\User Data"; +#[cfg(target_os = "windows")] +const HOME_VARIABLE: &str = "LOCALAPPDATA"; #[derive(Clone)] pub struct BrowserHandle { handle: SessionHandle, } +fn get_data_dir() -> String { + let mut home = String::new(); + for (key, val) in env::vars() { + if key == HOME_VARIABLE { + home = val; + } + } + if home.is_empty() { + panic!("cannot find home env variable"); + } + if Path::new(format!("{}{}", home, DATA_DIR_CHROMIUM).as_str()).exists() { + println!("{}{}", home, DATA_DIR_CHROMIUM); + return format!("{}{}", home, DATA_DIR_CHROMIUM); + } + println!("{}{}", home, DATA_DIR_CHROME); + return format!("{}{}", home, DATA_DIR_CHROME); +} + impl BrowserSession { pub async fn new() -> Result { - let caps = DesiredCapabilities::chrome(); + // TODO: error if chrome is already running + let mut caps = DesiredCapabilities::chrome(); + // Use the normal data directory (for extensions and logins) + caps.add_chrome_arg(format!("{}={}", DATA_DIR_ARG, get_data_dir()).as_str())?; let driver = WebDriver::new("http://localhost:6444", caps).await?; + + println!("started browser"); Ok(Self { driver: driver }) } @@ -35,17 +68,31 @@ impl BrowserSession { impl BrowserHandle { pub async fn start(&self, start_url: &str) -> Result<(), anyhow::Error> { - // self.handle.fullscreen_window().await?; - self.go_to(format!("http://{}", start_url).as_str()).await?; + self.handle.fullscreen_window().await?; + println!("!"); + self.handle + .get(format!("http://{}", start_url)) + .await + .unwrap_or(()); // Ignore errors ig? idfk it errors out in some weirdo way but it works + println!("?"); Ok(()) } - async fn decline_cookies(&self) -> Result<(), anyhow::Error> { + async fn fullscreen_youtube(&self) -> Result<(), anyhow::Error> { + let elems = self + .handle + .find_elements(By::ClassName("ytp-fullscreen-button")) + .await?; + if elems.len() != 0 { + if let Some(button) = elems.first() { + button.click().await?; + } + } Ok(()) } async fn youtube(&self) -> Result<(), anyhow::Error> { - self.decline_cookies().await?; + self.fullscreen_youtube().await?; Ok(()) }