An automated, headless YouTube Uploader

Overview

Logo

MIT License Code style: black
Platform: YouTube Uses Docker Automation supporting Firefox and Chrome
Firefox supported Chrome supported

An automated, headless YouTube Uploader

Authors: Christian C., Moritz M., Luca S.
Related Projects: YouTube Watcher, Twitch Compilation Creator, Neural Networks


About

This project aims to automate the upload process for YouTube Videos. Since videos can only be publicly uploaded through the YouTube Data API by using a Google Workspaces Account (not free!), we decided to create a headless uploader using Selenium and Docker. This approach also bypasses API restrictions (e.g. Rate Limits/Endcards can't be set through the API).

Note: Because the upload process is often updated by Google, the code might not work when you try it! Often, there are only minor changes that have to be made. If you find yourself in this situation, please open an Issue or provide a quick fix in form of a Pull Request to make sure that the codebase stays up to date!

This project is for educational purposes only. Automating video uploads to YouTube with automation software might be against YouTube's Terms of Service. Even though our tests went smoothly, one might encounter problems when using the YouTube Uploader extensively.

Setup

Dockerized Browser

To run the uploader in a headless mode, it needs to connect to a docker container. To test the uploader locally without using docker, this section can be skipped. Otherwise, the docker container can be started by executing the following steps:

  1. Install docker and docker-compose

Note: On Windows and Mac, docker-compose is already installed when installing docker.

  1. Clone/Download this repository
  2. Navigate to the root of the repository
  3. Run docker-compose up to start the docker container (append -d if you want to run it in a detached mode)

Note: Selenium can now connect to the browser via port 4444. In Python the connection can be established with the following command.

driver = webdriver.Remote(
    command_executor="http://127.0.0.1:4444/wd/hub",
    desired_capabilities=DesiredCapabilities.FIREFOX,
)

See main.py for more information.

  1. Continue with the YouTube Uploader Setup

YouTube Uploader

This project requires Poetry to install the required dependencies. Check out this link to install Poetry on your operating system.

Make sure you have installed Python 3.8! Otherwise Step 3 will let you know that you have no compatible Python version installed.

  1. Clone/Download this repository
  2. Navigate to the root of the repository
  3. Run poetry install to create a virtual environment with Poetry
  4. In a browser of your choice, login into the YouTube account that you want to use the uploader with
  5. Use a cookie extraction tool to extract the YouTube cookies into a JSON file (for example EditThisCookie [Chrome] or Cookie Quick Manager [Firefox])

Note: This is required so that the uploader is automatically logged in into the YouTube account using the cookies. Performing a Google login through automated software is extremely hard due to Google's bot detection/Login safety features

  1. Either run the dockerized Browser with docker-compose up, install geckodriver for a local Firefox or ChromeDriver for Chromium. Ensure that geckodriver/ChromeDriver are in a location in your $PATH.
  2. Run poetry run python main.py to run the program. Alternatively you can run poetry shell followed by python main.py. By default this connects to the dockerized Firefox Browser (headless). To automate a different Browser (not-headless) use the --browser [chrome/firefox] command line option.

Note: When using Docker, the video that should be uploaded needs to be in the repository's uploads folder. This is because REPOSITORY_ROOT/uploads/ is mounted to /uploads/ in the Docker container. Therefore, the video_path argument has to be passed in the following format: /uploads/VIDEO_FILE_NAME.xxx

Run Parameters

You can also get these definitions by running main.py --help

usage: main.py [-h] [-B {docker,chrome,firefox}] -l LOGIN_COOKIES [--thumbnail-path THUMBNAIL] -t TITLE -d DESCRIPTION [-g GAME] [-k KIDS] [-ut UPLOAD_TIME] video_path

positional arguments:
  video_path            Path to the video file. When using docker, this path has to be inside the container (default mount is /uploads/).

optional arguments:
  -h, --help            show this help message and exit
  -B {docker,chrome,firefox}, --browser {docker,chrome,firefox}
                        Select the driver/browser to use for executing the script (default: docker).
  -l LOGIN_COOKIES, --login-cookies-path LOGIN_COOKIES
                        A json file that contains the cookies required to sign into YouTube in the target browser.
  --thumbnail-path THUMBNAIL, -T THUMBNAIL
                        Path to the thumbnail file (default: None).
  -t TITLE, --title TITLE
                        This argument declares the title of the uploaded video.
  -d DESCRIPTION, --description DESCRIPTION
                        This argument declares the description of the uploaded video.
  -g GAME, --game GAME  This argument declares the game of the uploaded video (default: None).
  -k KIDS, --kids KIDS  Whether the video is made for kids or not. (default: False)
  -ut UPLOAD_TIME, --upload_time UPLOAD_TIME
                        This argument declares the scheduled upload time (UTC) of the uploaded video. (Example: 2021-04-04T20:00:00)
Comments
  • Selenium Error

    Selenium Error

    When trying upload by Docker:

    python3.8 main.py -B docker -l test.json -t testik -d test /uploads/videoname.mp4 INFO:root:Current progress: Upload complete ... Processing will begin shortly INFO:root:Current progress: Processing 95% ... INFO:root:Current progress: Processing 100% ... Traceback (most recent call last): File "main.py", line 137, in main() File "main.py", line 47, in main upload_file( File "/root/YouTubeUploader/src/upload.py", line 41, in upload_file _set_endcard(driver) File "/root/YouTubeUploader/src/upload.py", line 128, in _set_endcard driver.find_element_by_css_selector("div.card:nth-child(1)").click() File "/usr/local/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 598, in find_element_by_css_selector return self.find_element(by=By.CSS_SELECTOR, value=css_selector) File "/usr/local/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 976, in find_element return self.execute(Command.FIND_ELEMENT, { File "/usr/local/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute self.error_handler.check_response(response) File "/usr/local/lib/python3.8/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: div.card:nth-child(1)

    Video uploaded, but Visibility is draft

    opened by NecroBoy 7
  • assert

    assert "Channel dashboard" in driver.title

    At this point it fails:

    root@localhost:~/YouTubeUploader# poetry run python main.py --browser docker --login-cookies-path /root/YouTubeUploader/cookie.json --title test --description test /uploads/video.mp4
    The currently activated Python version 3.7.3 is not supported by the project (~3.8).
    Trying to find and use a compatible version.
    Using python3.8 (3.8.3)
    Traceback (most recent call last):
      File "main.py", line 137, in <module>
        main()
      File "main.py", line 45, in main
        assert "Channel dashboard" in driver.title
    AssertionError
    
    firefox_1  | 2021-06-01 10:19:00,040 INFO Included extra file "/etc/supervisor/conf.d/selenium.conf" during parsing
    firefox_1  | 2021-06-01 10:19:00,046 INFO supervisord started with pid 10
    firefox_1  | 2021-06-01 10:19:01,053 INFO spawned: 'xvfb' with pid 12
    firefox_1  | 2021-06-01 10:19:01,065 INFO spawned: 'selenium-standalone' with pid 13
    firefox_1  | 2021-06-01 10:19:02,079 INFO success: xvfb entered RUNNING state, process has stayed up for > than 0 seconds (startsecs)
    firefox_1  | 2021-06-01 10:19:02,080 INFO success: selenium-standalone entered RUNNING state, process has stayed up for > than 0 seconds (startsecs)
    firefox_1  | 10:19:02.107 INFO [GridLauncherV3.parse] - Selenium server version: 3.141.59, revision: e82be7d358
    firefox_1  | 10:19:02.408 INFO [GridLauncherV3.lambda$buildLaunchers$3] - Launching a standalone Selenium Server on port 4444
    firefox_1  | 2021-06-01 10:19:02.588:INFO::main: Logging initialized @1479ms to org.seleniumhq.jetty9.util.log.StdErrLog
    firefox_1  | 10:19:03.286 INFO [WebDriverServlet.<init>] - Initialising WebDriverServlet
    firefox_1  | 10:19:03.581 INFO [SeleniumServer.boot] - Selenium Server is up and running on port 4444
    firefox_1  | 10:19:07.231 INFO [ActiveSessionFactory.apply] - Capabilities are: {
    firefox_1  |   "acceptInsecureCerts": true,
    firefox_1  |   "browserName": "firefox",
    firefox_1  |   "marionette": true
    firefox_1  | }
    firefox_1  | 10:19:07.242 INFO [ActiveSessionFactory.lambda$apply$11] - Matched factory org.openqa.selenium.grid.session.remote.ServicedSession$Factory (provider: org.openqa.selenium.firefox.GeckoDriverService)
    firefox_1  | 1622542747308      geckodriver     INFO    Listening on 127.0.0.1:5100
    firefox_1  | 1622542748191      mozrunner::runner       INFO    Running command: "/usr/bin/firefox" "--marionette" "-foreground" "-no-remote" "-profile" "/tmp/rust_mozprofileW4SxKL"
    firefox_1  | [GFX1-]: glxtest: libpci missing
    firefox_1  | [GFX1-]: glxtest: libEGL missing
    firefox_1  | [GFX1-]: glxtest: libEGL missing
    firefox_1  | 1622542749234      Marionette      INFO    Marionette enabled
    firefox_1  | console.warn: SearchSettings: "get: No settings file exists, new profile?" (new Error("", "(unknown module)"))
    firefox_1  | 1622542753474      Marionette      INFO    Listening on port 35839
    firefox_1  | 1622542753597      Marionette      WARN    TLS certificate errors will be ignored for this session
    firefox_1  | 10:19:13.757 INFO [ProtocolHandshake.createSession] - Detected dialect: W3C
    firefox_1  | 10:19:13.973 INFO [RemoteSession$Factory.lambda$performHandshake$0] - Started new session 10dbd24c-c628-46ab-a407-1c9544b56f74 (org.openqa.selenium.firefox.GeckoDriverService)
    firefox_1  | 1622542766546      Marionette      INFO    Stopped listening on port 35839
    firefox_1  | JavaScript error: https://studio.youtube.com/s/6641c24f/creator_studio_mod_binary_core_v2.es.js, line 21003: NS_ERROR_NOT_INITIALIZED:
    firefox_1  | JavaScript error: https://studio.youtube.com/s/6641c24f/creator_studio_mod_binary_core_v2.es.js, line 21003: NS_ERROR_NOT_INITIALIZED:
    firefox_1  | JavaScript error: https://studio.youtube.com/s/6641c24f/creator_studio_mod_binary_core_v2.es.js, line 21003: NS_ERROR_NOT_INITIALIZED:
    firefox_1  | JavaScript error: https://studio.youtube.com/s/6641c24f/creator_studio_mod_binary_core_v2.es.js, line 21003: NS_ERROR_NOT_INITIALIZED:
    firefox_1  | JavaScript error: https://studio.youtube.com/s/6641c24f/creator_studio_mod_binary_core_v2.es.js, line 21003: NS_ERROR_NOT_INITIALIZED:
    firefox_1  | JavaScript error: resource:///modules/FaviconLoader.jsm, line 596: InvalidStateError: JSWindowActorChild.sendAsyncMessage: JSWindowActorChild cannot send at the moment
    firefox_1  | JavaScript error: resource:///modules/FaviconLoader.jsm, line 596: InvalidStateError: JSWindowActorChild.sendAsyncMessage: JSWindowActorChild cannot send at the moment
    firefox_1  |
    firefox_1  | ###!!! [Child][RunMessage] Error: Channel closing: too late to send/recv, messages will be lost
    firefox_1  |
    firefox_1  |
    firefox_1  | ###!!! [Child][RunMessage] Error: Channel closing: too late to send/recv, messages will be lost
    firefox_1  |
    firefox_1  |
    firefox_1  | ###!!! [Child][RunMessage] Error: Channel closing: too late to send/recv, messages will be lost
    firefox_1  |
    firefox_1  |
    firefox_1  | ###!!! [Child][RunMessage] Error: Channel closing: too late to send/recv, messages will be lost
    firefox_1  |
    firefox_1  |
    firefox_1  | ###!!! [Parent][RunMessage] Error: Channel closing: too late to send/recv, messages will be lost
    
    opened by VitharMe 2
  • How cookie json looks like?

    How cookie json looks like?

    Hey i using chrome plugs: https://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg and export cookie , but it's list, not json

    opened by milukun 2
  • Selenium module not found error

    Selenium module not found error

    I get module not found error for selinium. I installed with pip install selinium. Selenium located in : /home/admin/.local/lib/python3.8/site-packages

    sudo docker ps -a

    CONTAINER ID   IMAGE                         COMMAND                  CREATED        STATUS                    PORTS                                                 NAMES
    7f9aa3db   selenium/standalone-firefox   "/opt/bin/entry_poin…"   12 hours ago   Up 17 minutes             0.0.0.0:4444->4444/tcp, :::4444->4444/tcp, 5900/tcp   youtubeuploader_firefox_1
    f2eb99409   hello-world                   "/hello"                 14 hours ago   Exited (0) 14 hours ago                                                         interesting_heisenberg
    

    ls /opt/bin returns no file or directory

    opened by bsde1234 1
  • Fix for new MADE_FOR_KIDS selector names

    Fix for new MADE_FOR_KIDS selector names

    This PR fixes the issue mentioned here - https://github.com/ContentAutomation/YouTubeUploader/issues/12

    Basically, YouTube changed the names of the "Made For Kids" radio buttons.

    opened by nitinthewiz 1
  • "Made for Kids" toggle just broke

    Yesterday I noticed that YouTube moved Made For Kids to outside the "Show More" section and changed the names of the radio buttons from MADE_FOR_KIDS to VIDEO_MADE_FOR_KIDS_MFK and from NOT_MADE_FOR_KIDS to VIDEO_MADE_FOR_KIDS_NOT_MFK.

    I don't know if this is true for everybody or just me, so didn't send a PR. Please check at your end and if it's true, I can send a PR or you can make the change yourself.

    I don't think the logic of the code needs to change for now, just the names of the radio buttons.

    The relevant line - https://github.com/ContentAutomation/YouTubeUploader/blob/main/src/upload.py#L119

    opened by nitinthewiz 1
  • another element <tp-yt-iron-overlay-backdrop class= obscures it">

    another element obscures it

    I am a newbie.I keep having the following problem, but with the same configuration, my other machine is working fine. Using python3.8 (3.8.2) Traceback (most recent call last): File "main.py", line 137, in <module> main() File "main.py", line 47, in main upload_file( File "/root/up/YouTubeUploader/src/upload.py", line 33, in upload_file _set_advanced_settings(driver, game, kids) File "/root/up/YouTubeUploader/src/upload.py", line 118, in _set_advanced_settings WebDriverWait(driver, 20).until(EC.element_to_be_clickable( File "/root/.cache/pypoetry/virtualenvs/youtubeuploader-qpcdujY--py3.8/lib/python3.8/site-packages/selenium/webdriver/remote/webelement.py", line 80, in click self._execute(Command.CLICK_ELEMENT) File "/root/.cache/pypoetry/virtualenvs/youtubeuploader-qpcdujY--py3.8/lib/python3.8/site-packages/selenium/webdriver/remote/webelement.py", line 633, in _execute return self._parent.execute(command, params) File "/root/.cache/pypoetry/virtualenvs/youtubeuploader-qpcdujY--py3.8/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute self.error_handler.check_response(response) File "/root/.cache/pypoetry/virtualenvs/youtubeuploader-qpcdujY--py3.8/lib/python3.8/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.ElementClickInterceptedException: Message: Element <tp-yt-paper-radio-button class="style-scope ytcp-audience-picker" name="NOT_MADE_FOR_KIDS"> is not clickable at point (626,781) because another element <tp-yt-iron-overlay-backdrop class="opened"> obscures it After checking, I know the problem is here, but I still don't know how to solve it. Could you help me WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "ytcp-button#create-icon"))).click()

    opened by xiaoxinhuozhu 1
  • Message: Unable to locate element: div.card:nth-child(1)

    Message: Unable to locate element: div.card:nth-child(1)

    At this point it fails:

    root@localhost:~/YouTubeUploader#  poetry run python main.py --browser docker --login-cookies-path /root/YouTubeUploader/cookie.json --title test --description test /uploads/video.mp4
    The currently activated Python version 3.7.3 is not supported by the project (~3.8).
    Trying to find and use a compatible version.
    Using python3.8 (3.8.3)
    INFO:root:Current progress: Processing 99% ...
    Traceback (most recent call last):
      File "main.py", line 140, in <module>
        main()
      File "main.py", line 50, in main
        upload_file(
      File "/root/YouTubeUploader/src/upload.py", line 41, in upload_file
        _set_endcard(driver)
      File "/root/YouTubeUploader/src/upload.py", line 128, in _set_endcard
        driver.find_element_by_css_selector("div.card:nth-child(1)").click()
      File "/root/.cache/pypoetry/virtualenvs/youtubeuploader-daD3CONG-py3.8/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 598, in find_element_by_css_selector
        return self.find_element(by=By.CSS_SELECTOR, value=css_selector)
      File "/root/.cache/pypoetry/virtualenvs/youtubeuploader-daD3CONG-py3.8/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 976, in find_element
        return self.execute(Command.FIND_ELEMENT, {
      File "/root/.cache/pypoetry/virtualenvs/youtubeuploader-daD3CONG-py3.8/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
        self.error_handler.check_response(response)
      File "/root/.cache/pypoetry/virtualenvs/youtubeuploader-daD3CONG-py3.8/lib/python3.8/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
        raise exception_class(message, screen, stacktrace)
    selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: div.card:nth-child(1)
    
    firefox_1  | 19:53:45.359 INFO [ActiveSessionFactory.apply] - Capabilities are: {
    firefox_1  |   "acceptInsecureCerts": true,
    firefox_1  |   "browserName": "firefox",
    firefox_1  |   "marionette": true
    firefox_1  | }
    firefox_1  | 19:53:45.362 INFO [ActiveSessionFactory.lambda$apply$11] - Matched factory org.openqa.selenium.grid.session.remote.ServicedSession$Factory (provider: org.openqa.selenium.firefox.GeckoDriverService)
    firefox_1  | 1622663625413      geckodriver     INFO    Listening on 127.0.0.1:30806
    firefox_1  | 1622663625478      mozrunner::runner       INFO    Running command: "/usr/bin/firefox" "--marionette" "-foreground" "-no-remote" "-profile" "/tmp/rust_mozprofileiG64GG"
    firefox_1  | [GFX1-]: glxtest: libpci missing
    firefox_1  | [GFX1-]: glxtest: libEGL missing
    firefox_1  | [GFX1-]: glxtest: libEGL missing
    firefox_1  | 1622663626690      Marionette      INFO    Marionette enabled
    firefox_1  | console.warn: SearchSettings: "get: No settings file exists, new profile?" (new Error("", "(unknown module)"))
    firefox_1  | 1622663631333      Marionette      INFO    Listening on port 37591
    firefox_1  | 1622663631541      Marionette      WARN    TLS certificate errors will be ignored for this session
    firefox_1  | 19:53:51.639 INFO [ProtocolHandshake.createSession] - Detected dialect: W3C
    firefox_1  | 19:53:51.659 INFO [RemoteSession$Factory.lambda$performHandshake$0] - Started new session b63d226a-120f-47f9-b143-fd1f0802cac9 (org.openqa.selenium.firefox.GeckoDriverService)
    firefox_1  | 1622663652978      Marionette      WARN    TimedPromise timed out after 500 ms: stacktrace:
    firefox_1  | TimedPromise/<@chrome://marionette/content/sync.js:237:19
    firefox_1  | TimedPromise@chrome://marionette/content/sync.js:222:10
    firefox_1  | interaction.flushEventLoop@chrome://marionette/content/interaction.js:431:10
    firefox_1  | webdriverClickElement@chrome://marionette/content/interaction.js:179:31
    firefox_1  | 1622663654427      Marionette      WARN    TimedPromise timed out after 500 ms: stacktrace:
    firefox_1  | TimedPromise/<@chrome://marionette/content/sync.js:237:19
    firefox_1  | TimedPromise@chrome://marionette/content/sync.js:222:10
    firefox_1  | interaction.flushEventLoop@chrome://marionette/content/interaction.js:431:10
    firefox_1  | webdriverClickElement@chrome://marionette/content/interaction.js:179:31
    firefox_1  | 1622663674728      Marionette      WARN    TimedPromise timed out after 500 ms: stacktrace:
    firefox_1  | TimedPromise/<@chrome://marionette/content/sync.js:237:19
    firefox_1  | TimedPromise@chrome://marionette/content/sync.js:222:10
    firefox_1  | interaction.flushEventLoop@chrome://marionette/content/interaction.js:431:10
    firefox_1  | webdriverClickElement@chrome://marionette/content/interaction.js:179:31
    firefox_1  | 1622663676936      Marionette      WARN    TimedPromise timed out after 500 ms: stacktrace:
    firefox_1  | TimedPromise/<@chrome://marionette/content/sync.js:237:19
    firefox_1  | TimedPromise@chrome://marionette/content/sync.js:222:10
    firefox_1  | interaction.flushEventLoop@chrome://marionette/content/interaction.js:431:10
    firefox_1  | webdriverClickElement@chrome://marionette/content/interaction.js:179:31
    firefox_1  | 1622663700668      Marionette      INFO    Stopped listening on port 37591
    firefox_1  |
    firefox_1  | ###!!! [Parent][RunMessage] Error: Channel closing: too late to send/recv, messages will be lost
    firefox_1  |
    

    sdfv

    opened by VitharMe 1
  • assert

    assert "Channel dashboard" in driver.title

    I've got a problem: Usingpython3.8 (3.8.2) Traceback (most recent call last): File "main.py", line 138, in <module> main() File "main.py", line 46, in main assert "Channel dashboard" in driver.title AssertionError

    opened by xiaoxinhuozhu 0
  • Prevent uploader from clicking endcard to early

    Prevent uploader from clicking endcard to early

    The uploader waits 5s for the endcard screen to load. However, if it takes longer than 5s, the program crashes with an exception.

    This PR fixes the problem by trying to click the endcard every 5s with a total of 10 retries.

    Fixes #6

    opened by ChristianCoenen 0
  • Uploads broken because title and description HTML tags have changed

    Uploads broken because title and description HTML tags have changed

    Hi,

    haven't had the time to send a PR, but the title and description boxes under _set_basic_settings have changed from

    '//ytcp-mention-textbox[@label="Title"]//div[@id="textbox"]',
    

    to

    '//ytcp-social-suggestions-textbox[@label="Title"]//div[@id="textbox"]',
    

    and from

    '//ytcp-mention-textbox[@label="Description"]//div[@id="textbox"]'
    

    to

    '//ytcp-social-suggestions-textbox[@label="Description"]//div[@id="textbox"]'
    

    As always with YouTube, this is a breaking change. Fun times!

    bug good first issue 
    opened by nitinthewiz 2
  • Verify It's You

    Verify It's You

    Hi, Thank you for your effort. it works good when using Browsers but on Docker it stops with the error

    Traceback (most recent call last): File "./main.py", line 139, in <module> main() File "./main.py", line 48, in main upload_file( File "/root/project-name/YouTubeUploader/src/upload.py", line 36, in upload_file _set_advanced_settings(driver, game, kids) File "/root/project-name/YouTubeUploader/src/upload.py", line 150, in _set_advanced_settings WebDriverWait(driver, 20).until(EC.element_to_be_clickable( File "/root/.cache/pypoetry/virtualenvs/youtubeuploader-qf-YjOKG-py3.8/lib/python3.8/site-packages/selenium/webdriver/remote/webelement.py", line 80, in click self._execute(Command.CLICK_ELEMENT) File "/root/.cache/pypoetry/virtualenvs/youtubeuploader-qf-YjOKG-py3.8/lib/python3.8/site-packages/selenium/webdriver/remote/webelement.py", line 633, in _execute return self._parent.execute(command, params) File "/root/.cache/pypoetry/virtualenvs/youtubeuploader-qf-YjOKG-py3.8/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute self.error_handler.check_response(response) File "/root/.cache/pypoetry/virtualenvs/youtubeuploader-qf-YjOKG-py3.8/lib/python3.8/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.ElementClickInterceptedException: Message: Element <div id="radioContainer" class="style-scope tp-yt-paper-radio-button"> is not clickable at point (539,793) because another element <tp-yt-iron-overlay-backdrop class="opened"> obscures it

    image

    docker -v Docker version 20.10.2, build 20.10.2-0ubuntu1~20.04.2

    docker-compose -v docker-compose version 1.25.0, build unknown

    poetry -v Poetry version 1.1.6

    python3 --version Python 3.8.5

    opened by sinzed 9
JAKYM, Just Another Konsole YouTube-Music. A command line based Youtube music player written in Python with spotify and youtube playlist support

Just Another Konsole YouTube-Music Overview I wanted to create this application so that I could use the command line to play music easily. I often pla

Mayank Jha 73 Jan 1, 2023
A simple url uploader bot with permenent thumbnail support

URL-Uploader A simple url uploader bot with permenent thumbnail support Scrapped some code from @SpEcHIDe's AnyDLBot Repository Please fork this repos

Fayas Noushad 40 Nov 29, 2021
A pdisk uploader bot written in Python

Pdisk Uploader Bot ?? Upload on Pdisk by Url, File and also by direct forward post from other channel... Features Post to Post Conversion Url Upload D

Paritosh Kumar 33 Oct 21, 2022
Pdisk Uploader Bot

pdisk-bot pdisk uploader telegram bot How To Use Configs TG_BOT_TOKEN - Get bot token from @BotFather API_ID - From my.telegram.org API_HASH - From my

lokaman chendekar 25 Oct 21, 2022
Mega.nz to GDrive uploader

Mega.nz to GDrive uploader With this telegram bot you can download files from mega.nz and upload those files or telegram uploaded files to GDrive. You

null 30 Nov 13, 2022
arweave-nft-uploader is a Python tool to improve the experience of uploading NFTs to the Arweave storage for use with the Metaplex Candy Machine.

arweave-nft-uploader arweave-nft-uploader is a Python tool to improve the experience of uploading NFTs to the Arweave storage for use with the Metaple

0xEnrico 84 Dec 26, 2022
Async ShareX uploader written in python

Async ShareX uploader written in python

Jacob 2 Jan 7, 2022
Powerful Url uploader bot With Mongodb support 🔥

Uploader X Bot Telegram RoBot to Upload Links. Features: ?? Upload YouTube-dl Supported Links to Telegram. ?? Upload HTTP/HTTPS as File/Video to Teleg

C͡linton Abraꫝam 250 Jan 6, 2023
Bulk NFT uploader to OpenSea!

Bulk NFT Uploader Description Simple easy peasy python script which logins to opensea account using metamask and bulk uploads NFT to your default coll

Lakshya Khera 25 May 23, 2022
TG-Url-Uploader-Bot - Telegram RoBot to Upload Links

MW-URL-Uploader Bot Telegram RoBot to Upload Links. Features: ?? Only Auth Users

Aadhi 3 Jun 27, 2022
OpenSea Bulk Uploader And Trader 100000 NFTs (MAC WINDOWS ANDROID LINUX) Automatically and massively upload and sell your non-fungible tokens on OpenSea using Python Selenium

OpenSea Bulk Uploader And Trader 100000 NFTs (MAC WINDOWS ANDROID LINUX) Automatically and massively upload and sell your non-fungible tokens on OpenS

ERC-7211 3 Mar 24, 2022
Python version of PlaceNL's headless bot with automatic access token refresh

Reddit /r/place 2022 headless bot This headless Python bot will automatically login to reddit, obtain access tokens (and refreshes them when they expi

null 19 May 21, 2022
Sunflower-farmers-automated-bot - Sunflower Farmers NFT Game automated bot.IT IS NOT a cheat or hack bot

Sunflower-farmers-auto-bot Sunflower Farmers NFT Game automated bot.IT IS NOT a

Arthur Alves 17 Nov 9, 2022
A Telegram Bot to Play Audio in Voice Chats With Youtube and Deezer support. Supports Live streaming from youtube Supports Mega Radio Fm Streamings

Bot To Stream Musics on PyTGcalls with Channel Support. A Telegram Bot to Play Audio in Voice Chats With Supports Live streaming from youtube and Mega

Shamil Habeeb 37 Dec 15, 2022
Python Library to Extract youtube video Tags without Youtube API

YoutubeTags Python Library to Extract youtube video Tags without Youtube API Installation pip install YoutubeTags Example import YoutubeTags from Yout

Nuhman Pk 17 Nov 12, 2022
A Telegram bot to download youtube playlists and upload them to telegram. (may be slow becoz youtube limitations)

YTPlaylistDL ?? A Telegram bot to download youtube playlists and upload them to telegram. (may be slow becoz youtube limitations) ?? Follow me and sta

Anjana Madu 43 Dec 28, 2022
Telegram Userbot to steram youtube live or Youtube vido in telegram vc by help of pytgcalls

TGVCVidioPlayerUB Telegram Userbot to steram youtube live or youtube vidio in telegram vc by help of pytgcalls Commands =>> Vidio Playing ?? stream :

Achu biju 3 Oct 28, 2022
YouTube playlist Files downloaded by FDM are not organized according to the original order on YouTube

Youtube-Playlist-File-Organizer YouTube playlist Files downloaded by Free Download Manager are not organized according to the original order on YouTub

David Mainoo 3 Dec 27, 2021
Google Drive, OneDrive and Youtube as covert-channels - Control systems remotely by uploading files to Google Drive, OneDrive, Youtube or Telegram

covert-control Control systems remotely by uploading files to Google Drive, OneDrive, Youtube or Telegram using Python to create the files and the lis

Ricardo Ruiz 52 Dec 6, 2022