mirror of
https://github.com/wimpysworld/stream-sprout
synced 2026-03-14 06:35:50 +01:00
docs: add initial project documentation and templates
This commit is contained in:
parent
53575da58e
commit
2c011f34a6
11 changed files with 380 additions and 2 deletions
3
.github/FUNDING.yml
vendored
Normal file
3
.github/FUNDING.yml
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
# These are supported funding model platforms
|
||||
|
||||
github: [flexiondotorg]
|
||||
44
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
44
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
title: 'bug: description of the bug you encountered'
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**I confirm this bug has not already been reported**
|
||||
- [ ] I have searched the issues and this bug has not been reported previously
|
||||
|
||||
**Describe the bug**
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
**To Reproduce**
|
||||
Steps to reproduce the behavior:
|
||||
1. Run `stream-sprout` with arguments '...'
|
||||
2. See error
|
||||
|
||||
**Expected behavior**
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
**Stream Sprout output**
|
||||
Run `stream-sprout` and include the output of the failure below:
|
||||
|
||||
<details>
|
||||
<summary>Stream Sprout output</summary>
|
||||
|
||||
```text
|
||||
stream-sprout output here
|
||||
```
|
||||
</details>
|
||||
|
||||
**System information**
|
||||
- OS: [e.g. Ubuntu 20.04]
|
||||
- stream-sprout version: [e.g. 0.1.0]
|
||||
- FFmpeg version: [e.g. 4.2.4]
|
||||
|
||||
**Screenshots**
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
||||
23
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
23
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
title: 'feat: describe the feature you are requesting'
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**I confirm this feature has not been previously requested**
|
||||
- [ ] I have searched the issues and this feature has not previously been requested
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
|
||||
**Describe the solution you'd like**
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
**Additional context**
|
||||
Add any other context or screenshots about the feature request here.
|
||||
BIN
.github/apple.png
vendored
Normal file
BIN
.github/apple.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.7 KiB |
BIN
.github/logo.png
vendored
Normal file
BIN
.github/logo.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 441 KiB |
26
.github/pull_request_template.md
vendored
Normal file
26
.github/pull_request_template.md
vendored
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
# Description
|
||||
|
||||
Please include a summary of the changes along with any relevant motivation and context.
|
||||
|
||||
<!-- Close any related issues. Delete if not relevant -->
|
||||
|
||||
- Closes #
|
||||
- Fixes #
|
||||
- Resolves #
|
||||
|
||||
## Type of change
|
||||
|
||||
<!-- Delete any that are not relevant -->
|
||||
|
||||
- [ ] Bug fix (non-breaking change which fixes an issue)
|
||||
- [ ] New feature (non-breaking change which adds functionality)
|
||||
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
|
||||
- [ ] Packaging (updates the packaging)
|
||||
- [ ] Documentation (updates the documentation)
|
||||
|
||||
# Checklist:
|
||||
|
||||
- [ ] I have performed a self-review of my code
|
||||
- [ ] I have tested my code in common scenarios and confirmed there are no regressions
|
||||
- [ ] I have added comments to my code, particularly in hard-to-understand sections
|
||||
- [ ] I have made corresponding changes to the documentation (*remove if no documentation changes were required*)
|
||||
BIN
.github/tux.png
vendored
Normal file
BIN
.github/tux.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 8.1 KiB |
128
CODE_OF_CONDUCT.md
Normal file
128
CODE_OF_CONDUCT.md
Normal file
|
|
@ -0,0 +1,128 @@
|
|||
# Contributor Covenant Code of Conduct
|
||||
|
||||
## Our Pledge
|
||||
|
||||
We as members, contributors, and leaders pledge to make participation in our
|
||||
community a harassment-free experience for everyone, regardless of age, body
|
||||
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
||||
identity and expression, level of experience, education, socio-economic status,
|
||||
nationality, personal appearance, race, religion, or sexual identity
|
||||
and orientation.
|
||||
|
||||
We pledge to act and interact in ways that contribute to an open, welcoming,
|
||||
diverse, inclusive, and healthy community.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to a positive environment for our
|
||||
community include:
|
||||
|
||||
* Demonstrating empathy and kindness toward other people
|
||||
* Being respectful of differing opinions, viewpoints, and experiences
|
||||
* Giving and gracefully accepting constructive feedback
|
||||
* Accepting responsibility and apologizing to those affected by our mistakes,
|
||||
and learning from the experience
|
||||
* Focusing on what is best not just for us as individuals, but for the
|
||||
overall community
|
||||
|
||||
Examples of unacceptable behavior include:
|
||||
|
||||
* The use of sexualized language or imagery, and sexual attention or
|
||||
advances of any kind
|
||||
* Trolling, insulting or derogatory comments, and personal or political attacks
|
||||
* Public or private harassment
|
||||
* Publishing others' private information, such as a physical or email
|
||||
address, without their explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a
|
||||
professional setting
|
||||
|
||||
## Enforcement Responsibilities
|
||||
|
||||
Community leaders are responsible for clarifying and enforcing our standards of
|
||||
acceptable behavior and will take appropriate and fair corrective action in
|
||||
response to any behavior that they deem inappropriate, threatening, offensive,
|
||||
or harmful.
|
||||
|
||||
Community leaders have the right and responsibility to remove, edit, or reject
|
||||
comments, commits, code, wiki edits, issues, and other contributions that are
|
||||
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
||||
decisions when appropriate.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies within all community spaces, and also applies when
|
||||
an individual is officially representing the community in public spaces.
|
||||
Examples of representing our community include using an official e-mail address,
|
||||
posting via an official social media account, or acting as an appointed
|
||||
representative at an online or offline event.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported to the community leaders responsible for enforcement at
|
||||
#broadcasting channel on Discord.
|
||||
All complaints will be reviewed and investigated promptly and fairly.
|
||||
|
||||
All community leaders are obligated to respect the privacy and security of the
|
||||
reporter of any incident.
|
||||
|
||||
## Enforcement Guidelines
|
||||
|
||||
Community leaders will follow these Community Impact Guidelines in determining
|
||||
the consequences for any action they deem in violation of this Code of Conduct:
|
||||
|
||||
### 1. Correction
|
||||
|
||||
**Community Impact**: Use of inappropriate language or other behavior deemed
|
||||
unprofessional or unwelcome in the community.
|
||||
|
||||
**Consequence**: A private, written warning from community leaders, providing
|
||||
clarity around the nature of the violation and an explanation of why the
|
||||
behavior was inappropriate. A public apology may be requested.
|
||||
|
||||
### 2. Warning
|
||||
|
||||
**Community Impact**: A violation through a single incident or series
|
||||
of actions.
|
||||
|
||||
**Consequence**: A warning with consequences for continued behavior. No
|
||||
interaction with the people involved, including unsolicited interaction with
|
||||
those enforcing the Code of Conduct, for a specified period of time. This
|
||||
includes avoiding interactions in community spaces as well as external channels
|
||||
like social media. Violating these terms may lead to a temporary or
|
||||
permanent ban.
|
||||
|
||||
### 3. Temporary Ban
|
||||
|
||||
**Community Impact**: A serious violation of community standards, including
|
||||
sustained inappropriate behavior.
|
||||
|
||||
**Consequence**: A temporary ban from any sort of interaction or public
|
||||
communication with the community for a specified period of time. No public or
|
||||
private interaction with the people involved, including unsolicited interaction
|
||||
with those enforcing the Code of Conduct, is allowed during this period.
|
||||
Violating these terms may lead to a permanent ban.
|
||||
|
||||
### 4. Permanent Ban
|
||||
|
||||
**Community Impact**: Demonstrating a pattern of violation of community
|
||||
standards, including sustained inappropriate behavior, harassment of an
|
||||
individual, or aggression toward or disparagement of classes of individuals.
|
||||
|
||||
**Consequence**: A permanent ban from any sort of public interaction within
|
||||
the community.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||
version 2.0, available at
|
||||
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
|
||||
|
||||
Community Impact Guidelines were inspired by [Mozilla's code of conduct
|
||||
enforcement ladder](https://github.com/mozilla/diversity).
|
||||
|
||||
[homepage]: https://www.contributor-covenant.org
|
||||
|
||||
For answers to common questions about this code of conduct, see the FAQ at
|
||||
https://www.contributor-covenant.org/faq. Translations are available at
|
||||
https://www.contributor-covenant.org/translations.
|
||||
10
CONTRIBUTING.md
Normal file
10
CONTRIBUTING.md
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
# Contributing
|
||||
|
||||
We welcome contributions to Stream Sprout.
|
||||
|
||||
- Help other Quickemu users by answering questions in the [Quickemu Discussions](https://github.com/quickemu-project/quickemu/discussions) 🛟
|
||||
- Improve the documentation in [this README](https://github.com/wimpys-world/stream-sprout/edit/master/README.md) 📖
|
||||
- File bug reports and feature requests in the [Issues](https://github.com/wimpys-world/stream-sprout/issues) 📁
|
||||
- Submit [Pull requests](https://github.com/wimpys-world/stream-sprout/pulls) to fix bugs 🐞 or add new features ✨
|
||||
- Commit messages must [conform to the Conventional Commits specification](https://www.conventionalcommits.org/).
|
||||
- [Sponsor the project](https://github.com/sponsors/flexiondotorg) 💖
|
||||
130
README.md
130
README.md
|
|
@ -1,2 +1,128 @@
|
|||
# stream-sprout
|
||||
Local restreaming
|
||||
<div align="center">
|
||||
<img src=".github/logo.png" alt="Stream Sprout" width="256" />
|
||||
|
||||
# Stream Sprout
|
||||
|
||||
**Restream OBS Studio to multiple destinations with ease**
|
||||
|
||||
**Made with 💝 for <img src=".github/tux.png" align="top" width="24" alt="Tux (Linux)"/> & <img src=".github/apple.png" align="top" width="24" alt="Apple (macOS)"/>**
|
||||
</div>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://wimpysworld.io/discord" target="_blank"><img alt="Discord" src="https://img.shields.io/discord/712850672223125565?style=for-the-badge&logo=discord&logoColor=%23ffffff&label=Discord&labelColor=%234253e8&color=%23e4e2e2"></a>
|
||||
<a href="https://fosstodon.org/@wimpy" target="_blank"><img alt="Mastodon" src="https://img.shields.io/badge/Mastodon-6468fa?style=for-the-badge&logo=mastodon&logoColor=%23ffffff"></a>
|
||||
<a href="https://twitter.com/m_wimpress" target="_blank"><img alt="Twitter" src="https://img.shields.io/badge/Twitter-303030?style=for-the-badge&logo=x&logoColor=%23ffffff"></a>
|
||||
<a href="https://linkedin.com/in/martinwimpress" target="_blank"><img alt="LinkedIn" src="https://img.shields.io/badge/LinkedIn-1667be?style=for-the-badge&logo=linkedin&logoColor=%23ffffff"></a>
|
||||
</p>
|
||||
|
||||
# Introduction
|
||||
|
||||
Stream Sprout uses FFmpeg to re-stream a video source to multiple destinations such as Twitch, YouTube, and Owncast.
|
||||
|
||||
## Get Started
|
||||
|
||||
- [Install](#installation) Stream Sprout
|
||||
- [Configure](#configuration) Stream Sprout
|
||||
- [Configure](#configure-obs-studio) OBS Studio
|
||||
- Start `stream-sprout`
|
||||
- Click the *Start Streaming* button in OBS Studio
|
||||
|
||||
## Installation
|
||||
|
||||
### Debian / Ubuntu
|
||||
|
||||
- tbc
|
||||
|
||||
### NixOS
|
||||
|
||||
- tbc
|
||||
|
||||
### From source
|
||||
|
||||
You need to have [FFmpeg](https://ffmpeg.org/) and [yq](https://github.com/mikefarah/yq) installed on your system.
|
||||
|
||||
```bash
|
||||
git clone https://github.com/wimpysworld/stream-sprout.git
|
||||
cd stream-sprout
|
||||
```
|
||||
|
||||
## Configure Stream Sprout
|
||||
|
||||
Copy the [example Stream Sprout configuration](https://github.com/wimpysworld/stream-sprout/blob/main/stream-sprout.yaml.example) file and edit it to suit your needs.
|
||||
|
||||
`services:` are arbitrarily named. Just create an entry for each RTMP destination you want to stream to.
|
||||
|
||||
```yaml
|
||||
services:
|
||||
my-rtmp-destination:
|
||||
enabled: true
|
||||
rtmp_server: "rtmp://rtmp.example.com/live/"
|
||||
key: "my_super_secret_stream_key"
|
||||
```
|
||||
|
||||
### Trovo
|
||||
|
||||
Here's are example configurations for Trovo.
|
||||
|
||||
```yaml
|
||||
services:
|
||||
trovo:
|
||||
enabled: false
|
||||
rtmp_server: "rtmp://livepush.trovo.live/live/"
|
||||
key: "<your_stream_key>"
|
||||
```
|
||||
|
||||
### Twitch
|
||||
|
||||
Here's are example configurations for Twitch.
|
||||
|
||||
```yaml
|
||||
services:
|
||||
twitch:
|
||||
enabled: true
|
||||
rtmp_server: "rtmp://live.twitch.tv/app/"
|
||||
key: "<your_stream_key>"
|
||||
```
|
||||
|
||||
#### Ingest servers
|
||||
|
||||
The example configuration uses the primary Twitch ingest server, which is `rtmp://live.twitch.tv/app/`. If you want to optimise your stream quality, you can use a server closer to your location. A short list of recommended servers based on your location is available from [Recommended Ingest Endpoints For You](https://help.twitch.tv/s/twitch-ingest-recommendation).
|
||||
|
||||
You can find a complete list of Twitch ingest servers from <https://twitchstatus.com/>.
|
||||
|
||||
#### Testing
|
||||
|
||||
If you want to test streaming to Twitch without going live, you can use the `?bandwidthtest=true` query parameter.
|
||||
|
||||
Add `?bandwidthtest=true` to the end of your Twitch stream key, this will enable bandwidth testing, which you can monitor at <https://inspector.twitch.tv/>, and the stream will not go live on your channel.
|
||||
|
||||
### YouTube
|
||||
|
||||
Here's are example configurations for YouTube.
|
||||
|
||||
```yaml
|
||||
services:
|
||||
youtube:
|
||||
enabled: true
|
||||
rtmp_server: "rtmp://a.rtmp.youtube.com/live2/"
|
||||
key: "<your_stream_key>"
|
||||
```
|
||||
|
||||
## Configure OBS Studio
|
||||
|
||||
- Open OBS Studio
|
||||
- Go to `Settings` > `Stream`
|
||||
- Select `Custom` from the `Service` dropdown
|
||||
- Copy the server `url:` from your Stream Sprout configuration to the `Server` field:
|
||||
- `rtmp://127.0.0.1:1935`
|
||||
|
||||
## References
|
||||
|
||||
These are some of the references used to create this project:
|
||||
|
||||
- https://trac.ffmpeg.org/wiki/EncodingForStreamingSites
|
||||
- https://ffmpeg.org/ffmpeg-protocols.html#rtmp
|
||||
- https://ffmpeg.org/ffmpeg-formats.html#flv
|
||||
- https://ffmpeg.org/ffmpeg-formats.html#tee-1
|
||||
- https://obsproject.com/forum/resources/obs-studio-stream-to-multiple-platforms-or-channels-at-once.932/
|
||||
- https://stackoverflow.com/questions/16658873/how-to-minimize-the-delay-in-a-live-streaming-with-ffmpeg
|
||||
|
|
|
|||
18
SECURITY.md
Normal file
18
SECURITY.md
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
# Security Policy
|
||||
|
||||
## Supported Versions
|
||||
|
||||
Here are the versions of Stream Sprout currently being supported with security updates.
|
||||
|
||||
| Version | Supported |
|
||||
| ------- | ------------------ |
|
||||
| 0.1.x | :white_check_mark: |
|
||||
| < 0.0 | :x: |
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
If you discover a vulnerability then [file an issue](https://github.com/wimpys-world/stream-sprout/issues/new) and click *Report a vulnerability*.
|
||||
|
||||
- Stream Sprout is a spare-time hobby project.
|
||||
- We do not have SLAs for responding to security issues.
|
||||
- It is a best-efforts basis.
|
||||
Loading…
Add table
Add a link
Reference in a new issue