Initial commit for YouTube Live Chat Overlay project.

This commit is contained in:
Ramforth
2025-11-03 16:40:05 +01:00
commit ba92664fdc
23 changed files with 49577 additions and 0 deletions

52
DEVELOPMENT_PLAN.md Normal file
View File

@@ -0,0 +1,52 @@
# YouTube Live Chat Overlay - Development Plan
## Current Status (v0.1.0-alpha)
The YouTube Live Chat Overlay is a functional prototype that scrapes live chat messages from a specified YouTube live stream and displays them in a customizable web-based overlay.
**Key Features Implemented:**
* **Backend (`overlay_backend.py`):**
* Scrapes YouTube Live Chat using `pytchat`.
* Converts common text-based emotes (e.g., `:smiling_face_with_heart_eyes:`) to their Unicode emoji equivalents for better display.
* Applies rich text markup (`[magenta]` for Unicode emojis, `[blue]` for other text-based emotes if detected).
* Manages persistent user colors, assigning unique colors to chat participants.
* Exposes a `/chat` API endpoint using Flask to provide live chat messages to the frontend.
* Includes CORS support to allow access from local `file://` origins.
* Runs Flask in a separate thread and `pytchat` scraping in the main thread to avoid `signal` errors.
* Suppresses verbose terminal output for cleaner operation.
* **Frontend (HTML/CSS/JavaScript):**
* **`index.html`:** Basic structure for the chat overlay.
* **`style.css`:** Provides basic styling for chat messages, including text shadow for readability and distinct colors for emotes.
* **`script.js`:**
* Periodically fetches chat messages from the Python Flask backend.
* Dynamically updates the HTML content with new messages.
* Converts rich text markup (`[magenta]...[/magenta]`, `[blue]...[/blue]`) into corresponding HTML `<span>` tags with CSS classes (`.emoji`, `.blue-text`).
**Known Issues/Limitations:**
* The `emote_to_unicode_map` is hardcoded in `backend.py` and is not exhaustive. New or less common text-based emotes will not be converted.
* The frontend uses polling (fetching data every second) which is not ideal for real-time applications and can be inefficient.
* The `emoji_pattern` for detecting general Unicode emojis in `backend.py` is comprehensive, but may not cover all edge cases or future Unicode additions.
* No support for YouTube's custom channel emotes (e.g., Twitch-style subscriber emotes).
## Future Development Ideas
1. **Dynamic Emote Mapping:**
* Implement a way to dynamically fetch or update text-based emote to Unicode/image mappings (e.g., from a configuration file, an external API, or by scraping common YouTube emote lists).
2. **WebSocket Integration:**
* Replace HTTP polling with a WebSocket connection for true real-time chat updates, reducing latency and resource usage.
* This would involve using Flask-SocketIO or a similar library in the backend and a WebSocket client in the frontend.
3. **Customizable Themes/Layouts:**
* Allow users to easily customize the appearance of the overlay (fonts, colors, message layout) without editing CSS directly (e.g., via a simple configuration file or an in-browser settings panel).
4. **YouTube Custom Emote Support:**
* Investigate ways to display YouTube's custom channel-specific emotes, which are often image-based. This would likely involve fetching emote image URLs and incorporating `<img>` tags.
5. **Error Handling & Robustness:**
* Improve error handling in both backend and frontend for network issues, API changes, or unexpected data.
* Add better reconnection logic for the chat scraper.
6. **Packaging/Deployment:**
* Provide scripts or instructions for easily packaging the backend (e.g., as a Docker container or standalone executable) and the frontend for OBS Studio or other streaming software.
7. **Configuration:**
* Implement a configuration file (e.g., `config.ini` or `config.json`) for backend settings like the Flask port, default video ID, and emote mappings.
## Installation and Usage
Refer to the `HOW-TO.md` or `INSTALLATION.md` for instructions on setting up and running the overlay.

58
README.md Normal file
View File

