A fully automated system that transforms Twitch clips into gaming compilations

Overview

Logo

MIT License Code style: black
Platform: YouTube Platform: Twitch Tensorflow
Jinja Streamlink MoviePy

A fully automated system that transforms Twitch clips into gaming compilations

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


About

This is our approach of automatically creating compilations of twitch clips (focused on gaming). We are very interested in YouTube, Twitch and Programming so we started this as an experiment, now a few months later we have to say it worked!

What did we achieve?

  • We automatically uploaded over 100 videos to our YouTube channel without any human interaction
  • One video got quite some traction by getting 2155 views and 48 likes at that point we had 0 Subscribers and it was the 8th video of the channel
  • All our uploads combined got over 10k views
  • We didn't receive a single comment indicating the use of bots

So why do we publish this now instead of making money with it?

  • We came to the conclusion that we'd need to further optimize the videos to grow the channel which would require sophisticated and computationally expensive neural networks.
  • We do not own the copyright of the clips so theoretically somebody could claim the video. To legally monetize the content, we'd need to add value to the clips like funny comments with a good text-to-speech framework.
  • The language of some clips is declared as English by Twitch, even though the spoken language is not English. To filter those clips, a computationally expensive neural network for language-detection is required.

It was only an experiment without the direct goal of making money with it. Additionally, we think it is more valuable for us as a reference. If you are encountering any problems when running the code, feel free to open an Issue or a Pull Request with a possible fix.

Results

Example Video Screenshot Example Thumbnail

Example Description

[Fortnite] Twitch Highlights #10 | Fails, Satisfying/Funny Moments & Epic Wins!

🔔 SUBSCRIBE FOR MORE FORTNITE FAILS/WINS!
https://www.youtube.com/channel/UCqq27nknJ3fe5IvrAbfuEwQ?sub_confirmation=1

Welcome back to episode 10 of Daily Gaming Highlights | Fortnite!
We have some insane clips this episode.
If you liked and enjoyed the video be sure to leave a like and subscribe for more Fortnite content!
We upload a Fortnite video every monday once a week.
Also be sure to comment letting us know which your favorite clip was 😄

Featured Playlists:
• Daily Gaming Highlights: https://www.youtube.com/playlist?list=PLhOg0bYb-2IKbbV4rHerrtlWArm14bXdI
• Fortnite Highlights: https://www.youtube.com/playlist?list=PLhOg0bYb-2IICWc4MB-ZetkKGMTSvanye

🎬Featured clips/streamers:
Streamer1: https://clips.twitch.tv/AwkwardProtectiveDoritosChip
Streamer2: https://clips.twitch.tv/WimpyGleamingTTours

00:00 Streamer1
00:11 Streamer2

Golden Gorilla does not have the copyrights for the used clips.
If you are within a video and would like to get it removed please email us:
[email protected]

#GoldenGorilla #Fortnite #Fails #FunnyMoments #EpicMoments #Wins #EpicWins
#fortnitebattleroyale #season4 #twitch

Requirements

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.

Additionally, this project requires ffmpeg and imagemagick.

There are a few additional steps depending on the operating system that are listed below:

Windows

  • Poetry
    • installing might throw errors which can be resolved by following this solution
    • you should use pip version ≥ 20.2.3 to avoid additional problems
  • ffmpeg
    • has to be added to the path so it can be accessed directly with the streamlink command
  • imagemagick
    • you have to change the the config_default as described here

Linux

  • imagemagick
    • make sure the line is NOT present in the imagemagick policy config (/etc/ImageMagick-6/policy.xml on Debian/Ubuntu). Comment out this line if it is found in the file to ensure that imagemagick is not restricted by the path access policy.*

Setup

  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. Follow the Twitch Api Docs until you get your own CLIENT_ID and CLIENT_SECRET
  5. Optional: Follow the YouTube Data API Docs until you receive an API key
  6. Insert your Twitch(CLIENT_ID, CLIENT_SECRET) and optionally your YouTube(YT_API_KEY) into the config.py. It should look like the following

HINT: The example keys do not work.
# For the Twitch API
CLIENT_ID = "o42tebpdzmj5z811iycgcpmd82on24"
CLIENT_SECRET = "owdgx64t1dodleiuo49e5rg7rvk5iq"

DIRECTORIES = dict(raw_clips_dir="rawClips", compilation_dir="compilation", descriptions_dir="descriptions")

# For the YouTube API
# Optional: Only required if you want continuous numbering (e.g. Example Video Title #1, #2, ..., #N) for your videos
# Note: The number (#N) is determined by the number of items in a given YouTube playlist (declared in metadata_config)
YT_API_KEY = "h5UYdzJHeZNWLTgGteh0J68k7icp9jp9vPJlbzF"
  1. Run poetry run python main.py to run the program. Alternatively you can run poetry shell followed by python main.py
  2. Enjoy :)

Script Explanations

APIHandler.py

