Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
185d30c
Updated Front End
Mar 27, 2026
b84ee9a
Update
Mar 27, 2026
cca2f7c
Merge branch 'main' into develop
Apr 2, 2026
da7fd39
functioning webhook test
Apr 2, 2026
162e5ad
Save json payload to backend config
Apr 2, 2026
2b3a2ca
added ENV options for discord and webhook | validation on init.py
Apr 2, 2026
f3ea22a
added means to add integrations to config.json from init.py
Apr 2, 2026
8b907ed
Added test dicord webhook functionality
Apr 2, 2026
97ef030
Cleaned up GUI | clean up files
Apr 2, 2026
0a933a7
removed test ENVs
Apr 2, 2026
7e15a67
Added Regex validation in settings.js to check for valid URL for gene…
Apr 2, 2026
9296d5e
cleaned up code / removed comments
Apr 2, 2026
fb4084b
Added integration info cli.py for scanning to send generic_webook | A…
Apr 2, 2026
575a3d2
allow public upload folder selection, requires a setting to enable
ShaneIsrael Apr 2, 2026
5c2dd85
fix an issue in recorded date that would cause the date to jump forwa…
ShaneIsrael Apr 3, 2026
80b24a9
added ability to add a custom thumbnail or set the current frame as t…
ShaneIsrael Apr 3, 2026
929fd78
use nginx for thumbnail fetching
ShaneIsrael Apr 3, 2026
b82fa44
Merge pull request #535 from ShaneIsrael/fetch-custom-thumb-nginx
ShaneIsrael Apr 3, 2026
eff62ef
Updated Docs
theotherguy2175 Apr 3, 2026
3aabf02
Updated Docs | Readme.md
Apr 3, 2026
ceb9173
Removed Temp file
Apr 3, 2026
49414cf
added ability to move videos
ShaneIsrael Apr 3, 2026
3a08801
Migrated Notifications Docs to seperate MD file
Apr 3, 2026
56b2c86
Merge pull request #532 from theotherguy2175/develop
ShaneIsrael Apr 4, 2026
7c55d7d
cleaned up wording and grammar for notifications guide
ShaneIsrael Apr 4, 2026
53c043b
bulk file managing added
ShaneIsrael Apr 4, 2026
82e3929
make folder sections collapsible
ShaneIsrael Apr 4, 2026
1221e0a
fix zindex issue on select, sort folder select options alphabetically
ShaneIsrael Apr 4, 2026
55b19ce
Increase width of transcodes
ShaneIsrael Apr 4, 2026
1cea3f0
fix overflow hidden hiding folder dropdown, cleanup comments:
ShaneIsrael Apr 4, 2026
fb42332
update donate link
ShaneIsrael Apr 5, 2026
a1f5be9
fix centering on chips
ShaneIsrael Apr 5, 2026
8377e75
add libdav1d as a fallback decoder for av1
ShaneIsrael Apr 5, 2026
a5e2152
use libdav1d6
ShaneIsrael Apr 5, 2026
ec7d498
updated screenshots, updated docker examples
ShaneIsrael Apr 5, 2026
1c0d64f
fix buymeacoffee image
ShaneIsrael Apr 5, 2026
ce3f967
Merge pull request #540 from ShaneIsrael/bulk-file-moving
ShaneIsrael Apr 5, 2026
8538127
added ability to inject custom tracking scripts
ShaneIsrael Apr 6, 2026
f4a2f18
fixing analytic script injection
ShaneIsrael Apr 6, 2026
443d9d6
analytics injection fix attempt 2
ShaneIsrael Apr 6, 2026
1c318cf
handle unraid or systems that attempt to remove script characters
ShaneIsrael Apr 6, 2026
ea323bc
improve performance of admin bulk file fetching
ShaneIsrael Apr 6, 2026
88bd428
improved watch page layout
ShaneIsrael Apr 6, 2026
95de6ff
improve disk usage calculation by including derived data
ShaneIsrael Apr 6, 2026
2756f15
add derived size to bulk file manager
ShaneIsrael Apr 6, 2026
414337a
increase transcodes column size
ShaneIsrael Apr 6, 2026
fb90ee5
set min width
ShaneIsrael Apr 6, 2026
aaeb8f0
additional bulk file features, moved to own page
ShaneIsrael Apr 6, 2026
261c7b2
theme updates
ShaneIsrael Apr 6, 2026
d6a01e1
added a guard against empty results and pre filled the find/replace i…
ShaneIsrael Apr 6, 2026
febd56d
dont include empty folders when filtering by folder
ShaneIsrael Apr 6, 2026
cb74c62
remove bloat from docker image to help reduce resulting size
ShaneIsrael Apr 6, 2026
0259295
bump version to 1.5.5
ShaneIsrael Apr 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified .github/images/card-view.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified .github/images/edit-details.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified .github/images/folders.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added .github/images/pre-v1.5.5/card-view.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added .github/images/pre-v1.5.5/edit-details.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added .github/images/pre-v1.5.5/folders.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
File renamed without changes
Binary file added .github/images/uploading.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
23 changes: 19 additions & 4 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
libx265-dev \
libvpx-dev \
libaom-dev \
libdav1d-dev \
libopus-dev \
libvorbis-dev \
libass-dev \
Expand Down Expand Up @@ -63,6 +64,7 @@ RUN cd ffmpeg-6.1 && \
--enable-libx265 \
--enable-libvpx \
--enable-libaom \
--enable-libdav1d \
--enable-libopus \
--enable-libvorbis \
--enable-libmp3lame \
Expand Down Expand Up @@ -92,6 +94,9 @@ COPY --from=ffmpeg-builder /usr/local/bin/ffprobe /usr/local/bin/ffprobe
COPY --from=ffmpeg-builder /usr/local/lib/lib* /usr/local/lib/