@@ -0,0 +1,58 @@
# YouTube Live Chat Overlay
This project provides a customizable web-based overlay for displaying live chat messages from YouTube streams. It consists of a Python backend that scrapes chat data and a simple HTML/CSS/JavaScript frontend for rendering the overlay.
## Features
* Real-time display of YouTube Live Chat messages.
* Automatic assignment of unique, persistent colors to chat participants.
* Conversion of common text-based emotes to Unicode emojis.
* Rich text markup for emotes (e.g., colored text).
* Designed for use with streaming software like OBS Studio as a "Browser Source".
## Installation and Usage
### Prerequisites
* Python 3.8+
* `pip` (Python package installer)
### Setup
1. **Navigate to the project directory:**
```bash
cd /home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay
```
2. **Create and activate a Python virtual environment:**
```bash
python3 -m venv venv
source venv/bin/activate # For Bash/Zsh
# or source venv/bin/activate.fish # For Fish Shell
```
3. **Install required Python packages:**
```bash
pip install Flask Flask-Cors pytchat rich
```
### Running the Overlay
1. **Start the Backend Server:**
Open your terminal, navigate to the project directory, activate your virtual environment, and run the `backend.py` script:
```bash
python overlay_backend.py
```
The script will prompt you to "Enter the YouTube Live Stream Video ID for the overlay:". Provide the 11-character ID of the live stream you wish to monitor and press Enter. The Flask server will start, typically on `http://127.0.0.1:5000`.
2. **Open the Web Overlay:**
* **In a Web Browser:** Open your preferred web browser and navigate to the `index.html` file located at `/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/index.html`. You can usually drag and drop the file into your browser, or type the full `file://` path in the address bar.
* **In OBS Studio (as a Browser Source):**
1. In OBS Studio, add a new "Browser" source.
2. Check "Local file" and browse to select the `index.html` file.
3. Set the width and height as desired (e.g., 1920x1080 or a custom size for your chat box).
4. Ensure "Refresh browser when scene becomes active" is checked.
## Development and Future Plans
For more detailed information on the project's current status, known issues, and future development ideas, please refer to the `DEVELOPMENT_PLAN.md` file in this directory.

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,354 @@
('/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/dist/overlay_backend',
True,
False,
False,
None,
None,
False,
False,
None,
True,
False,
None,
None,
None,
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/build/overlay_backend/overlay_backend.pkg',
[('pyi-contents-directory _internal', '', 'OPTION'),
('PYZ-00.pyz',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/build/overlay_backend/PYZ-00.pyz',
'PYZ'),
('python3.13/lib-dynload/_struct.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_struct.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/zlib.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/zlib.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('struct',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/build/overlay_backend/localpycs/struct.pyc',
'PYMODULE'),
('pyimod01_archive',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/build/overlay_backend/localpycs/pyimod01_archive.pyc',
'PYMODULE'),
('pyimod02_importers',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/build/overlay_backend/localpycs/pyimod02_importers.pyc',
'PYMODULE'),
('pyimod03_ctypes',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/build/overlay_backend/localpycs/pyimod03_ctypes.pyc',
'PYMODULE'),
('pyiboot01_bootstrap',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/PyInstaller/loader/pyiboot01_bootstrap.py',
'PYSOURCE'),
('pyi_rth_inspect',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/PyInstaller/hooks/rthooks/pyi_rth_inspect.py',
'PYSOURCE'),
('pyi_rth_setuptools',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/PyInstaller/hooks/rthooks/pyi_rth_setuptools.py',
'PYSOURCE'),
('pyi_rth_pkgutil',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pkgutil.py',
'PYSOURCE'),
('pyi_rth_multiprocessing',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/PyInstaller/hooks/rthooks/pyi_rth_multiprocessing.py',
'PYSOURCE'),
('overlay_backend',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/overlay_backend.py',
'PYSOURCE'),
('libpython3.13.so.1.0', '/usr/lib/libpython3.13.so.1.0', 'BINARY'),
('libobjc.so.4', '/usr/lib/libobjc.so.4', 'BINARY'),
('python3.13/lib-dynload/grp.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/grp.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/math.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/math.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/select.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/select.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_posixsubprocess.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_posixsubprocess.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/fcntl.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/fcntl.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_posixshmem.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_posixshmem.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_multiprocessing.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_multiprocessing.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/pyexpat.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/pyexpat.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/termios.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/termios.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_statistics.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_statistics.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_sha2.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_sha2.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_random.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_random.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/binascii.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/binascii.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_ssl.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_ssl.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_hashlib.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_hashlib.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_sha3.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_sha3.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_blake2.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_blake2.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_md5.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_md5.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_sha1.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_sha1.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_bisect.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_bisect.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/unicodedata.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/unicodedata.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_contextvars.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_contextvars.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_decimal.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_decimal.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/array.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/array.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_socket.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_socket.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_csv.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_csv.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_opcode.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_opcode.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/resource.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/resource.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_lzma.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_lzma.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_bz2.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_bz2.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/mmap.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/mmap.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_ctypes.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_ctypes.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_queue.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_queue.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_pickle.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_pickle.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/syslog.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/syslog.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_asyncio.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_asyncio.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_curses.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_curses.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/readline.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/readline.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_heapq.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_heapq.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_multibytecodec.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_multibytecodec.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_codecs_jp.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_codecs_jp.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_codecs_kr.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_codecs_kr.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_codecs_iso2022.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_codecs_iso2022.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_codecs_cn.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_codecs_cn.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_codecs_tw.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_codecs_tw.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_codecs_hk.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_codecs_hk.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('markupsafe/_speedups.cpython-313-x86_64-linux-gnu.so',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/markupsafe/_speedups.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_uuid.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_uuid.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_datetime.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_datetime.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_json.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_json.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('libgcc_s.so.1', '/usr/lib/libgcc_s.so.1', 'BINARY'),
('libz.so.1', '/usr/lib/libz.so.1', 'BINARY'),
('libexpat.so.1', '/usr/lib/libexpat.so.1', 'BINARY'),
('libssl.so.3', '/usr/lib/libssl.so.3', 'BINARY'),
('libcrypto.so.3', '/usr/lib/libcrypto.so.3', 'BINARY'),
('libmpdec.so.4', '/usr/lib/libmpdec.so.4', 'BINARY'),
('liblzma.so.5', '/usr/lib/liblzma.so.5', 'BINARY'),
('libbz2.so.1.0', '/usr/lib/libbz2.so.1.0', 'BINARY'),
('libffi.so.8', '/usr/lib/libffi.so.8', 'BINARY'),
('libncursesw.so.6', '/usr/lib/libncursesw.so.6', 'BINARY'),
('libreadline.so.8', '/usr/lib/libreadline.so.8', 'BINARY'),
('libuuid.so.1', '/usr/lib/libuuid.so.1', 'BINARY'),
('static/script.js',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/script.js',
'DATA'),
('static/style.css',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/style.css',
'DATA'),
('templates/index.html',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/index.html',
'DATA'),
('setuptools/_vendor/importlib_metadata-8.0.0.dist-info/METADATA',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/METADATA',
'DATA'),
('setuptools/_vendor/importlib_metadata-8.0.0.dist-info/LICENSE',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/LICENSE',
'DATA'),
('setuptools/_vendor/importlib_metadata-8.0.0.dist-info/INSTALLER',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/INSTALLER',
'DATA'),
('setuptools/_vendor/importlib_metadata-8.0.0.dist-info/top_level.txt',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/top_level.txt',
'DATA'),
('setuptools/_vendor/importlib_metadata-8.0.0.dist-info/RECORD',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/RECORD',
'DATA'),
('setuptools/_vendor/importlib_metadata-8.0.0.dist-info/WHEEL',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/WHEEL',
'DATA'),
('setuptools/_vendor/importlib_metadata-8.0.0.dist-info/REQUESTED',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/REQUESTED',
'DATA'),
('setuptools/_vendor/jaraco/text/Lorem ipsum.txt',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/setuptools/_vendor/jaraco/text/Lorem '
'ipsum.txt',
'DATA'),
('certifi/cacert.pem',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/certifi/cacert.pem',
'DATA'),
('certifi/py.typed',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/certifi/py.typed',
'DATA'),
('flask-3.1.2.dist-info/REQUESTED',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/flask-3.1.2.dist-info/REQUESTED',
'DATA'),
('flask-3.1.2.dist-info/INSTALLER',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/flask-3.1.2.dist-info/INSTALLER',
'DATA'),
('werkzeug-3.1.3.dist-info/LICENSE.txt',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/werkzeug-3.1.3.dist-info/LICENSE.txt',
'DATA'),
('flask-3.1.2.dist-info/WHEEL',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/flask-3.1.2.dist-info/WHEEL',
'DATA'),
('itsdangerous-2.2.0.dist-info/INSTALLER',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/itsdangerous-2.2.0.dist-info/INSTALLER',
'DATA'),
('markupsafe-3.0.3.dist-info/WHEEL',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/markupsafe-3.0.3.dist-info/WHEEL',
'DATA'),
('flask-3.1.2.dist-info/entry_points.txt',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/flask-3.1.2.dist-info/entry_points.txt',
'DATA'),
('markupsafe-3.0.3.dist-info/INSTALLER',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/markupsafe-3.0.3.dist-info/INSTALLER',
'DATA'),
('werkzeug-3.1.3.dist-info/INSTALLER',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/werkzeug-3.1.3.dist-info/INSTALLER',
'DATA'),
('markupsafe-3.0.3.dist-info/top_level.txt',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/markupsafe-3.0.3.dist-info/top_level.txt',
'DATA'),
('click-8.3.0.dist-info/licenses/LICENSE.txt',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/click-8.3.0.dist-info/licenses/LICENSE.txt',
'DATA'),
('itsdangerous-2.2.0.dist-info/WHEEL',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/itsdangerous-2.2.0.dist-info/WHEEL',
'DATA'),
('werkzeug-3.1.3.dist-info/RECORD',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/werkzeug-3.1.3.dist-info/RECORD',
'DATA'),
('itsdangerous-2.2.0.dist-info/LICENSE.txt',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/itsdangerous-2.2.0.dist-info/LICENSE.txt',
'DATA'),
('flask-3.1.2.dist-info/RECORD',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/flask-3.1.2.dist-info/RECORD',
'DATA'),
('flask-3.1.2.dist-info/licenses/LICENSE.txt',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/flask-3.1.2.dist-info/licenses/LICENSE.txt',
'DATA'),
('werkzeug-3.1.3.dist-info/METADATA',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/werkzeug-3.1.3.dist-info/METADATA',
'DATA'),
('click-8.3.0.dist-info/INSTALLER',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/click-8.3.0.dist-info/INSTALLER',
'DATA'),
('markupsafe-3.0.3.dist-info/RECORD',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/markupsafe-3.0.3.dist-info/RECORD',
'DATA'),
('click-8.3.0.dist-info/RECORD',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/click-8.3.0.dist-info/RECORD',
'DATA'),
('markupsafe-3.0.3.dist-info/licenses/LICENSE.txt',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/markupsafe-3.0.3.dist-info/licenses/LICENSE.txt',
'DATA'),
('flask-3.1.2.dist-info/METADATA',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/flask-3.1.2.dist-info/METADATA',
'DATA'),
('click-8.3.0.dist-info/WHEEL',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/click-8.3.0.dist-info/WHEEL',
'DATA'),
('werkzeug-3.1.3.dist-info/WHEEL',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/werkzeug-3.1.3.dist-info/WHEEL',
'DATA'),
('itsdangerous-2.2.0.dist-info/RECORD',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/itsdangerous-2.2.0.dist-info/RECORD',
'DATA'),
('markupsafe-3.0.3.dist-info/METADATA',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/markupsafe-3.0.3.dist-info/METADATA',
'DATA'),
('itsdangerous-2.2.0.dist-info/METADATA',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/itsdangerous-2.2.0.dist-info/METADATA',
'DATA'),
('click-8.3.0.dist-info/METADATA',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/click-8.3.0.dist-info/METADATA',
'DATA'),
('base_library.zip',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/build/overlay_backend/base_library.zip',
'DATA')],
[],
False,
False,
1762183640,
[('run',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/PyInstaller/bootloader/Linux-64bit-intel/run',
'EXECUTABLE')],
'/usr/lib/libpython3.13.so.1.0')

View File

@@ -0,0 +1,349 @@
('/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/build/overlay_backend/overlay_backend.pkg',
{'BINARY': True,
'DATA': True,
'EXECUTABLE': True,
'EXTENSION': True,
'PYMODULE': True,
'PYSOURCE': True,
'PYZ': False,
'SPLASH': True,
'SYMLINK': False},
[('pyi-contents-directory _internal', '', 'OPTION'),
('PYZ-00.pyz',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/build/overlay_backend/PYZ-00.pyz',
'PYZ'),
('python3.13/lib-dynload/_struct.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_struct.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/zlib.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/zlib.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('struct',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/build/overlay_backend/localpycs/struct.pyc',
'PYMODULE'),
('pyimod01_archive',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/build/overlay_backend/localpycs/pyimod01_archive.pyc',
'PYMODULE'),
('pyimod02_importers',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/build/overlay_backend/localpycs/pyimod02_importers.pyc',
'PYMODULE'),
('pyimod03_ctypes',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/build/overlay_backend/localpycs/pyimod03_ctypes.pyc',
'PYMODULE'),
('pyiboot01_bootstrap',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/PyInstaller/loader/pyiboot01_bootstrap.py',
'PYSOURCE'),
('pyi_rth_inspect',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/PyInstaller/hooks/rthooks/pyi_rth_inspect.py',
'PYSOURCE'),
('pyi_rth_setuptools',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/PyInstaller/hooks/rthooks/pyi_rth_setuptools.py',
'PYSOURCE'),
('pyi_rth_pkgutil',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pkgutil.py',
'PYSOURCE'),
('pyi_rth_multiprocessing',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/PyInstaller/hooks/rthooks/pyi_rth_multiprocessing.py',
'PYSOURCE'),
('overlay_backend',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/overlay_backend.py',
'PYSOURCE'),
('libpython3.13.so.1.0', '/usr/lib/libpython3.13.so.1.0', 'BINARY'),
('libobjc.so.4', '/usr/lib/libobjc.so.4', 'BINARY'),
('python3.13/lib-dynload/grp.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/grp.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/math.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/math.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/select.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/select.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_posixsubprocess.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_posixsubprocess.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/fcntl.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/fcntl.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_posixshmem.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_posixshmem.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_multiprocessing.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_multiprocessing.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/pyexpat.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/pyexpat.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/termios.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/termios.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_statistics.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_statistics.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_sha2.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_sha2.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_random.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_random.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/binascii.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/binascii.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_ssl.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_ssl.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_hashlib.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_hashlib.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_sha3.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_sha3.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_blake2.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_blake2.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_md5.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_md5.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_sha1.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_sha1.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_bisect.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_bisect.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/unicodedata.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/unicodedata.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_contextvars.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_contextvars.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_decimal.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_decimal.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/array.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/array.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_socket.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_socket.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_csv.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_csv.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_opcode.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_opcode.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/resource.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/resource.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_lzma.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_lzma.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_bz2.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_bz2.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/mmap.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/mmap.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_ctypes.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_ctypes.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_queue.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_queue.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_pickle.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_pickle.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/syslog.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/syslog.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_asyncio.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_asyncio.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_curses.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_curses.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/readline.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/readline.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_heapq.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_heapq.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_multibytecodec.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_multibytecodec.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_codecs_jp.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_codecs_jp.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_codecs_kr.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_codecs_kr.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_codecs_iso2022.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_codecs_iso2022.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_codecs_cn.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_codecs_cn.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_codecs_tw.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_codecs_tw.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_codecs_hk.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_codecs_hk.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('markupsafe/_speedups.cpython-313-x86_64-linux-gnu.so',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/markupsafe/_speedups.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_uuid.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_uuid.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_datetime.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_datetime.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('python3.13/lib-dynload/_json.cpython-313-x86_64-linux-gnu.so',
'/usr/lib/python3.13/lib-dynload/_json.cpython-313-x86_64-linux-gnu.so',
'EXTENSION'),
('libgcc_s.so.1', '/usr/lib/libgcc_s.so.1', 'BINARY'),
('libz.so.1', '/usr/lib/libz.so.1', 'BINARY'),
('libexpat.so.1', '/usr/lib/libexpat.so.1', 'BINARY'),
('libssl.so.3', '/usr/lib/libssl.so.3', 'BINARY'),
('libcrypto.so.3', '/usr/lib/libcrypto.so.3', 'BINARY'),
('libmpdec.so.4', '/usr/lib/libmpdec.so.4', 'BINARY'),
('liblzma.so.5', '/usr/lib/liblzma.so.5', 'BINARY'),
('libbz2.so.1.0', '/usr/lib/libbz2.so.1.0', 'BINARY'),
('libffi.so.8', '/usr/lib/libffi.so.8', 'BINARY'),
('libncursesw.so.6', '/usr/lib/libncursesw.so.6', 'BINARY'),
('libreadline.so.8', '/usr/lib/libreadline.so.8', 'BINARY'),
('libuuid.so.1', '/usr/lib/libuuid.so.1', 'BINARY'),
('static/script.js',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/script.js',
'DATA'),
('static/style.css',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/style.css',
'DATA'),
('templates/index.html',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/index.html',
'DATA'),
('setuptools/_vendor/importlib_metadata-8.0.0.dist-info/METADATA',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/METADATA',
'DATA'),
('setuptools/_vendor/importlib_metadata-8.0.0.dist-info/LICENSE',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/LICENSE',
'DATA'),
('setuptools/_vendor/importlib_metadata-8.0.0.dist-info/INSTALLER',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/INSTALLER',
'DATA'),
('setuptools/_vendor/importlib_metadata-8.0.0.dist-info/top_level.txt',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/top_level.txt',
'DATA'),
('setuptools/_vendor/importlib_metadata-8.0.0.dist-info/RECORD',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/RECORD',
'DATA'),
('setuptools/_vendor/importlib_metadata-8.0.0.dist-info/WHEEL',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/WHEEL',
'DATA'),
('setuptools/_vendor/importlib_metadata-8.0.0.dist-info/REQUESTED',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/setuptools/_vendor/importlib_metadata-8.0.0.dist-info/REQUESTED',
'DATA'),
('setuptools/_vendor/jaraco/text/Lorem ipsum.txt',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/setuptools/_vendor/jaraco/text/Lorem '
'ipsum.txt',
'DATA'),
('certifi/cacert.pem',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/certifi/cacert.pem',
'DATA'),
('certifi/py.typed',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/certifi/py.typed',
'DATA'),
('flask-3.1.2.dist-info/REQUESTED',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/flask-3.1.2.dist-info/REQUESTED',
'DATA'),
('flask-3.1.2.dist-info/INSTALLER',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/flask-3.1.2.dist-info/INSTALLER',
'DATA'),
('werkzeug-3.1.3.dist-info/LICENSE.txt',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/werkzeug-3.1.3.dist-info/LICENSE.txt',
'DATA'),
('flask-3.1.2.dist-info/WHEEL',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/flask-3.1.2.dist-info/WHEEL',
'DATA'),
('itsdangerous-2.2.0.dist-info/INSTALLER',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/itsdangerous-2.2.0.dist-info/INSTALLER',
'DATA'),
('markupsafe-3.0.3.dist-info/WHEEL',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/markupsafe-3.0.3.dist-info/WHEEL',
'DATA'),
('flask-3.1.2.dist-info/entry_points.txt',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/flask-3.1.2.dist-info/entry_points.txt',
'DATA'),
('markupsafe-3.0.3.dist-info/INSTALLER',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/markupsafe-3.0.3.dist-info/INSTALLER',
'DATA'),
('werkzeug-3.1.3.dist-info/INSTALLER',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/werkzeug-3.1.3.dist-info/INSTALLER',
'DATA'),
('markupsafe-3.0.3.dist-info/top_level.txt',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/markupsafe-3.0.3.dist-info/top_level.txt',
'DATA'),
('click-8.3.0.dist-info/licenses/LICENSE.txt',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/click-8.3.0.dist-info/licenses/LICENSE.txt',
'DATA'),
('itsdangerous-2.2.0.dist-info/WHEEL',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/itsdangerous-2.2.0.dist-info/WHEEL',
'DATA'),
('werkzeug-3.1.3.dist-info/RECORD',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/werkzeug-3.1.3.dist-info/RECORD',
'DATA'),
('itsdangerous-2.2.0.dist-info/LICENSE.txt',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/itsdangerous-2.2.0.dist-info/LICENSE.txt',
'DATA'),
('flask-3.1.2.dist-info/RECORD',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/flask-3.1.2.dist-info/RECORD',
'DATA'),
('flask-3.1.2.dist-info/licenses/LICENSE.txt',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/flask-3.1.2.dist-info/licenses/LICENSE.txt',
'DATA'),
('werkzeug-3.1.3.dist-info/METADATA',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/werkzeug-3.1.3.dist-info/METADATA',
'DATA'),
('click-8.3.0.dist-info/INSTALLER',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/click-8.3.0.dist-info/INSTALLER',
'DATA'),
('markupsafe-3.0.3.dist-info/RECORD',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/markupsafe-3.0.3.dist-info/RECORD',
'DATA'),
('click-8.3.0.dist-info/RECORD',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/click-8.3.0.dist-info/RECORD',
'DATA'),
('markupsafe-3.0.3.dist-info/licenses/LICENSE.txt',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/markupsafe-3.0.3.dist-info/licenses/LICENSE.txt',
'DATA'),
('flask-3.1.2.dist-info/METADATA',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/flask-3.1.2.dist-info/METADATA',
'DATA'),
('click-8.3.0.dist-info/WHEEL',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/click-8.3.0.dist-info/WHEEL',
'DATA'),
('werkzeug-3.1.3.dist-info/WHEEL',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/werkzeug-3.1.3.dist-info/WHEEL',
'DATA'),
('itsdangerous-2.2.0.dist-info/RECORD',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/itsdangerous-2.2.0.dist-info/RECORD',
'DATA'),
('markupsafe-3.0.3.dist-info/METADATA',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/markupsafe-3.0.3.dist-info/METADATA',
'DATA'),
('itsdangerous-2.2.0.dist-info/METADATA',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/itsdangerous-2.2.0.dist-info/METADATA',
'DATA'),
('click-8.3.0.dist-info/METADATA',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/click-8.3.0.dist-info/METADATA',
'DATA'),
('base_library.zip',
'/home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/build/overlay_backend/base_library.zip',
'DATA')],
'libpython3.13.so.1.0',
False,
False,
False,
[],
None,
None,
None)

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,87 @@
This file lists modules PyInstaller was not able to find. This does not
necessarily mean this module is required for running your program. Python and
Python 3rd-party packages include a lot of conditional or optional modules. For
example the module 'ntpath' only exists on Windows, whereas the module
'posixpath' only exists on Posix systems.
Types if import:
* top-level: imported at the top-level - look at these first
* conditional: imported within an if-statement
* delayed: imported within a function
* optional: imported within a try-except-statement
IMPORTANT: Do NOT post this list to the issue-tracker. Use it as a basis for
tracking down the missing module yourself. Thanks!
missing module named 'collections.abc' - imported by traceback (top-level), typing (top-level), inspect (top-level), logging (top-level), importlib.resources.readers (top-level), selectors (top-level), tracemalloc (top-level), http.client (top-level), httpx._models (top-level), asyncio.base_events (top-level), asyncio.coroutines (top-level), anyio._core._eventloop (top-level), setuptools (top-level), setuptools._distutils.filelist (top-level), setuptools._distutils.util (top-level), setuptools._vendor.jaraco.functools (top-level), setuptools._vendor.more_itertools.more (top-level), setuptools._vendor.more_itertools.recipes (top-level), setuptools._distutils._modified (top-level), setuptools._distutils.compat (top-level), setuptools._distutils.spawn (top-level), setuptools._distutils.compilers.C.base (top-level), setuptools._distutils.fancy_getopt (top-level), setuptools._reqs (top-level), setuptools.discovery (top-level), setuptools.dist (top-level), setuptools._distutils.command.bdist (top-level), setuptools._distutils.core (top-level), setuptools._distutils.cmd (top-level), setuptools._distutils.dist (top-level), configparser (top-level), setuptools._distutils.extension (top-level), setuptools.config.setupcfg (top-level), setuptools.config.expand (top-level), setuptools.config.pyprojecttoml (top-level), setuptools.config._apply_pyprojecttoml (top-level), tomllib._parser (top-level), setuptools._vendor.tomli._parser (top-level), setuptools.command.egg_info (top-level), setuptools._distutils.command.build (top-level), setuptools._distutils.command.sdist (top-level), setuptools.glob (top-level), setuptools.command._requirestxt (top-level), setuptools.command.bdist_wheel (top-level), setuptools._vendor.wheel.cli.convert (top-level), setuptools._vendor.wheel.cli.tags (top-level), setuptools._vendor.typing_extensions (top-level), anyio.abc._eventloop (top-level), anyio._core._synchronization (top-level), anyio._core._exceptions (top-level), anyio._core._tasks (top-level), anyio.abc._tasks (top-level), anyio._core._testing (top-level), anyio.from_thread (top-level), anyio.abc._sockets (top-level), anyio._core._typedattr (top-level), anyio.abc._streams (top-level), anyio._core._sockets (top-level), anyio.to_thread (top-level), anyio.streams.stapled (top-level), anyio.streams.tls (top-level), anyio.abc._testing (top-level), anyio._core._fileio (top-level), anyio._core._signals (top-level), anyio._core._subprocesses (top-level), anyio._core._tempfile (top-level), hpack.hpack (conditional), hyperframe.frame (conditional), hyperframe.flags (top-level), h2.settings (top-level), h2.utilities (conditional), h2.stream (conditional), h2.connection (conditional), click.core (top-level), click.types (top-level), click._compat (top-level), click._winconsole (top-level), click.exceptions (top-level), click.utils (top-level), click.shell_completion (top-level), click.formatting (top-level), click.parser (top-level), click._textwrap (top-level), click.termui (top-level), click._termui_impl (top-level), markdown_it.main (top-level), markdown_it.ruler (top-level), markdown_it.utils (top-level), markdown_it.token (top-level), markdown_it.common.normalize_url (top-level), mdurl._decode (top-level), mdurl._encode (top-level), markdown_it._punycode (top-level), markdown_it.parser_block (top-level), markdown_it.parser_core (top-level), markdown_it.parser_inline (top-level), markdown_it.renderer (top-level), rich.scope (top-level), werkzeug.wrappers.request (top-level), werkzeug.datastructures.accept (top-level), werkzeug.datastructures.structures (top-level), markupsafe (top-level), werkzeug.datastructures.cache_control (top-level), werkzeug.datastructures.mixins (top-level), werkzeug.datastructures.auth (top-level), werkzeug.datastructures.csp (top-level), werkzeug.datastructures.etag (top-level), werkzeug.datastructures.file_storage (top-level), werkzeug.datastructures.headers (top-level), werkzeug.datastructures.range (top-level), werkzeug.middleware.shared_data (top-level), flask.app (top-level), flask.cli (top-level), blinker.base (top-level), blinker._utilities (top-level), flask.typing (top-level), flask.sessions (top-level), itsdangerous.serializer (top-level), itsdangerous.signer (top-level), itsdangerous.timed (top-level), click.testing (top-level), flask_cors.core (top-level), anyio._backends._asyncio (top-level), anyio._core._asyncio_selector_thread (top-level), anyio._backends._trio (top-level), setuptools._distutils.command.build_ext (top-level), _pyrepl.types (top-level), _pyrepl.readline (top-level), setuptools._distutils.compilers.C.msvc (top-level)
missing module named _winapi - imported by ntpath (optional), encodings (delayed, conditional, optional), shutil (conditional), subprocess (conditional), mimetypes (optional), multiprocessing.connection (optional), multiprocessing.spawn (delayed, conditional), multiprocessing.reduction (conditional), multiprocessing.shared_memory (conditional), multiprocessing.heap (conditional), multiprocessing.popen_spawn_win32 (top-level), asyncio.windows_events (top-level), asyncio.windows_utils (top-level), sysconfig (delayed)
missing module named msvcrt - imported by subprocess (optional), getpass (optional), multiprocessing.spawn (delayed, conditional), multiprocessing.popen_spawn_win32 (top-level), asyncio.windows_events (top-level), asyncio.windows_utils (top-level), click._winconsole (top-level), click._termui_impl (conditional), _pyrepl.windows_console (top-level)
missing module named winreg - imported by importlib._bootstrap_external (conditional), mimetypes (optional), urllib.request (delayed, conditional, optional), platform (delayed, optional), werkzeug.debug (delayed, conditional), pygments.formatters.img (optional), setuptools._distutils.compilers.C.msvc (top-level), setuptools.msvc (conditional)
missing module named _scproxy - imported by urllib.request (conditional)
missing module named multiprocessing.BufferTooShort - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
missing module named multiprocessing.AuthenticationError - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
missing module named _frozen_importlib_external - imported by importlib._bootstrap (delayed), importlib (optional), importlib.abc (optional), zipimport (top-level)
excluded module named _frozen_importlib - imported by importlib (optional), importlib.abc (optional), zipimport (top-level)
missing module named nt - imported by os (delayed, conditional, optional), ntpath (optional), shutil (conditional), importlib._bootstrap_external (conditional), _colorize (delayed, conditional, optional), ctypes (delayed, conditional), _pyrepl.windows_console (delayed, optional)
missing module named multiprocessing.get_context - imported by multiprocessing (top-level), multiprocessing.pool (top-level), multiprocessing.managers (top-level), multiprocessing.sharedctypes (top-level)
missing module named multiprocessing.TimeoutError - imported by multiprocessing (top-level), multiprocessing.pool (top-level)
missing module named multiprocessing.set_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
missing module named multiprocessing.get_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
missing module named multiprocessing.Value - imported by multiprocessing (top-level), werkzeug.debug (top-level)
missing module named pyimod02_importers - imported by /home/joe/Cloud9/Documents/Obisdian/projects/Overlays/youtube-chat-overlay/venv/lib/python3.13/site-packages/PyInstaller/hooks/rthooks/pyi_rth_pkgutil.py (delayed)
missing module named typing_extensions.Buffer - imported by setuptools._vendor.typing_extensions (top-level), setuptools._vendor.wheel.wheelfile (conditional)
missing module named typing_extensions.Literal - imported by setuptools._vendor.typing_extensions (top-level), setuptools.config._validate_pyproject.formats (conditional)
missing module named typing_extensions.Self - imported by setuptools._vendor.typing_extensions (top-level), setuptools.config.expand (conditional), setuptools.config.pyprojecttoml (conditional), setuptools.config._validate_pyproject.error_reporting (conditional)
missing module named typing_extensions.deprecated - imported by setuptools._vendor.typing_extensions (top-level), setuptools._distutils.sysconfig (conditional), setuptools._distutils.command.bdist (conditional)
missing module named typing_extensions.TypeAlias - imported by setuptools._vendor.typing_extensions (top-level), setuptools._distutils.compilers.C.base (conditional), setuptools._reqs (conditional), setuptools.warnings (conditional), setuptools._path (conditional), setuptools._distutils.dist (conditional), setuptools.config.setupcfg (conditional), setuptools.config._apply_pyprojecttoml (conditional), setuptools.dist (conditional), setuptools.command.bdist_egg (conditional), setuptools.compat.py311 (conditional)
missing module named typing_extensions.Unpack - imported by setuptools._vendor.typing_extensions (top-level), setuptools._distutils.util (conditional), setuptools._distutils.compilers.C.base (conditional), setuptools._distutils.cmd (conditional)
missing module named typing_extensions.TypeVarTuple - imported by setuptools._vendor.typing_extensions (top-level), setuptools._distutils.util (conditional), setuptools._distutils.compilers.C.base (conditional), setuptools._distutils.cmd (conditional)
missing module named _overlapped - imported by asyncio.windows_events (top-level)
missing module named asyncio.DefaultEventLoopPolicy - imported by asyncio (delayed, conditional), asyncio.events (delayed, conditional)
missing module named vms_lib - imported by platform (delayed, optional)
missing module named 'java.lang' - imported by platform (delayed, optional)
missing module named java - imported by platform (delayed)
missing module named _wmi - imported by platform (optional)
missing module named usercustomize - imported by site (delayed, optional)
missing module named sitecustomize - imported by site (delayed, optional)
missing module named _typeshed - imported by setuptools._distutils.dist (conditional), setuptools.glob (conditional), setuptools.compat.py311 (conditional), anyio.abc._eventloop (conditional), anyio._core._sockets (conditional), anyio._core._fileio (conditional), anyio._core._tempfile (conditional), httpx._transports.wsgi (conditional), click.testing (conditional), anyio._backends._asyncio (conditional), anyio._core._asyncio_selector_thread (conditional), anyio._backends._trio (conditional)
missing module named _manylinux - imported by packaging._manylinux (delayed, optional), setuptools._vendor.packaging._manylinux (delayed, optional), setuptools._vendor.wheel.vendored.packaging._manylinux (delayed, optional)
missing module named importlib_resources - imported by setuptools._vendor.jaraco.text (optional)
missing module named trove_classifiers - imported by setuptools.config._validate_pyproject.formats (optional)
missing module named IPython - imported by rich.jupyter (delayed, optional)
missing module named pygments.lexers.PrologLexer - imported by pygments.lexers (top-level), pygments.lexers.cplint (top-level)
missing module named _winreg - imported by pygments.formatters.img (optional)
missing module named PIL - imported by pygments.formatters.img (optional)
missing module named ctags - imported by pygments.formatters.html (optional)
missing module named chardet - imported by pygments.lexer (delayed, conditional, optional)
missing module named ipywidgets - imported by rich.live (delayed, conditional, optional)
missing module named 'IPython.display' - imported by rich.live (delayed, conditional, optional)
missing module named 'IPython.core' - imported by rich.pretty (delayed, optional)
missing module named attr - imported by rich.pretty (optional)
missing module named linkify_it - imported by markdown_it.main (optional)
missing module named '_typeshed.wsgi' - imported by httpx._transports.wsgi (conditional), werkzeug._internal (conditional), werkzeug.exceptions (conditional), werkzeug.http (conditional), werkzeug.wsgi (conditional), werkzeug.utils (conditional), werkzeug.wrappers.response (conditional), werkzeug.test (conditional), werkzeug.datastructures.headers (conditional), werkzeug.formparser (conditional), werkzeug.wrappers.request (conditional), werkzeug.serving (conditional), werkzeug.debug (conditional), werkzeug.middleware.shared_data (conditional), werkzeug.local (conditional), werkzeug.routing.exceptions (conditional), werkzeug.routing.map (conditional), flask.typing (conditional), flask.ctx (conditional), flask.testing (conditional), flask.cli (conditional), flask.app (conditional)
missing module named colorama - imported by click._compat (delayed, conditional), werkzeug._internal (delayed, optional)
missing module named 'watchdog.observers' - imported by werkzeug._reloader (delayed)
missing module named 'watchdog.events' - imported by werkzeug._reloader (delayed)
missing module named watchdog - imported by werkzeug._reloader (delayed)
missing module named 'cryptography.hazmat' - imported by werkzeug.serving (delayed, optional)
missing module named 'cryptography.x509' - imported by werkzeug.serving (delayed, conditional, optional)
missing module named cryptography - imported by werkzeug.serving (delayed, conditional, optional), flask.cli (delayed, conditional, optional)
missing module named asgiref - imported by flask.app (delayed, optional)
missing module named dotenv - imported by flask.cli (delayed, optional)
missing module named trio - imported by httpx._transports.asgi (delayed, conditional), httpcore._synchronization (optional), httpcore._backends.trio (top-level)
missing module named 'trio.testing' - imported by anyio._backends._trio (delayed)
missing module named exceptiongroup - imported by anyio._core._exceptions (conditional), anyio._core._sockets (conditional), anyio._backends._asyncio (conditional), anyio._backends._trio (conditional)
missing module named 'trio.to_thread' - imported by anyio._backends._trio (top-level)
missing module named 'trio.socket' - imported by anyio._backends._trio (top-level)
missing module named outcome - imported by anyio._backends._trio (top-level)
missing module named 'trio.lowlevel' - imported by anyio._backends._trio (top-level)
missing module named 'trio.from_thread' - imported by anyio._backends._trio (top-level)
missing module named _pytest - imported by anyio._backends._asyncio (delayed)
missing module named uvloop - imported by anyio._backends._asyncio (delayed, conditional)
missing module named curio - imported by sniffio._impl (delayed, conditional)
missing module named socksio - imported by httpcore._sync.socks_proxy (top-level), httpcore._async.socks_proxy (top-level), httpx._transports.default (delayed, conditional, optional)
missing module named zstandard - imported by httpx._decoders (optional)
missing module named brotlicffi - imported by httpx._decoders (optional)
missing module named brotli - imported by httpx._decoders (optional)

File diff suppressed because it is too large Load Diff

BIN
dist/overlay_backend vendored Executable file

Binary file not shown.

3
dist/user_colors.json vendored Normal file
View File

@@ -0,0 +1,3 @@
{
"UCnQp1K5xb4BwkQcgGWLDgXg": "#FF0000"
}

16
index.html Normal file
View File

@@ -0,0 +1,16 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>YouTube Live Chat Overlay</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div id="chat-container">
<!-- Chat messages will be loaded here by JavaScript -->
</div>
<script src="script.js"></script>
</body>
</html>

229
overlay_backend.py Normal file
View File

@@ -0,0 +1,229 @@
import pytchat
import os
import re
import json
from datetime import datetime
import time
import threading
import sys
from flask import Flask, jsonify, request, send_from_directory
from flask_cors import CORS
from rich.console import Console # Keep rich.console for internal logging, not for main output
console = Console() # Use a separate console for internal logging
# Define the emoji pattern and coloring function
emoji_pattern = re.compile(
"["
"\U0001F600-\U0001F64F" # emoticons
"\U0001F300-\U0001F5FF" # symbols & pictographs
"\U0001F680-\U0001F6FF" # transport & map symbols
"\U0001F1E0-\U0001F1FF" # flags (iOS)
"\u2600-\u26FF\u2700-\u27BF" # Miscellaneous Symbols and Dingbats
"\u2B50\u2B55\u3030\u303D\u3297\u3299" # Other common emojis
"\U00002500-\U00002BEF" # Chinese/Japanese characters (often used for emojis)
"\U00002702-\U000027B0"
"\U000024C2-\U0001F251"
"]+"
"\uFE0F?" # Variation Selector
"\U0001F3FB-\U0001F3FF?" # Skin tones
"\u200D?" # Zero Width Joiner
"\u20E3?" # Combining Enclosing Keycap
, flags=re.UNICODE)
def colour_emoji(txt):
return emoji_pattern.sub(r'[magenta]\g<0>[/magenta]', txt)
# --- User Color Management ---
USER_COLORS_FILE = "user_colors.json" # This file will be in the overlay project directory
# A palette of distinct colors for usernames
COLOR_PALETTE = [
"#FF0000", "#00FF00", "#0000FF", "#FFFF00", "#00FFFF", "#FF00FF",
"#FFA500", "#800080", "#008000", "#FFC0CB", "#808000", "#008080",
"#C0C0C0", "#800000", "#000080", "#FFD700", "#ADFF2F", "#FF69B4"
]
user_color_map = {}
def load_user_colors():
global user_color_map
if os.path.exists(USER_COLORS_FILE):
try:
with open(USER_COLORS_FILE, 'r') as f:
user_color_map = json.load(f)
except json.JSONDecodeError:
console.print(f"[red]Error loading {USER_COLORS_FILE}. File might be corrupted. Starting with empty colors.[/red]")
user_color_map = {}
def save_user_colors():
with open(USER_COLORS_FILE, 'w') as f:
json.dump(user_color_map, f, indent=4)
def get_user_color(author_id):
global user_color_map
if author_id not in user_color_map:
used_colors = set(user_color_map.values())
available_colors = [color for color in COLOR_PALETTE if color not in used_colors]
if available_colors:
next_color_index = len(user_color_map) % len(available_colors)
user_color_map[author_id] = available_colors[next_color_index]
else:
next_color_index = len(user_color_map) % len(COLOR_PALETTE)
user_color_map[author_id] = COLOR_PALETTE[next_color_index]
console.print("[yellow]Warning: All colors in palette are reserved. Cycling through existing colors.[/yellow]")
save_user_colors()
return user_color_map[author_id]
# --- Flask App Setup ---
# Determine if running as a PyInstaller bundle
if getattr(sys, 'frozen', False):
# If the application is run as a bundle, the PyInstaller bootloader
# extends the sys.path by a temporary directory and sets sys._MEIPASS
base_dir = sys._MEIPASS
else:
base_dir = os.path.abspath(os.path.dirname(__file__))
STATIC_FOLDER = os.path.join(base_dir, 'static')
TEMPLATE_FOLDER = os.path.join(base_dir, 'templates')
app = Flask(__name__, static_folder=STATIC_FOLDER, template_folder=TEMPLATE_FOLDER)
CORS(app) # Enable CORS for all routes
chat_messages = [] # Global list to store chat messages for the web overlay
chat_messages_lock = threading.Lock() # Lock for thread-safe access to chat_messages
@app.route('/')
def serve_index():
return send_from_directory(app.template_folder, 'index.html')
@app.route('/<path:filename>')
def serve_static(filename):
# Serve static files (CSS, JS) from the static folder
return send_from_directory(app.static_folder, filename)
@app.route('/chat')
def get_chat():
with chat_messages_lock:
# console.print(f"[blue]Sending {len(chat_messages)} messages to frontend.[/blue]") # Suppressed for cleaner output
return jsonify(chat_messages)
# --- Chat Scraper Thread ---
def chat_scraper_thread(video_id):
global chat_messages
load_user_colors() # Load colors once at startup of the scraper thread
try:
livechat = pytchat.create(video_id=video_id)
# console.print(f"[green]Chat scraper started for video ID: {video_id}[/green]") # Suppressed for cleaner output
message_count = 0
while livechat.is_alive():
for c in livechat.get().sync_items():
author_display_name = c.author.name
author_channel_id = c.author.channelId
message_text = c.message
# Mapping for common text-based emotes to Unicode emojis
# This dictionary should be defined once, outside the loop for efficiency
emote_to_unicode_map = {
":smiling_face_with_heart_eyes:": "😍",
":kissing_face:": "😗",
":grinning_face:": "😀",
":thumbs_up:": "👍",
":thumbs_down:": "👎",
":fire:": "🔥",
":heart:": "❤️",
":100:": "💯",
":clap:": "👏",
":thinking_face:": "🤔",
":face_with_tears_of_joy:": "😂",
":rolling_on_the_floor_laughing:": "🤣",
":slightly_smiling_face:": "🙂",
":winking_face:": "😉",
":pensive_face:": "😔",
":angry_face:": "😠",
":crying_face:": "😢",
":loudly_crying_face:": "😭",
":face_with_open_mouth:": "😮",
":hugging_face:": "🤗",
":star-struck:": "🤩",
":zany_face:": "🤪",
":face_with_raised_eyebrow:": "🤨",
":shushing_face:": "🤫",
":face_with_hand_over_mouth:": "🤭",
":face_with_symbols_on_mouth:": "🤬",
":exploding_head:": "🤯",
":face_vomiting:": "🤮",
":sneezing_face:": "🤧",
":hot_face:": "🥵",
":cold_face:": "🥶",
":woozy_face:": "🥴",
":dizzy_face:": "😵",
":face_with_monocle:": "🧐",
":cowboy_hat_face:": "🤠",
":partying_face:": "🥳",
":disguised_face:": "🥸",
":smiling_face_with_tear:": "🥲",
":pleading_face:": "🥺",
":face_holding_back_tears:": "🥹",
":saluting_face:": "🫡",
":melting_face:": "🫠",
":face_with_peeking_eye:": "🫣",
":face_with_diagonal_mouth:": "🫤",
":dotted_line_face:": "🫥",
":face_with_open_eyes_and_hand_over_mouth:": "🫢",
":face_with_head_shaking_horizontally:": "🫨",
":face_with_head_shaking_vertically:": "🫸",
}
def replace_emote_with_unicode(match):
emote_text = match.group(0)
return emote_to_unicode_map.get(emote_text, emote_text)
message_text = re.sub(r'(:[a-zA-Z0-9_-]+:)', replace_emote_with_unicode, message_text)
# Now, apply magenta coloring to the *actual* Unicode emojis
message_text = colour_emoji(message_text)
user_color = get_user_color(author_channel_id)
# Store message in a format suitable for JSON and web display
with chat_messages_lock:
chat_messages.append({
"timestamp": datetime.now().strftime("%H:%M:%S"),
"author": author_display_name,
"author_color": user_color,
"message": message_text
})
# Keep only the last N messages to prevent memory issues
if len(chat_messages) > 100: # Keep last 100 messages
chat_messages = chat_messages[-100:]
message_count += 1
time.sleep(1) # Poll every second to avoid excessive CPU usage
except Exception as e:
console.print(f"[red]Chat scraper error: {e}[/red]")
# finally:
# console.print("[yellow]Chat scraper stopped.[/yellow]") # Suppressed for cleaner output
if __name__ == '__main__':
# This part will be run when backend.py is executed directly
video_id = input("Enter the YouTube Live Stream Video ID for the overlay: ")
# Suppress Flask's default access logs
import logging
log = logging.getLogger('werkzeug')
log.setLevel(logging.ERROR) # Only log errors, not access messages
# Run the Flask app
flask_thread = threading.Thread(target=lambda: app.run(debug=False, host='127.0.0.1', port=5000))
flask_thread.daemon = True # Daemonize thread so it exits when main thread exits
flask_thread.start()
console.print(f"[green]Starting Flask server on http://127.0.0.1:5000[/green]")
console.print(f"[yellow]Overlay URL: http://127.0.0.1:5000/[/yellow]")
console.print("[yellow]Please copy this URL and paste it into your browser or streaming software (e.g., OBS Studio Browser Source).[/yellow]")
# Run the chat scraper in the main thread
chat_scraper_thread(video_id)

38
overlay_backend.spec Normal file
View File

@@ -0,0 +1,38 @@
# -*- mode: python ; coding: utf-8 -*-
a = Analysis(
['overlay_backend.py'],
pathex=[],
binaries=[],
datas=[('index.html', 'templates'), ('style.css', 'static'), ('script.js', 'static')],
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
noarchive=False,
optimize=0,
)
pyz = PYZ(a.pure)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.datas,
[],
name='overlay_backend',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)