This class contains static methods to handle all API request for the Twitch and YouTube API.

Clip.py

This dataclass is used to convert json data from the Twitch API to Clip objects. This makes the data easier accessible within the python code.

ClipHandler.py

This class determines which Twitch clips the compilation will be made of and process them. It will do the following:

  • call the Twitch API to get the clip metadata
  • check if clips are ingame by using a neural network
  • process 100 clip metadata at a time and fetch more metadata if necessary
  • download the clips one-by-one

ClipCompilationCreator.py

This class will use the clips from the ClipHandler to create a compilation of all clips with a logo and the name of the clip creator as overlay. It will do the following:

  • load all clips based on the metadata file
  • create an overlay text for each clip
  • composite all clips with their text and the logo
  • compress the audio of the compilation so the sound is equaly high for the whole compilation
  • render the finished compilation

MetadataHandler.py

This class will handle/create all metadata that is needed for a YouTube upload. It will do the following:

  • handle the loading, saving, and storage of the metadata
  • on every first load it will refresh the metadata. If clips got deleted in the raw_clips_dir it will remove them automatically from the metadata
  • use a template to create YouTube title and description based on the metadata_config of the game and the metadata of that specific compilation
  • create a thumbnail using a frame of one of the clips, a random emoji, the number of the playlists_items, a basic half transparent overlay, and the game logo

parser.py

This script is only for the ArgumentParser that will be used in the main.py. It simplifies the usage of the script by defining default values for every parameter aswell as types and help information. All parameters are optional so the script runs without parameters but they all work and can be used. To read more about this checkout the Run Parameters section.

utils.py

As the name indicates this script offers only utility functions. Those functions are used in basically every other script or class. It contains functions performing the following tasks:

  • formatting a string into the correct string format
  • adding any amount of seconds on top of a datetime.time value
  • getting start and end datetimes for a given timespan (e.g. last hour, last week, ...)
  • get a valid filename which removes all characters that may conflict with file handling operations
  • get the full path to the game folder in our own directory structure for a given game
  • get the full path of the previous compilation of a given game
  • create our directory structure
  • delete the whole directory structure
  • saving and loading txt aswell as json files

Run Parameters

All of these parameters are optional and a default value will be used if they are not defined. You can also get these definitions by running main.py --help

-h, --help            show this help message and exit
-g GAME, --game GAME  
                      Declares for which game the compilation should be created. It uses fortnite as default
-ap ASSET_PATH, --asset_path ASSET_PATH
                      Path to the assets folder. If not declared it uses './assets' as default
-noc NUMBER_OF_CLIPS, --number_of_clips NUMBER_OF_CLIPS
                      How many clips should be used. For most use cases -ml will fit better since the length of clips can be between 1-60 seconds so a -noc 5 compilation could be 5 or 300 seconds long
-ts {day,week,month}, --timespan {day,week,month}
                      ['hour', 'day', 'week', 'month'] - timespan from when the clips should be taken. Default is week
-la LANGUAGE, --language LANGUAGE
                      Language of the clips. Default is en
-ml MIN_LENGTH, --min_length MIN_LENGTH
                      Length of the compilation in seconds. Default is 360 (6 minutes)
-mcc MAX_CREATOR_CLIPS, --max_creator_clips MAX_CREATOR_CLIPS
                      Number of clips used from a single creator. Default is 2
-mcd MIN_CLIP_DURATION, --min_clip_duration MIN_CLIP_DURATION
                      Minimal clip length. Default is 10
-o OUTPUT_PATH, --output_path OUTPUT_PATH
                      Output path - default is './TwitchClips'. This should not start with a '/', otherwise it will use it as an absolute path