# Install runtime dependencies
# Split into two stages within one RUN to avoid committing build-time layers:
# 1) Add deadsnakes PPA and install build-time deps alongside runtime deps
# 2) Install Python packages, then purge everything build-only
RUN DEBIAN_FRONTEND=noninteractive apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y \
software-properties-common \
Expand All @@ -104,16 +109,17 @@ RUN DEBIAN_FRONTEND=noninteractive apt-get update && \
libffi-dev libc-dev \
build-essential \
gosu \
wget curl ca-certificates \
ca-certificates \
tzdata \
libx264-163 libx265-199 libvpx7 libaom3 \
libx264-163 libx265-199 libvpx7 libaom3 libdav1d5 \
libopus0 libvorbis0a libvorbisenc2 \
libass9 libfreetype6 libmp3lame0 \
libldap-2.5-0 libsasl2-2 \
&& python3.14 -m ensurepip --upgrade \
&& python3.14 -m pip install --upgrade --break-system-packages pip \
&& ln -sf /usr/bin/python3.14 /usr/bin/python3 \
&& ln -sf /usr/bin/python3.14 /usr/bin/python \
&& rm -rf /var/lib/apt/lists/*
&& rm -rf /var/lib/apt/lists/* /root/.cache/pip /tmp/*

# Create symlinks and configure library path
RUN ln -sf /usr/local/bin/ffmpeg /usr/bin/ffmpeg && \
Expand All @@ -137,7 +143,15 @@ COPY app/server/ /app/server
COPY migrations/ /migrations
COPY --from=client /app/build /app/build
COPY --from=client /app/package.json /app
RUN python3.14 -m pip install --no-cache-dir --break-system-packages --ignore-installed /app/server
RUN python3.14 -m pip install --no-cache-dir --break-system-packages --ignore-installed /app/server \
&& apt-get purge -y --auto-remove \
python3.14-dev \
libldap2-dev libsasl2-dev libssl-dev \
libffi-dev libc-dev \
build-essential \
software-properties-common \
&& apt-get autoremove -y \
&& rm -rf /var/lib/apt/lists/* /root/.cache/pip /tmp/*

ENV FLASK_APP /app/server/fireshare:create_app()
ENV ENVIRONMENT production
Expand All @@ -146,6 +160,7 @@ ENV VIDEO_DIRECTORY /videos
ENV PROCESSED_DIRECTORY /processed
ENV TEMPLATE_PATH=/app/server/fireshare/templates
ENV ADMIN_PASSWORD admin
ENV ANALYTICS_TRACKING_SCRIPT ""
ENV TZ=UTC
ENV LD_LIBRARY_PATH /usr/local/nvidia/lib:/usr/local/nvidia/lib64:/usr/local/lib:/usr/local/cuda/lib64:$LD_LIBRARY_PATH
ENV PATH /usr/local/bin:$PATH
Expand Down
44 changes: 9 additions & 35 deletions LDAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,38 +2,12 @@

Fireshare has LDAP support. The following environment variables are required to configure it:

### `LDAP_ENABLE`

Whether to enable LDAP support.
Default: `false`

### `LDAP_URL`

LDAP Server connection URL.
Example: `ldap://localhost:3890`

### `LDAP_BINDDN`

DN for the admin user.
Example: `uid=admin,ou=people`

### `LDAP_PASSWORD`

Password for the admin user.

### `LDAP_BASEDN`

Base DN
Example: `dc=example,dc=com`

### `LDAP_USER_FILTER`

User filter for LDAP login
`{input}` replaced by username the user put in the webui
Example for match email and uid: `(&(|(uid={input})(mail={input}))(objectClass=person))`

### `LDAP_ADMIN_GROUP`

LDAP group to be admin in fireshare. If not provided, everyone is admin.
Uses `memberOf`
Example: `lldap_admin`
| Environment Variable | Description | Example | Default |
|----------------------|-------------|---------|----------|
| `LDAP_ENABLE` | Whether to enable LDAP support. || false |
| `LDAP_URL` | LDAP Server connection URL |`ldap://localhost:3890`| |
| `LDAP_BINDDN` | DN for the admin user |`uid=admin,ou=people` | |
| `LDAP_PASSWORD` | Password for the admin user. | |
| `LDAP_BASEDN` | Base DN |`dc=example,dc=com` | |
| `LDAP_USER_FILTER` | User filter for LDAP login. `{input}` is replaced by the UI username. | |
| `LDAP_ADMIN_GROUP` | LDAP group for admin privileges via `memberOf`. If empty, everyone is admin. | |
78 changes: 78 additions & 0 deletions Notifications.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
## Notifications

Fireshare supports notifications when a new video is uploaded, with two integration options: **Discord** and a **Generic Webhook**.

---

### Discord

Since gaming and Discord go hand-in-hand, Fireshare includes a dedicated Discord integration. When a new video is uploaded, it will automatically send a notification to the Discord channel of your choice.

**Setup:** Add the webhook URL for the Discord channel you want notifications sent to.

> Don't have a webhook URL yet? Learn how to create one here: [Discord — Intro to Webhooks](https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks)

**Docker ENV example:**
```
DISCORD_WEBHOOK_URL='https://discord.com/api/webhooks/123456789/abcdefghijklmnopqrstuvwxyz'
```

---

### Generic Webhook

For any notification service that supports HTTP POST requests with a JSON payload, you can use the Generic Webhook integration. This allows Fireshare to send notifications to virtually any platform that supports webhooks.

**Setup:** You will need to provide two things:
1. The **POST URL** for your service's webhook endpoint
2. A **JSON payload** formatted for your specific service

Enter valid JSON into the "Generic Webhook JSON Payload" field on the Integrations page. Consult your service's webhook documentation to find the correct payload format.

**Example payload:**
```json
{
"Title": "Fireshare",
"message": "New Video Uploaded to Fireshare"
}
```

#### Including a Link to the Video

You can include a direct link to the newly uploaded video in your notification by using the `[video_url]` placeholder anywhere in your JSON payload.

**Example payload with video link:**
```json
{
"Title": "Fireshare",
"message": "New Video Uploaded to Fireshare [video_url]"
}
```

**What Fireshare will send to your service:**
```json
{
"Title": "Fireshare",
"message": "New Video Uploaded to Fireshare https://yourdomain.com/w/c415d34530d15b2892fa4a4e037b6c05"
}
```

#### A Note on Quote Syntax

JSON payloads use key/value pairs where strings are wrapped in quotes. Keep the following in mind:

- **GUI:** If you are pasting the payload through the Fireshare UI, just choose either single `'` or double `"` quotes for your strings — Fireshare will handle the rest.
- **Docker ENV:** You must use one type of quote to wrap the entire value, and the other type for the internal JSON strings.

**Docker ENV example:**
```
GENERIC_WEBHOOK_PAYLOAD='{"Title": "Fireshare", "message": "New Video Uploaded to Fireshare [video_url]"}'
# Note: this must be a single line
```

**Full Docker ENV example:**
```
GENERIC_WEBHOOK_URL='https://webhook.com/at/endpoint12345'
GENERIC_WEBHOOK_PAYLOAD='{"Title": "Fireshare", "message": "New Video Uploaded to Fireshare [video_url]"}'
# Both ENV variables must be set for the Generic Webhook to work
```
69 changes: 53 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,15 @@
<img alt="GitHub stars" src="https://img.shields.io/github/stars/shaneisrael/fireshare">
</a>
<br />
<br />
<a href="https://v.fireshare.net">Live Demo</a>
·
<a href="https://github.com/ShaneIsrael/fireshare/issues">Report a Bug</a>
·
<a href="https://www.paypal.com/paypalme/shaneisrael">Buy us a Coffee!</a>
<p align="center">
<a href="https://www.buymeacoffee.com/shaneisrael"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" height="41" width="174" /></a>
</p>
<p align="center">
<a href="https://v.fireshare.net">Live Demo</a>
·
<a href="https://github.com/ShaneIsrael/fireshare/issues">Report a Bug</a>
</p>
</p>
</p>

## Key Features

Expand All @@ -44,35 +45,43 @@
- Video Cropping
- Video Tags for improved search and categorization
- Open Graph metadata for rich link previews
- [Notifications to Discord and others](./Notifications.md)
- RSS feed for new public videos
- LDAP support
- Optional video transcoding with CPU or NVIDIA GPU
- [LDAP support](./LDAP.md)
- Optional [video transcoding with CPU or GPU](#transcoding-optional)

# Navigation

- [Installation](#installation)
- [Configuration](#configuration)
- [Demo](#demo)
- [Contributing](#contributing)

<h3 align="center">Dashboard</h3>
<h4 align="center">Dashboard</h4>

---

![card-view][card-view]

<h3 align="center">Automatic Game Organization</h3>
<h4 align="center">Automatic Game Organization</h3h4>

---

![folders][folders]

![folders-game][folders-game]

<h3 align="center">Video Details</h3>
<h4 align="center">Video Details</h4>

---

![edit][edit]

<h3 align="center">Open Graph Support</h3>
<h4 align="center">Public / Private Uploading</h4>

---

<center><img src=".github/images/ogg-data.png" alt="Open graph preview" /></center>
![uploading][uploading]

## Installation

Expand Down Expand Up @@ -100,8 +109,8 @@ Then open `http://localhost:8080`.

```sh
docker run --name fireshare \
-v $(pwd)/fireshare:/data:rw \
-v $(pwd)/fireshare_processed:/processed:rw \
-v $(pwd)/fireshare/data:/data:rw \
-v $(pwd)/fireshare/processed:/processed:rw \
-v /path/to/my_game_clips:/videos:rw \
-p 8080:80 \
-e ADMIN_PASSWORD=your-admin-password \
Expand All @@ -112,6 +121,12 @@ Open `http://localhost:8080`.

## Configuration

- [LDAP](#ldap)
- [Transcoding](#transcoding-optional)
- [Docker ENV Variables](#docker-environment-variables)

### LDAP

- LDAP setup: [LDAP.md](./LDAP.md)

### Transcoding (Optional)
Expand Down Expand Up @@ -157,6 +172,27 @@ When GPU mode is enabled, Fireshare selects the best available encoder:
- H.264 with CPU — Most compatible, faster encoding
- AV1 with CPU — Best compression, slower

### Docker Environment Variables

| Environment Variable | Description | Default | Required |
| -------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------- | -------- |
| **App Configuration** | | |
| `DOMAIN` | The base URL or domain name where the instance is hosted. This is needed for things like link sharing, and notifications to work properly | |
| `STEAMGRIDDB_API_KEY` | API key for SteamGridDB integration to fetch game metadata and assets. | |
| **Storage** | | |
| `DATA_DIRECTORY` | Absolute path to the directory where application database and metadata are stored. | `$(pwd)/dev_root/dev_data/` | Yes |
| `VIDEO_DIRECTORY` | Absolute path to the source directory containing raw video files. | `$(pwd)/dev_root/dev_videos/` | Yes |
| `PROCESSED_DIRECTORY` | Absolute path to the directory where optimized/transcoded videos are stored. | `$(pwd)/dev_root/dev_processed/` | Yes |
| `THUMBNAIL_VIDEO_LOCATION` | The timestamp (in seconds) used to capture the video thumbnail preview. | `50` |
| **Security** | | |
| `ADMIN_USERNAME` | The username for the initial administrative account. | `admin` | Yes |
| `ADMIN_PASSWORD` | The password for the initial administrative account. | `admin` | Yes |
| LDAP | See [LDAP.md](./LDAP.md) for full LDAP configuration instructions |
| **Integrations** | | |
| `DISCORD_WEBHOOK_URL` | Discord Server/Channel webhook URL used to send a notification of a new fireshare upload. [See Docs](./Notifications.md#discord) | |
| `GENERIC_WEBHOOK_URL` | Notification Integration, to send a generic webhook POST. Has to be used with `GENERIC_WEBHOOK_PAYLOAD` to work. [See Docs](./Notifications.md#generic-webhook) | |
| `GENERIC_WEBHOOK_PAYLOAD` | JSON Based payload that will be POSTed to webhook url. Please [See Docs](./Notifications.md#generic-webhook) for full example and payload options | |

## Local Development

Requirements: Python 3, Node.js, and npm.
Expand Down Expand Up @@ -222,3 +258,4 @@ If you use a different proxy, apply equivalent upload size and timeout settings
[folders]: .github/images/folders.png
[folders-game]: .github/images/folders-game.png
[edit]: .github/images/edit-details.png
[uploading]: .github/images/uploading.png
4 changes: 2 additions & 2 deletions app/client/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion app/client/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "fireshare",
"version": "1.5.4",
"version": "1.5.5",
"private": true,
"dependencies": {
"@emotion/react": "^11.9.0",
Expand Down
13 changes: 12 additions & 1 deletion app/client/src/App.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import Games from './views/Games'
import GameVideos from './views/GameVideos'
import Tags from './views/Tags'
import TagVideos from './views/TagVideos'
import FileManager from './views/FileManager'
import darkTheme from './common/darkTheme'
import { ConfigService } from './services'
import { getSetting, setSetting } from './common/utils'
Expand Down Expand Up @@ -122,13 +123,23 @@ export default function App() {
<Route
path="/w/:id"
element={
<Navbar20 collapsed={true} toolbar page="/w">
<Navbar20 collapsed={true} page="/w">
<AuthWrapper>
<Watch />
</AuthWrapper>
</Navbar20>
}
/>
<Route
path="/files"
element={
<AuthWrapper redirect={'/login'}>
<Navbar20 page="/files" collapsed={!drawerOpen}>
<FileManager />
</Navbar20>
</AuthWrapper>
}
/>
<Route
path="*"
element={
Expand Down
Loading
Loading