47
script.js Normal file
View File

@@ -0,0 +1,47 @@
const chatContainer = document.getElementById('chat-container');
let lastMessageCount = 0;
function fetchChatMessages() {
fetch('http://127.0.0.1:5000/chat')
.then(response => response.json())
.then(messages => {
// Only append new messages
if (messages.length > lastMessageCount) {
for (let i = lastMessageCount; i < messages.length; i++) {
const messageData = messages[i];
const messageElement = document.createElement('div');
messageElement.classList.add('chat-message');
const authorElement = document.createElement('span');
authorElement.classList.add('chat-author');
authorElement.style.color = messageData.author_color; // Apply author color
authorElement.textContent = `${messageData.author}: `;
const textElement = document.createElement('span');
textElement.classList.add('chat-text');
// Basic rich markup conversion (e.g., [blue]text[/blue] to <span class="blue-text">text</span>)
let formattedMessage = messageData.message;
formattedMessage = formattedMessage.replace(/\[magenta\](.*?)\[\/magenta\]/g, '<span class="emoji">$1</span>');
formattedMessage = formattedMessage.replace(/\[blue\](.*?)\[\/blue\]/g, '<span class="blue-text">$1</span>');
textElement.innerHTML = formattedMessage;
messageElement.appendChild(authorElement);
messageElement.appendChild(textElement);
chatContainer.prepend(messageElement); // Add new messages to the top (due to flex-direction: column-reverse)
// Keep only a certain number of messages visible
while (chatContainer.children.length > 50) { // Keep last 50 messages
chatContainer.removeChild(chatContainer.lastChild);
}
}
lastMessageCount = messages.length;
}
})
.catch(error => console.error('Error fetching chat messages:', error));
}
// Fetch messages every 1 second
setInterval(fetchChatMessages, 1000);
// Initial fetch
fetchChatMessages();

45
style.css Normal file
View File

@@ -0,0 +1,45 @@
body {
margin: 0;
padding: 0;
font-family: 'Roboto', sans-serif;
background-color: transparent; /* Important for overlays */
overflow: hidden; /* Hide scrollbars */
}
#chat-container {
display: flex;
flex-direction: column-reverse; /* New messages appear at the bottom */
height: 100vh; /* Take full viewport height */
width: 100%;
padding: 10px;
box-sizing: border-box;
overflow-y: hidden; /* Hide scrollbar, messages will push older ones up */
}
.chat-message {
display: flex;
align-items: flex-start;
margin-bottom: 5px;
color: #fff; /* Default text color */
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.7); /* Outline for readability */
}
.chat-author {
font-weight: bold;
margin-right: 5px;
}
.chat-text {
word-wrap: break-word;
overflow-wrap: break-word;
flex-grow: 1;
}
/* Rich-like colors for emojis and special text */
.emoji {
color: magenta;
}
.blue-text {
color: blue;
}

3
user_colors.json Normal file
View File

@@ -0,0 +1,3 @@
{
"UCnQp1K5xb4BwkQcgGWLDgXg": "#FF0000"
}