mirror of
https://github.com/wimpysworld/stream-sprout
synced 2026-03-14 14:45: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
|
<div align="center">
|
||||||
Local restreaming
|
<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