Comments
  • TypeError: __init__() got an unexpected keyword argument 'vod_offset'

    TypeError: __init__() got an unexpected keyword argument 'vod_offset'

    Here is the code warning:root:No model for prediction available -> every clip is chosen as valid (ingame) Traceback (most recent call last): File "main.py", line 17, in ch.get_clips( File "C:\Users\Amogh\Desktop\TwitchCompilationCreator-2.0\src\ClipHandler.py", line 46, in get_clips self.get_game_clips(utils.get_headers(), timespan, language, kwargs) File "C:\Users\Amogh\Desktop\TwitchCompilationCreator-2.0\src\ClipHandler.py", line 78, in get_game_clips self.handle_response_data(resp.json(), language, creator_counts, filter_information) File "C:\Users\Amogh\Desktop\TwitchCompilationCreator-2.0\src\ClipHandler.py", line 136, in handle_response_data current_clip = Clip(**clip) TypeError: init() got an unexpected keyword argument 'vod_offset' then it stops working

    opened by OPgamemasterYt 17
  • Module Not Found

    Module Not Found

    C:\Users\Ramz\Downloads\TwitchCompilationCreator-main\TwitchCompilationCreator-main>poetry run python main.py
    Traceback (most recent call last):
      File "C:\Users\Ramz\Downloads\TwitchCompilationCreator-main\TwitchCompilationCreator-main\main.py", line 1, in <module>
        from src.ClipHandler import ClipHandler
      File "C:\Users\Ramz\Downloads\TwitchCompilationCreator-main\TwitchCompilationCreator-main\src\ClipHandler.py", line 5, in <module>
        import numpy as np
    ModuleNotFoundError: No module named 'numpy'
    

    I've followed the guide and got this error appear. I have numpy already installed before starting the guide.

    opened by iamtherealramz 6
  • streamlink.exceptions.StreamError:

    streamlink.exceptions.StreamError:

    Hi, at some point the Bot gives me this Error:

    info:root:Adding new valid clip: Clip zum Tot by MontanaBlack88 info:root:Status Code: 200 -> handling response data now info:root:New pagination: eyJiIjpudWxsLCJhIjp7IkN1cnNvciI6Ik5EQXcifX0 Traceback (most recent call last): File "/home/pablo/.cache/pypoetry/virtualenvs/twitchcompilationcreator-_qx3GjyT-py3.8/lib/python3.8/site-packages/streamlink/plugin/api/http_session.py", line 160, in request res.raise_for_status() File "/home/pablo/.cache/pypoetry/virtualenvs/twitchcompilationcreator-_qx3GjyT-py3.8/lib/python3.8/site-packages/requests/models.py", line 943, in raise_for_status raise HTTPError(http_error_msg, response=self) requests.exceptions.HTTPError: 404 Client Error: for url: https://production.assets.clips.twitchcdn.net/AT-cm%7ClhUD7Y13uOHAD7xBG7Azew.mp4?sig=03c8ef4078b909a526520055f3aea26a813f2e24&token=%7B%22authorization%22%3A%7B%22forbidden%22%3Atrue%2C%22reason%22%3A%22GEOBLOCKED%22%7D%2C%22clip_uri%22%3A%22https%3A%2F%2Fproduction.assets.clips.twitchcdn.net%2FAT-cm%257ClhUD7Y13uOHAD7xBG7Azew.mp4%22%2C%22device_id%22%3Anull%2C%22expires%22%3A1634224325%2C%22user_id%22%3A%22%22%2C%22version%22%3A2%7D

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last): File "main.py", line 17, in ch.get_clips( File "/home/pablo/Schreibtisch/Twitch/TwitchCompilationCreator/src/ClipHandler.py", line 46, in get_clips self.get_game_clips(utils.get_headers(), timespan, language, kwargs) File "/home/pablo/Schreibtisch/Twitch/TwitchCompilationCreator/src/ClipHandler.py", line 78, in get_game_clips self.handle_response_data(resp.json(), language, creator_counts, filter_information) File "/home/pablo/Schreibtisch/Twitch/TwitchCompilationCreator/src/ClipHandler.py", line 123, in handle_response_data clip_path = self.download_clip(clip) File "/home/pablo/Schreibtisch/Twitch/TwitchCompilationCreator/src/ClipHandler.py", line 155, in download_clip with open(output_file, "wb") as f, stream.open() as fd: File "/home/pablo/.cache/pypoetry/virtualenvs/twitchcompilationcreator-_qx3GjyT-py3.8/lib/python3.8/site-packages/streamlink/stream/http.py", line 70, in open res = self.session.http.request(method=method, File "/home/pablo/.cache/pypoetry/virtualenvs/twitchcompilationcreator-_qx3GjyT-py3.8/lib/python3.8/site-packages/streamlink/plugin/api/http_session.py", line 168, in request raise err streamlink.exceptions.StreamError: Unable to open URL: https://production.assets.clips.twitchcdn.net/AT-cm%7ClhUD7Y13uOHAD7xBG7Azew.mp4?sig=03c8ef4078b909a526520055f3aea26a813f2e24&token=%7B%22authorization%22%3A%7B%22forbidden%22%3Atrue%2C%22reason%22%3A%22GEOBLOCKED%22%7D%2C%22clip_uri%22%3A%22https%3A%2F%2Fproduction.assets.clips.twitchcdn.net%2FAT-cm%257ClhUD7Y13uOHAD7xBG7Azew.mp4%22%2C%22device_id%22%3Anull%2C%22expires%22%3A1634224325%2C%22user_id%22%3A%22%22%2C%22version%22%3A2%7D (404 Client Error: for url: https://production.assets.clips.twitchcdn.net/AT-cm%7ClhUD7Y13uOHAD7xBG7Azew.mp4?sig=03c8ef4078b909a526520055f3aea26a813f2e24&token=%7B%22authorization%22%3A%7B%22forbidden%22%3Atrue%2C%22reason%22%3A%22GEOBLOCKED%22%7D%2C%22clip_uri%22%3A%22https%3A%2F%2Fproduction.assets.clips.twitchcdn.net%2FAT-cm%257ClhUD7Y13uOHAD7xBG7Azew.mp4%22%2C%22device_id%22%3Anull%2C%22expires%22%3A1634224325%2C%22user_id%22%3A%22%22%2C%22version%22%3A2%7D)

    Can some one Help me out with this?

    Greetings

    opened by OneClickPablo123 5
  • Error compiling footage

    Error compiling footage

    `warning:root:No model for prediction available -> every clip is chosen as valid (ingame) info:root:Adding new valid clip: . by FaZeSway warning:root:No model for prediction available -> every clip is chosen as valid (ingame) info:root:Adding new valid clip: matrix movement by NateHill warning:root:No model for prediction available -> every clip is chosen as valid (ingame) info:root:Adding new valid clip: what is a junk rif? by TheNicoleT warning:root:No model for prediction available -> every clip is chosen as valid (ingame) info:root:Adding new valid clip: TRIO CASH CUP NO BUILD😎🤙 | -> KOD: KUBX <- | !keydrop !org !ppv by Kubx warning:root:No model for prediction available -> every clip is chosen as valid (ingame) info:root:Adding new valid clip: $100,000 SAMSUNG ODYSSEY TOURNAMENT W/ DAKOTAZ | !tourney !giveaway by xChocoBars info:root:Required length reached info:root:Saving metadata.json info:root:Loading metadata.json info:root:Refreshing Metadata info:root:Loading metadata_config.json info:root:Getting amount of playlist items warning:root:Status Code: 400, {'error': {'code': 400, 'message': 'API key not valid. Please pass a valid API key.', 'errors': [{'message': 'API key not valid. Please pass a valid API key.', 'domain': 'global', 'reason': 'badRequest'}], 'status': 'INVALID_ARGUMENT', 'details': [{'@type': 'type.googleapis.com/google.rpc.ErrorInfo', 'reason': 'API_KEY_INVALID', 'domain': 'googleapis.com', 'metadata': {'service': 'youtube.googleapis.com'}}]}} warning:root:Check if you inserted a correct PlayListID in your metadata_config -> return playlist_size of 0 info:root:Saving metadata.json info:root:Creating compilation from 13 clips Traceback (most recent call last): File "D:\Users\Connor\Desktop\TwitchBot.venv\lib\site-packages\moviepy\video\VideoClip.py", line 1137, in init subprocess_call(cmd, logger=None) File "D:\Users\Connor\Desktop\TwitchBot.venv\lib\site-packages\moviepy\tools.py", line 46, in subprocess_call proc = sp.Popen(cmd, **popen_params) File "C:\Users\Connor\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 966, in init self._execute_child(args, executable, preexec_fn, close_fds, File "C:\Users\Connor\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1435, in _execute_child hp, ht, pid, tid = _winapi.CreateProcess(executable, args, FileNotFoundError: [WinError 2] The system cannot find the file specified

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last): File "D:\Users\Connor\Desktop\TwitchBot\main.py", line 26, in vcc.create_compilation() File "D:\Users\Connor\Desktop\TwitchBot\src\ClipCompilationCreator.py", line 27, in create_compilation composite_clips = list(self.composite_clips(clips).values()) File "D:\Users\Connor\Desktop\TwitchBot\src\ClipCompilationCreator.py", line 70, in composite_clips txts = self.generate_clip_text(self.metadata) File "D:\Users\Connor\Desktop\TwitchBot\src\ClipCompilationCreator.py", line 87, in generate_clip_text txt = TextClip( File "D:\Users\Connor\Desktop\TwitchBot.venv\lib\site-packages\moviepy\video\VideoClip.py", line 1146, in init raise IOError(error) OSError: MoviePy Error: creation of None failed because of the following error:

    [WinError 2] The system cannot find the file specified.

    .This error can be due to the fact that ImageMagick is not installed on your computer, or (for Windows users) that you didn't specify the path to the ImageMagick binary in file conf.py, or that the path you specified is incorrect

    (.venv) D:\Users\Connor\Desktop\TwitchBot> `

    opened by ConnorServers 3
  • Poetry

    Poetry

    I can't figure this out at all just looking for some help

    **Error ** `C:\Users\rusty\Downloads\TwitchCompilationCreator-2.0>poetry install

    EnvCommandError

    Command C:\Users\rusty\AppData\Local\pypoetry\Cache\virtualenvs\twitchcompilationcreator-ofLkCIrp-py3.8\Scripts\python.exe -W ignore - errored with the following return code 1, and output: The system cannot find the path specified. input was : import sys

    if hasattr(sys, "real_prefix"): print(sys.real_prefix) elif hasattr(sys, "base_prefix"): print(sys.base_prefix) else: print(sys.prefix)

    at ~.poetry\lib\poetry\utils\env.py:1195 in run 1191│ output = subprocess.check_output( 1192│ cmd, stderr=subprocess.STDOUT, **kwargs 1193│ ) 1194│ except CalledProcessError as e: → 1195│ raise EnvCommandError(e, input=input) 1196│ 1197│ return decode(output) 1198│ 1199│ def execute(self, bin, *args, **kwargs):

    `C:\Users\rusty\Downloads\TwitchCompilationCreator-2.0>``

    opened by rustysbro2 1
  • Poetry doesn't install all packages

    Poetry doesn't install all packages

    `poetry install
    Installing dependencies from lock file

    Package operations: 5 installs, 0 updates, 0 removals

    • Installing h5py (2.10.0): Failed

    EnvCommandError

    Command ['/root/.cache/pypoetry/virtualenvs/twitchcompilationcreator-1vuCogfD-py3.9/bin/pip', 'install', '--no-deps', 'file:///root/.cache/pypoetry/artifacts/67/73/11/59cd898ab55f65d9213500215b00e663dafb02beb2e48301f1ffc078ae/h5py-2.10.0.tar.gz'] errored with the following return code 1, and output: Processing /root/.cache/pypoetry/artifacts/67/73/11/59cd898ab55f65d9213500215b00e663dafb02beb2e48301f1ffc078ae/h5py-2.10.0.tar.gz Building wheels for collected packages: h5py Building wheel for h5py (setup.py): started Building wheel for h5py (setup.py): finished with status 'error' ERROR: Command errored out with exit status 1: command: /root/.cache/pypoetry/virtualenvs/twitchcompilationcreator-1vuCogfD-py3.9/bin/python -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-req-build-1j4ru1qt/setup.py'"'"'; file='"'"'/tmp/pip-req-build-1j4ru1qt/setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(file) if os.path.exists(file) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, file, '"'"'exec'"'"'))' bdist_wheel -d /tmp/pip-wheel-2u4zdnys cwd: /tmp/pip-req-build-1j4ru1qt/ Complete output (64 lines): running bdist_wheel running build running build_py creating build creating build/lib.linux-x86_64-3.9 creating build/lib.linux-x86_64-3.9/h5py copying h5py/h5py_warnings.py -> build/lib.linux-x86_64-3.9/h5py copying h5py/init.py -> build/lib.linux-x86_64-3.9/h5py copying h5py/highlevel.py -> build/lib.linux-x86_64-3.9/h5py copying h5py/ipy_completer.py -> build/lib.linux-x86_64-3.9/h5py copying h5py/version.py -> build/lib.linux-x86_64-3.9/h5py creating build/lib.linux-x86_64-3.9/h5py/_hl copying h5py/_hl/datatype.py -> build/lib.linux-x86_64-3.9/h5py/_hl copying h5py/_hl/selections2.py -> build/lib.linux-x86_64-3.9/h5py/_hl copying h5py/_hl/compat.py -> build/lib.linux-x86_64-3.9/h5py/_hl copying h5py/_hl/dims.py -> build/lib.linux-x86_64-3.9/h5py/_hl copying h5py/_hl/init.py -> build/lib.linux-x86_64-3.9/h5py/_hl copying h5py/_hl/vds.py -> build/lib.linux-x86_64-3.9/h5py/_hl copying h5py/_hl/dataset.py -> build/lib.linux-x86_64-3.9/h5py/_hl copying h5py/_hl/base.py -> build/lib.linux-x86_64-3.9/h5py/_hl copying h5py/_hl/attrs.py -> build/lib.linux-x86_64-3.9/h5py/_hl copying h5py/_hl/files.py -> build/lib.linux-x86_64-3.9/h5py/_hl copying h5py/_hl/filters.py -> build/lib.linux-x86_64-3.9/h5py/_hl copying h5py/_hl/selections.py -> build/lib.linux-x86_64-3.9/h5py/_hl copying h5py/_hl/group.py -> build/lib.linux-x86_64-3.9/h5py/_hl creating build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_base.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_h5p.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_dims_dimensionproxy.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_filters.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_slicing.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_h5d_direct_chunk.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_datatype.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/common.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/init.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_attrs.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_attrs_data.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_h5pl.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_dataset_getitem.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_h5t.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_objects.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_file2.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_file_image.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_deprecation.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_attribute_create.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_dataset_swmr.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_file.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_group.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_h5.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_selections.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_completions.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_h5f.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_threads.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_dtype.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_dataset.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_dimension_scales.py -> build/lib.linux-x86_64-3.9/h5py/tests creating build/lib.linux-x86_64-3.9/h5py/tests/test_vds copying h5py/tests/test_vds/test_virtual_source.py -> build/lib.linux-x86_64-3.9/h5py/tests/test_vds copying h5py/tests/test_vds/init.py -> build/lib.linux-x86_64-3.9/h5py/tests/test_vds copying h5py/tests/test_vds/test_lowlevel_vds.py -> build/lib.linux-x86_64-3.9/h5py/tests/test_vds copying h5py/tests/test_vds/test_highlevel_vds.py -> build/lib.linux-x86_64-3.9/h5py/tests/test_vds running build_ext Loading library to get version: libhdf5.so error: libhdf5.so: cannot open shared object file: No such file or directory ---------------------------------------- ERROR: Failed building wheel for h5py Running setup.py clean for h5py Failed to build h5py Installing collected packages: h5py Running setup.py install for h5py: started Running setup.py install for h5py: finished with status 'error' ERROR: Command errored out with exit status 1: command: /root/.cache/pypoetry/virtualenvs/twitchcompilationcreator-1vuCogfD-py3.9/bin/python -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-req-build-1j4ru1qt/setup.py'"'"'; file='"'"'/tmp/pip-req-build-1j4ru1qt/setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(file) if os.path.exists(file) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, file, '"'"'exec'"'"'))' install --record /tmp/pip-record-x7f_xgav/install-record.txt --single-version-externally-managed --compile --install-headers /root/.cache/pypoetry/virtualenvs/twitchcompilationcreator-1vuCogfD-py3.9/include/site/python3.9/h5py cwd: /tmp/pip-req-build-1j4ru1qt/ Complete output (64 lines): running install running build running build_py creating build creating build/lib.linux-x86_64-3.9 creating build/lib.linux-x86_64-3.9/h5py copying h5py/h5py_warnings.py -> build/lib.linux-x86_64-3.9/h5py copying h5py/init.py -> build/lib.linux-x86_64-3.9/h5py copying h5py/highlevel.py -> build/lib.linux-x86_64-3.9/h5py copying h5py/ipy_completer.py -> build/lib.linux-x86_64-3.9/h5py copying h5py/version.py -> build/lib.linux-x86_64-3.9/h5py creating build/lib.linux-x86_64-3.9/h5py/_hl copying h5py/_hl/datatype.py -> build/lib.linux-x86_64-3.9/h5py/_hl copying h5py/_hl/selections2.py -> build/lib.linux-x86_64-3.9/h5py/_hl copying h5py/_hl/compat.py -> build/lib.linux-x86_64-3.9/h5py/_hl copying h5py/_hl/dims.py -> build/lib.linux-x86_64-3.9/h5py/_hl copying h5py/_hl/init.py -> build/lib.linux-x86_64-3.9/h5py/_hl copying h5py/_hl/vds.py -> build/lib.linux-x86_64-3.9/h5py/_hl copying h5py/_hl/dataset.py -> build/lib.linux-x86_64-3.9/h5py/_hl copying h5py/_hl/base.py -> build/lib.linux-x86_64-3.9/h5py/_hl copying h5py/_hl/attrs.py -> build/lib.linux-x86_64-3.9/h5py/_hl copying h5py/_hl/files.py -> build/lib.linux-x86_64-3.9/h5py/_hl copying h5py/_hl/filters.py -> build/lib.linux-x86_64-3.9/h5py/_hl copying h5py/_hl/selections.py -> build/lib.linux-x86_64-3.9/h5py/_hl copying h5py/_hl/group.py -> build/lib.linux-x86_64-3.9/h5py/_hl creating build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_base.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_h5p.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_dims_dimensionproxy.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_filters.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_slicing.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_h5d_direct_chunk.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_datatype.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/common.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/init.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_attrs.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_attrs_data.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_h5pl.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_dataset_getitem.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_h5t.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_objects.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_file2.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_file_image.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_deprecation.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_attribute_create.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_dataset_swmr.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_file.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_group.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_h5.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_selections.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_completions.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_h5f.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_threads.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_dtype.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_dataset.py -> build/lib.linux-x86_64-3.9/h5py/tests copying h5py/tests/test_dimension_scales.py -> build/lib.linux-x86_64-3.9/h5py/tests creating build/lib.linux-x86_64-3.9/h5py/tests/test_vds copying h5py/tests/test_vds/test_virtual_source.py -> build/lib.linux-x86_64-3.9/h5py/tests/test_vds copying h5py/tests/test_vds/init.py -> build/lib.linux-x86_64-3.9/h5py/tests/test_vds copying h5py/tests/test_vds/test_lowlevel_vds.py -> build/lib.linux-x86_64-3.9/h5py/tests/test_vds copying h5py/tests/test_vds/test_highlevel_vds.py -> build/lib.linux-x86_64-3.9/h5py/tests/test_vds running build_ext Loading library to get version: libhdf5.so error: libhdf5.so: cannot open shared object file: No such file or directory ---------------------------------------- ERROR: Command errored out with exit status 1: /root/.cache/pypoetry/virtualenvs/twitchcompilationcreator-1vuCogfD-py3.9/bin/python -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-req-build-1j4ru1qt/setup.py'"'"'; file='"'"'/tmp/pip-req-build-1j4ru1qt/setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(file) if os.path.exists(file) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, file, '"'"'exec'"'"'))' install --record /tmp/pip-record-x7f_xgav/install-record.txt --single-version-externally-managed --compile --install-headers /root/.cache/pypoetry/virtualenvs/twitchcompilationcreator-1vuCogfD-py3.9/include/site/python3.9/h5py Check the logs for full command output.

    at ~/.poetry/lib/poetry/utils/env.py:1101 in run 1097│ output = subprocess.check_output( 1098│ cmd, stderr=subprocess.STDOUT, **kwargs 1099│ ) 1100│ except CalledProcessError as e: → 1101│ raise EnvCommandError(e, input=input) 1102│ 1103│ return decode(output) 1104│ 1105│ def execute(self, bin, *args, **kwargs):`

    I've followed the guide and got this error appear after trying to poetry install looks like it doesn't install h5py,jinja2,moviepy,streamlink,tensorflow (reinstal doesn't work)

    opened by frycupl 1
  • Issur when running main.py

    Issur when running main.py

    Hi, I have these errors when I run main.py. Can you help me ?

    some texte here
    ...
    
    info:root:Creating compilation from 2 clips
    warning:root:No watermark found -> video will be created without watermark
    Traceback (most recent call last):
      File "C:\Python38\lib\site-packages\moviepy\video\VideoClip.py", line 1137, in __init__
        subprocess_call(cmd, logger=None)
      File "C:\Python38\lib\site-packages\moviepy\tools.py", line 46, in subprocess_call
        proc = sp.Popen(cmd, **popen_params)
      File "C:\Python38\lib\subprocess.py", line 854, in __init__
        self._execute_child(args, executable, preexec_fn, close_fds,
      File "C:\Python38\lib\subprocess.py", line 1307, in _execute_child
        hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
    FileNotFoundError: [WinError 2] Le fichier spécifié est introuvable
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "F:\TwitchCompilationCreator-main\main.py", line 27, in <module>
        vcc.create_compilation()
      File "F:\TwitchCompilationCreator-main\src\ClipCompilationCreator.py", line 27, in create_compilation
        composite_clips = list(self.composite_clips(clips).values())
      File "F:\TwitchCompilationCreator-main\src\ClipCompilationCreator.py", line 70, in composite_clips
        txts = self.generate_clip_text(self.metadata)
      File "F:\TwitchCompilationCreator-main\src\ClipCompilationCreator.py", line 87, in generate_clip_text
        txt = TextClip(
      File "C:\Python38\lib\site-packages\moviepy\video\VideoClip.py", line 1146, in __init__
        raise IOError(error)
    OSError: MoviePy Error: creation of None failed because of the following error:
    
    [WinError 2] Le fichier spécifié est introuvable.
    
    .This error can be due to the fact that ImageMagick is not installed on your computer, or (for Windows users) that you didn't specify the path to the ImageMagick binary in file conf.py, or that the path you specified is incorrect
    
    opened by hugojobe 1
  • Fix wrong link on Peotry on Windows

    Fix wrong link on Peotry on Windows

    The current link point to https://github.com/ContentAutomation/TwitchCompilationCreator/blob/main/python-poetry/poetry#2681. I assumed that you meant the issue 2681 on the Poetry repo.

    opened by wdroz 1
  • First version of the Readme

    First version of the Readme

    I created a first version of the README. Since your english is better then mine it would be great if you could read through it. Maybe I will add more sections later depending on what comes into my mind.

    opened by lucaSchilling 1
  • Update dependencies

    Update dependencies

    With the release of version 1.2, Poetry changed its syntax to restrict dependency versions. Instead of ^=, ^ is now required.

    Bonus: I also updated all dependencies and the python version due to problems with old dependencies and the new poetry version.

    Ensured that everything is still working.

    opened by ChristianCoenen 0
  • Update streamlink library to prevent program crash

    Update streamlink library to prevent program crash

    This PR is necessary because every streamlink version below v.2.2 is not working anymore due to a Twitch API change.

    I updated the dependency and used the caret operator (^) to allow every version between v.2.2 and v.3.0. This is because often only the latest streamlink release seems to work due to API changes (Twitch, YouTube, etc.).

    P.S. I also updated the project name in the pyproject.toml because the represented name was not reflecting the repository name.

    Since v.1.0 is not working anymore, I suggest creating a v.2.0 as soon as the PR is merged to have a released version that is actually working.

    opened by ChristianCoenen 0
  • Add features

    Add features

    Hello, I'm looking for someone to help me add 2 simple features to the program, I have very basic knowledge in Python and couldn't do it by myself, 1 - adding broadcaster name to the output rawclip after the clip number 2 - adding broadcaster channel line to the metadata.json file Thanks in advance

    opened by maynaps 1
Releases(v2.0)
A stat tracker for the bedwars hypixel game in python

A hypixel bedwars stat tracker. Features Get stats in your current lobby Get stats in a guild Installation & Configuration git clone https://github.co

Le_Grand_Mannitout 3 Dec 25, 2021
Tic Tac Toe Python Game GUI

Tic Tac Toe is one of the most played games and is the best time killer game that you can play anywhere with just a pen and paper.

Astitva Veer Garg 1 Jan 11, 2022
Official PyTorch implementation of NAC from the paper: Neural Auto-Curricula in Two-Player Zero-Sum Games.

NAC Official PyTorch implementation of NAC from the paper: Neural Auto-Curricula in Two-Player Zero-Sum Games. We release code for: Gradient based ora

Xidong Feng 19 Nov 11, 2022
Navicella cavallo, gioco 2D stile space shooter

Navicella Cavallo Il miglior gioco in circolazione Navicella cavallo è un gioco 2D basato sullo stile dei giochi space shooter Come installare Navicel

Matteo 6 Jul 03, 2022
A didactic GUI chess game made in Python3 using pygame.

Chess A didactic GUI chess game made in Python3 using pygame. At the moment, there is no AI. The only way you can test the game is by playing against

Leonardo Delfino 1 Dec 22, 2021
python script to convert .OBJ files into Minecraft, rendering them in game with a core shader.

samples: random notes about the tool general output format: (animation not supported yet but planned) vertex id Minecraft's gl_VertexID isn't per mode

199 Jan 02, 2023
AXI Combat is a networked multiplayer game built on the AXI Visualizer 3D engine.

AXI_Combat AXI Combat is a networked multiplayer game built on the AXI Visualizer 3D engine. https://axi.x10.mx/Combat AXI Combat is released under th

. 0 Aug 02, 2022
Wordle-helper: python script to help solving wordle game

wordle-helper This is a python script to help solving wordle game 5-letter-word-

MD Nur Ahmed 2 Feb 08, 2022
A near-exact clone of google chrome's no internet game, or the "google dinosaur game", with some additions and extras.

dinoGame A near-exact clone of google chrome's no internet game, or the "google dinosaur game", with some additions and extras. Installation Download

1 Oct 26, 2021
Este repositorio es creado con el fin de brindar soporte a las personas que están en el proceso de aprendizaje MISIONTIC 2022 en la universidad de Antioquia

Este repositorio es creado con el fin de brindar soporte a las personas que están en el proceso de aprendizaje MISIONTIC 2022 en la universidad de Antioquia. Hecho por los estudiantes para los estudi

Andrés Mauricio Gómez 11 Jun 22, 2022
🌍🍓 A better MCPi Launcher

Planet Launcher A better, maintained launcher for the Minecraft: Pi Edition Reborn mod. Report Bug | Request Feature Planet is a maintained, feature-r

15 Oct 19, 2022
Frets on Fire X: a fork of Frets on Fire with many added features and capabilities

Frets on Fire X - FoFiX This is Frets on Fire X, a highly customizable rhythm game supporting many modes of guitar, bass, drum, and vocal gameplay for

FoFiX 377 Jan 02, 2023
Ghdl-interactive-sim - Interactive GHDL simulation of a VHDL adder using Python, Cocotb, and pygame

GHDL Interactive Simulation This is an interactive test bench for a simple VHDL adder. It uses GHDL to elaborate/run the simulation. It is coded in Py

Chuck Benedict 2 Aug 11, 2022
Deal Or No Deal was a very popular game show. Even now, for a family party, it's a fun game to pass time

Deal Or No Deal was a very popular game show. Even now, for a family party, it's a fun game to pass time. I made a code to play the game right in your terminal/console. This isn't made to be a game w

1 Feb 15, 2022
a game of life implementation in python

gameoflife-py python implementation of game of life Installing As long as you have bash and curl installed and are on Linux the install script should

Raghav 5 Jun 09, 2021
MiTM proxy server for Darza's Dominion

Midnight A MiTM proxy server for Darza's Dominion, PC version. See this video for a demonstration of godmode: https://youtu.be/uoqvSxmnCJk How to use

2 Oct 24, 2022
A set of tools to help you with running a Project Zomboid game server (Linux only)

Project Zomboid Server Tools A set of tools to help you with running a Project Zomboid game server (Linux only). Features Install Project Zomboid Dedi

24 Dec 25, 2022
Playing memory game is fun and the more harder it is the more challenging it is.

Playing memory game is fun and the more harder it is the more challenging it is. Playing thi sgame make us stress free and also happy. So, I have decided to make a memory Game which people can play w

Shreejan Dolai 3 Nov 11, 2022
Game code for Evennia servers designed for use with ALPACASclient.

ALPACASgame Game code for Evennia servers designed for use with ALPACASclient. This code is meant to be a type of "compatability layer" between the AL

FreeDelete Software 1 Nov 07, 2021
An ongoing process to make a physics engine using python.

Simple_Physics_Engine An ongoing process to make a physics engine using python. I am using this goal as a way to learn python in and out. I am trying

Jon Sherrick 1 Jan 18, 2022