Initial commit for YouTube Live Chat Overlay project.
This commit is contained in:
52
DEVELOPMENT_PLAN.md
Normal file
52
DEVELOPMENT_PLAN.md
Normal 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
58
README.md
Normal 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.
|
||||
3929
build/overlay_backend/Analysis-00.toc
Normal file
3929
build/overlay_backend/Analysis-00.toc
Normal file
File diff suppressed because it is too large
Load Diff
354
build/overlay_backend/EXE-00.toc
Normal file
354
build/overlay_backend/EXE-00.toc
Normal 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')
|
||||
349
build/overlay_backend/PKG-00.toc
Normal file
349
build/overlay_backend/PKG-00.toc
Normal 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)
|
||||
BIN
build/overlay_backend/PYZ-00.pyz
Normal file
BIN
build/overlay_backend/PYZ-00.pyz
Normal file
Binary file not shown.
3329
build/overlay_backend/PYZ-00.toc
Normal file
3329
build/overlay_backend/PYZ-00.toc
Normal file
File diff suppressed because it is too large
Load Diff
BIN
build/overlay_backend/base_library.zip
Normal file
BIN
build/overlay_backend/base_library.zip
Normal file
Binary file not shown.
BIN
build/overlay_backend/localpycs/pyimod01_archive.pyc
Normal file
BIN
build/overlay_backend/localpycs/pyimod01_archive.pyc
Normal file
Binary file not shown.
BIN
build/overlay_backend/localpycs/pyimod02_importers.pyc
Normal file
BIN
build/overlay_backend/localpycs/pyimod02_importers.pyc
Normal file
Binary file not shown.
BIN
build/overlay_backend/localpycs/pyimod03_ctypes.pyc
Normal file
BIN
build/overlay_backend/localpycs/pyimod03_ctypes.pyc
Normal file
Binary file not shown.
BIN
build/overlay_backend/localpycs/struct.pyc
Normal file
BIN
build/overlay_backend/localpycs/struct.pyc
Normal file
Binary file not shown.
BIN
build/overlay_backend/overlay_backend.pkg
Normal file
BIN
build/overlay_backend/overlay_backend.pkg
Normal file
Binary file not shown.
87
build/overlay_backend/warn-overlay_backend.txt
Normal file
87
build/overlay_backend/warn-overlay_backend.txt
Normal 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)
|
||||
41038
build/overlay_backend/xref-overlay_backend.html
Normal file
41038
build/overlay_backend/xref-overlay_backend.html
Normal file
File diff suppressed because it is too large
Load Diff
BIN
dist/overlay_backend
vendored
Executable file
BIN
dist/overlay_backend
vendored
Executable file
Binary file not shown.
3
dist/user_colors.json
vendored
Normal file
3
dist/user_colors.json
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"UCnQp1K5xb4BwkQcgGWLDgXg": "#FF0000"
|
||||
}
|
||||
16
index.html
Normal file
16
index.html
Normal 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
229
overlay_backend.py
Normal 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
38
overlay_backend.spec
Normal 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
47
script.js
Normal 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
45
style.css
Normal 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
3
user_colors.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"UCnQp1K5xb4BwkQcgGWLDgXg": "#FF0000"
|
||||
}
|
||||
Reference in New Issue
Block a user