├── .gitattributes ├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── config.yml │ └── issue.yml ├── release-body.md └── workflows │ ├── preview-build.yml │ └── main.yml ├── requirements.txt ├── portable.yml ├── .gitignore ├── .editorconfig ├── install-build-dependencies.sh ├── installer.cfg ├── LICENSE ├── files └── config ├── deploy.sh ├── get-dependencies.sh ├── config.yml ├── README.md ├── installer.nsi └── CHANGELOG.md /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf 2 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: [ bastimeyer ] 2 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | distlib ==0.3.6 2 | freezegun 3 | pynsist ==2.8 4 | pyyaml >=6.0.0 5 | wheel 6 | yq >=3.0.0 7 | -------------------------------------------------------------------------------- /portable.yml: -------------------------------------------------------------------------------- 1 | commands: 2 | streamlink: 3 | console: true 4 | entry_point: streamlink_cli.main:main 5 | streamlinkw: 6 | console: false 7 | entry_point: streamlink_cli.main:main 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # OS and editors 2 | .DS_Store 3 | ._* 4 | Thumbs.db 5 | Desktop.ini 6 | *.bak 7 | .cache 8 | .project 9 | .settings 10 | .tmproj 11 | nbproject 12 | *.sublime-project 13 | *.sublime-workspace 14 | .idea 15 | 16 | cache 17 | dist 18 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: "Main Streamlink repository" 4 | about: "Please go here for any issues or questions related to Streamlink itself." 5 | url: https://github.com/streamlink/streamlink 6 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | indent_size = 2 7 | indent_style = space 8 | insert_final_newline = true 9 | max_line_length = 128 10 | trim_trailing_whitespace = true 11 | 12 | [*.py] 13 | indent_size = 4 14 | 15 | [*.md] 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /install-build-dependencies.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -e 3 | 4 | [[ "${CI}" ]] || exit 1 5 | 6 | sudo apt-get update 7 | sudo apt-get install -y --no-install-recommends \ 8 | nsis \ 9 | imagemagick \ 10 | inkscape 11 | 12 | python -m pip install -U pip 13 | python -m pip install -U --upgrade-strategy=eager -r requirements.txt 14 | -------------------------------------------------------------------------------- /installer.cfg: -------------------------------------------------------------------------------- 1 | [Application] 2 | name=Streamlink 3 | version=${VERSION} 4 | entry_point=streamlink_cli.main:main 5 | icon=${DIR_BUILD}/icon.ico 6 | license_file=${DIR_BUILD}/LICENSE.txt 7 | 8 | [Python] 9 | version=${PYTHONVERSION} 10 | bitness=64 11 | include_msvcrt=false 12 | 13 | [Include] 14 | packages=streamlink 15 | streamlink_cli 16 | files=${DIR_DISTINFO} > $INSTDIR/pkgs/ 17 | local_wheels=${DIR_WHEELS}/*.whl 18 | 19 | [Command streamlink] 20 | entry_point=streamlink_cli.main:main 21 | 22 | [Command streamlinkw] 23 | entry_point=streamlink_cli.main:main 24 | console=false 25 | 26 | [Build] 27 | directory=${DIR_BUILD}/nsis 28 | installer_name=${INSTALLER_NAME} 29 | nsi_template=${NSI_TEMPLATE} 30 | -------------------------------------------------------------------------------- /.github/release-body.md: -------------------------------------------------------------------------------- 1 | ## 📝 Changelog 2 | 3 | [See the full Streamlink ${TAG} release changelog here.](https://github.com/streamlink/streamlink/releases/tag/${TAG}) 4 | 5 | ${CHANGELOG} 6 | 7 | ## ⚙️ Instructions 8 | 9 | See the [README.md](https://github.com/streamlink/windows-builds#notes) for all the details about the installers and portable archives. 10 | 11 | Further information can be found in Streamlink's [install docs](https://streamlink.github.io/install.html) and [Command-Line Interface usage guide](https://streamlink.github.io/cli.html). 12 | 13 | ## ❤️ Support 14 | 15 | If you think that Streamlink is useful and if you want to keep the project alive, then please consider supporting its maintainers by sending a small and optionally recurring tip via the [available options](https://streamlink.github.io/support.html). 16 | Your support is very much appreciated, thank you! 17 | -------------------------------------------------------------------------------- /.github/workflows/preview-build.yml: -------------------------------------------------------------------------------- 1 | name: Preview build 2 | run-name: "Preview build - ${{ inputs.ref }}" 3 | 4 | on: 5 | workflow_dispatch: 6 | inputs: 7 | ref: 8 | description: A git ref on the Streamlink git repo 9 | default: master 10 | required: true 11 | type: string 12 | 13 | jobs: 14 | build: 15 | name: "${{ inputs.ref }} (${{ matrix.build }})" 16 | runs-on: ubuntu-latest 17 | strategy: 18 | fail-fast: false 19 | matrix: 20 | include: 21 | - build: installer 22 | - build: portable 23 | steps: 24 | - uses: actions/checkout@v4 25 | with: 26 | fetch-depth: 0 27 | - uses: actions/setup-python@v5 28 | with: 29 | python-version: "3.13" 30 | - name: Install dependencies 31 | run: | 32 | ./install-build-dependencies.sh 33 | - name: Build 34 | run: | 35 | "./build-${{ matrix.build }}.sh" "" "" "${{ inputs.ref }}" 36 | - name: Get file name 37 | id: vars 38 | run: | 39 | echo "file_name=$(cd dist && ls *.*)" >> $GITHUB_OUTPUT 40 | - uses: actions/upload-artifact@v4 41 | with: 42 | name: ${{ steps.vars.outputs.file_name }} 43 | path: dist/* 44 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2022-2025, Sebastian Meyer 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are met: 6 | 7 | 1. Redistributions of source code must retain the above copyright notice, this 8 | list of conditions and the following disclaimer. 9 | 2. Redistributions in binary form must reproduce the above copyright notice, 10 | this list of conditions and the following disclaimer in the documentation 11 | and/or other materials provided with the distribution. 12 | 13 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 14 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 15 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 16 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 17 | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 18 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 19 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 20 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 21 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 22 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Build and deploy 2 | 3 | on: 4 | push: {} 5 | pull_request: {} 6 | 7 | jobs: 8 | build: 9 | runs-on: ubuntu-latest 10 | strategy: 11 | fail-fast: false 12 | matrix: 13 | include: 14 | - build: installer 15 | - build: portable 16 | steps: 17 | - uses: actions/checkout@v4 18 | with: 19 | fetch-depth: 0 20 | - uses: actions/setup-python@v5 21 | with: 22 | python-version: "3.13" 23 | - name: Install dependencies 24 | run: | 25 | ./install-build-dependencies.sh 26 | - name: Build 27 | run: | 28 | export SOURCE_DATE_EPOCH=$(git show -s --format=%ct) 29 | "./build-${{ matrix.build }}.sh" 30 | - name: Get file name 31 | id: vars 32 | run: | 33 | echo "file_name=$(cd dist && ls *.*)" >> $GITHUB_OUTPUT 34 | - uses: actions/upload-artifact@v4 35 | if: github.event_name == 'push' 36 | with: 37 | name: ${{ steps.vars.outputs.file_name }} 38 | path: dist/* 39 | 40 | deploy: 41 | if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') 42 | needs: 43 | - build 44 | runs-on: ubuntu-latest 45 | permissions: 46 | contents: write 47 | steps: 48 | - uses: actions/checkout@v4 49 | - run: mkdir dist 50 | - uses: actions/download-artifact@v4 51 | with: 52 | path: ./dist 53 | - run: ./deploy.sh ./dist/**/* 54 | env: 55 | RELEASES_API_KEY: ${{ secrets.GITHUB_TOKEN }} 56 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/issue.yml: -------------------------------------------------------------------------------- 1 | name: Issue 2 | description: An issue with one of Streamlink's Windows builds 3 | body: 4 | - type: markdown 5 | attributes: 6 | value: | 7 | ## Thanks for reporting an issue with Streamlink's Windows builds! 8 | 9 | This issue tracker is only meant for reporting issues about Streamlink's Windows installer or Streamlink's Windows portable builds. 10 | For example, the installer isn't doing what it's supposed to do, or something is missing in the distribution, etc. 11 | 12 | **Issues and questions related to Streamlink itself DO NOT BELONG here and will be closed immediately.** 13 | - type: checkboxes 14 | attributes: 15 | label: Checklist 16 | options: 17 | - label: I understand that this is the issue tracker for Streamlink's Windows builds and not for Streamlink itself 18 | required: true 19 | - label: I am using the latest stable or nightly release 20 | required: true 21 | - type: dropdown 22 | attributes: 23 | label: Build flavor 24 | options: 25 | - Installer - Latest Python - x86_64 (64 bit) 26 | - Installer - Latest Python - x86 (32 bit) 27 | - Installer - Python 3.8 - x86_64 (64 bit) 28 | - Installer - Python 3.8 - x86 (32 bit) 29 | - Portable - Latest Python - x86_64 (64 bit) 30 | - Portable - Latest Python - x86 (32 bit) 31 | - Portable - Python 3.8 - x86_64 (64 bit) 32 | - Portable - Python 3.8 - x86 (32 bit) 33 | validations: 34 | required: true 35 | - type: input 36 | attributes: 37 | label: Build version 38 | description: | 39 | The exact file name of the installer or portable build. 40 | - type: textarea 41 | attributes: 42 | label: Description 43 | description: | 44 | Explain the issue as thoroughly as you can and list the steps which lead to the problem. 45 | Please also provide details about your operating system, its configuration and the environment, if you can. 46 | validations: 47 | required: true 48 | -------------------------------------------------------------------------------- /files/config: -------------------------------------------------------------------------------- 1 | # Streamlink config file 2 | 3 | # Please see the Streamlink CLI documentation for all available options: 4 | # https://streamlink.github.io/cli.html#command-line-usage 5 | 6 | # The format is option=value 7 | # Lines starting with a # are considered comments and are ignored. 8 | 9 | # All leading dashes need to be ignored, 10 | # e.g. --default-stream=STREAM becomes default-stream=STREAM 11 | 12 | # Option values must not be quoted, or quotes become part of the option's actual value. 13 | 14 | # ---- 15 | 16 | # By default, Streamlink will attempt to locate VLC on your system 17 | # and use that, but you can also specify the location of a player yourself. 18 | # Here are a couple of common player paths: 19 | 20 | # VLC 21 | #player=C:\Program Files\VideoLAN\VLC\vlc.exe 22 | #player=C:\Program Files (x86)\VideoLAN\VLC\vlc.exe 23 | 24 | # MPC-HC 25 | #player=C:\Program Files\MPC-HC\mpc-hc64.exe 26 | #player=C:\Program Files (x86)\MPC-HC\mpc-hc.exe 27 | 28 | # MPV 29 | #player=C:\Program Files\mpv-x86_64\mpv.exe 30 | 31 | # Custom player arguments can be set using the player-args option. 32 | # Please see the documentation of the used player for its available arguments. 33 | 34 | # VLC 35 | #player-args=--no-one-instance --play-and-exit 36 | #player-args=--qt-minimal-view 37 | #player-args=--file-caching=5000 38 | 39 | # MPC-HC 40 | #player-args=/new /play /close 41 | 42 | # MPV 43 | #player-args=--keep-open=no --force-window=yes 44 | #player-args=--no-border 45 | #player-args=--cache=yes --demuxer-max-bytes=2M 46 | 47 | 48 | # Custom player window titles can automatically be set when a supported player 49 | # and plugin are used. The title option has several variables available, which 50 | # can show the stream's author, category/game, title, URL, etc. 51 | #title={author} - {category} - {title} 52 | 53 | 54 | # Use this if you want to transport the stream to the player via a named pipe. 55 | #player-fifo 56 | 57 | # Use one of these if you want to transport the stream to the player via HTTP. 58 | # The continuous option will allow the player to stop and resume the output. 59 | #player-http 60 | #player-continuous-http 61 | 62 | # Use player-passthrough if you want Streamlink to only pass the resolved URL 63 | # to your player and let it handle the transport of the stream itself. 64 | # Please note that the player needs to support the streaming protocol 65 | # and that custom stream implementations in plugins will become unavailable, 66 | # same as buffering options and those which change the network behavior. 67 | #player-passthrough=http,hls 68 | 69 | # By default, Streamlink will close the player when the stream is over. 70 | # Use this option to let the player stay or close itself instead. 71 | #player-no-close 72 | 73 | # Show the player's console output 74 | #player-verbose 75 | 76 | # FFMPEG is used to mux separate video and audio streams into a single 77 | # stream, so that they can be played. The full or relative path to ffmpeg 78 | # should be specified here. 79 | #ffmpeg-ffmpeg=C:\Program Files\Streamlink\ffmpeg\ffmpeg.exe 80 | ffmpeg-ffmpeg=ffmpeg.exe 81 | 82 | # Log level, default is info 83 | #loglevel=debug 84 | 85 | # Number of threads to use when streaming HLS streams 86 | #stream-segment-threads=1 87 | -------------------------------------------------------------------------------- /deploy.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -euo pipefail 3 | 4 | [[ -n "${CI:-}" && -n "${GITHUB_REPOSITORY:-}" && "${GITHUB_REF:-}" =~ ^refs/tags/ && -n "${RELEASES_API_KEY:-}" ]] || exit 1 5 | 6 | ROOT=$(git rev-parse --show-toplevel 2>/dev/null || dirname "$(readlink -f "${0}")") 7 | FILES=("${@}") 8 | 9 | declare -A DEPS=( 10 | [curl]=curl 11 | [jq]=jq 12 | ) 13 | 14 | # ---- 15 | 16 | SELF=$(basename "$(readlink -f "${0}")") 17 | log() { 18 | echo "[${SELF}]" "${@}" 19 | } 20 | err() { 21 | log >&2 "${@}" 22 | exit 1 23 | } 24 | 25 | for dep in "${!DEPS[@]}"; do 26 | command -v "${dep}" >/dev/null 2>&1 || err "Missing dependency: ${DEPS["${dep}"]}" 27 | done 28 | 29 | [[ $# == 0 ]] && err "Missing file(s)" 30 | 31 | # ---- 32 | 33 | TAG="${GITHUB_REF/#refs\/tags\//}" 34 | CURL_OPTIONS=( 35 | -H "Accept: application/vnd.github.v3+json" 36 | -H "User-Agent: ${GITHUB_REPOSITORY}" 37 | -H "Authorization: token ${RELEASES_API_KEY}" 38 | ) 39 | GH_API="https://api.github.com/repos/${GITHUB_REPOSITORY}" 40 | GH_UPLOAD="https://uploads.github.com/repos/${GITHUB_REPOSITORY}" 41 | CHANGELOG="${ROOT}/CHANGELOG.md" 42 | BODY="${ROOT}/.github/release-body.md" 43 | 44 | 45 | get_release_id() { 46 | curl -fsSL \ 47 | -X GET \ 48 | "${CURL_OPTIONS[@]}" \ 49 | "${GH_API}/releases/tags/${TAG}" \ 50 | | jq -re ".id" 51 | } 52 | 53 | create_release() { 54 | local data body changelog 55 | changelog="$(awk '/^##/{show=0}$1 && show;/^## '"${TAG//./\\.}"' /{show=1}' "${CHANGELOG}")" 56 | # shellcheck disable=SC2016 57 | body="$(env -i \ 58 | TAG="${TAG%-*}" \ 59 | CHANGELOG="${changelog}" \ 60 | envsubst '$TAG $CHANGELOG' \ 61 | < "${BODY}" 62 | )" 63 | data="$(jq -cnR \ 64 | --arg tag_name "${TAG}" \ 65 | --arg name "${GITHUB_REPOSITORY} ${TAG}" \ 66 | --arg body "${body}" \ 67 | '{ 68 | "tag_name": $tag_name, 69 | "name": $name, 70 | "body": $body 71 | }' 72 | )" 73 | curl -fsSL \ 74 | -X POST \ 75 | "${CURL_OPTIONS[@]}" \ 76 | -d "${data}" \ 77 | "${GH_API}/releases" \ 78 | | jq -re ".id" 79 | } 80 | 81 | upload_assets() { 82 | local release_id="${1}" 83 | for path in "${FILES[@]}"; do 84 | local file 85 | file="$(basename "${path}")" 86 | log "Uploading ${file}" 87 | sha256sum "${path}" 88 | curl -fsSL \ 89 | -X POST \ 90 | "${CURL_OPTIONS[@]}" \ 91 | -H "Content-Type: application/octet-stream" \ 92 | --data-binary "@${path}" \ 93 | --url-query "name=${file}" \ 94 | "${GH_UPLOAD}/releases/${release_id}/assets" \ 95 | >/dev/null 96 | done 97 | } 98 | 99 | deploy() { 100 | log "Getting release ID for tag ${TAG}" 101 | local release_id 102 | release_id="$(get_release_id 2>/dev/null || true)" 103 | 104 | if [[ -z "${release_id}" ]]; then 105 | log "Creating new release for tag ${TAG}" 106 | release_id="$(create_release)" 107 | fi 108 | 109 | if [[ -z "${release_id}" ]]; then 110 | err "Missing release ID" 111 | fi 112 | 113 | log "Uploading assets to release ${release_id}" 114 | upload_assets "${release_id}" 115 | 116 | log "Done" 117 | } 118 | 119 | deploy 120 | -------------------------------------------------------------------------------- /get-dependencies.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -euo pipefail 3 | 4 | BUILDNAME="${1:-}" 5 | GITREPO="${2:-}" 6 | GITREF="${3:-}" 7 | OPT_DEPSPEC=("${@}") 8 | OPT_DEPSPEC=("${OPT_DEPSPEC[@]:3}") 9 | 10 | declare -A DEPS=( 11 | [jq]=jq 12 | [yq]=yq 13 | [mktemp]=mktemp 14 | ) 15 | 16 | ROOT=$(git rev-parse --show-toplevel 2>/dev/null || dirname "$(readlink -f "${0}")") 17 | CONFIG="${ROOT}/config.yml" 18 | 19 | 20 | # ---- 21 | 22 | 23 | SELF=$(basename "$(readlink -f "${0}")") 24 | log() { 25 | echo "[${SELF}]" "${@}" 26 | } 27 | err() { 28 | log >&2 "${@}" 29 | exit 1 30 | } 31 | 32 | 33 | for dep in "${!DEPS[@]}"; do 34 | command -v "${dep}" >/dev/null 2>&1 || err "Missing dependency: ${DEPS["${dep}"]}" 35 | done 36 | 37 | CONFIGJSON=$(cat "${CONFIG}") 38 | 39 | if [[ -n "${BUILDNAME}" ]]; then 40 | yq -e ".builds[\"${BUILDNAME}\"]" >/dev/null 2>&1 <<< "${CONFIGJSON}" \ 41 | || err "Invalid build name" 42 | else 43 | BUILDNAME=$(yq -r '.builds | keys | first' <<< "${CONFIGJSON}") 44 | fi 45 | 46 | read -r gitrepo gitref \ 47 | < <(yq -r '.git | "\(.repo) \(.ref)"' <<< "${CONFIGJSON}") 48 | read -r implementation pythonversion platform \ 49 | < <(yq -r ".builds[\"${BUILDNAME}\"] | \"\(.implementation) \(.pythonversion) \(.platform)\"" <<< "${CONFIGJSON}") 50 | 51 | gitrepo="${GITREPO:-${gitrepo}}" 52 | gitref="${GITREF:-${gitref}}" 53 | 54 | dependency_override=($(yq -r ".builds[\"${BUILDNAME}\"].dependency_override[]" <<< "${CONFIGJSON}")) 55 | 56 | 57 | # ---- 58 | 59 | 60 | # shellcheck disable=SC2064 61 | TEMP=$(mktemp -d) && trap "rm -rf '${TEMP}'" EXIT || exit 255 62 | 63 | DIR_REPO="${TEMP}/source.git" 64 | 65 | 66 | get_sources() { 67 | log "Getting sources" 68 | git \ 69 | -c advice.detachedHead=false \ 70 | clone \ 71 | "${gitrepo}" \ 72 | "${DIR_REPO}" 73 | 74 | log "Commit information" 75 | git \ 76 | -c core.pager=cat \ 77 | -C "${DIR_REPO}" \ 78 | log \ 79 | -1 \ 80 | --pretty=full \ 81 | "${gitref}" 82 | } 83 | 84 | get_deps() { 85 | pushd "${TEMP}" 86 | 87 | log "Downloading wheels" 88 | python -m pip install \ 89 | --disable-pip-version-check \ 90 | --root-user-action=ignore \ 91 | --isolated \ 92 | --no-cache-dir \ 93 | --check-build-dependencies \ 94 | --ignore-installed \ 95 | --only-binary=:all: \ 96 | --implementation="${implementation}" \ 97 | --python-version="${pythonversion}" \ 98 | --platform="${platform}" \ 99 | --target=. \ 100 | --dry-run \ 101 | --report=report.json \ 102 | "git+file://${DIR_REPO}@${gitref}" \ 103 | "${dependency_override[@]}" \ 104 | "${OPT_DEPSPEC[@]}" 105 | 106 | log "Generating lockfile for build ${BUILDNAME}" 107 | yq -y -C \ 108 | ' 109 | [ 110 | .install[] 111 | | select(.is_direct != true) 112 | | .download_info.archive_info.hash |= sub("^(?[^=]+)="; "\(.hash):") 113 | | { 114 | key: .metadata.name, 115 | value: "\(.metadata.version) --hash=\(.download_info.archive_info.hash)" 116 | } 117 | ] 118 | | sort_by(.key | ascii_upcase) 119 | | from_entries 120 | | {"dependencies": .} 121 | ' \ 122 | report.json 123 | } 124 | 125 | 126 | build() { 127 | get_sources 128 | get_deps 129 | } 130 | 131 | build 132 | -------------------------------------------------------------------------------- /config.yml: -------------------------------------------------------------------------------- 1 | app: 2 | name: streamlink 3 | rel: 2 4 | git: 5 | repo: https://github.com/streamlink/streamlink.git 6 | ref: 8.1.0 7 | assets: 8 | ffmpeg-x86_64: 9 | filename: ffmpeg-n8.0-win64-gpl-8.0.zip 10 | url: https://github.com/streamlink/FFmpeg-Builds/releases/download/20250822-1/ffmpeg-n8.0-win64-gpl-8.0.zip 11 | sha256: 9fd3f1af180b45faabdfef95b1843890e868b6f1c883147f358efcc4b5da6d68 12 | type: zip 13 | sourcedir: ffmpeg-n8.0-win64-gpl-8.0 14 | targetdir: ffmpeg 15 | files: 16 | - from: bin/ffmpeg.exe 17 | to: ffmpeg.exe 18 | - from: LICENSE.txt 19 | to: LICENSE.txt 20 | - from: BUILDINFO.txt 21 | to: BUILDINFO.txt 22 | builds: 23 | py314-x86_64: 24 | implementation: cp 25 | pythonversion: "3.14" 26 | platform: win_amd64 27 | pythonembed: 28 | version: 3.14.2 29 | filename: python-v3.14.2-0-gdf793163-windows-x64-embed.zip 30 | url: https://github.com/streamlink/python-windows-embed/releases/download/20251205-1/python-v3.14.2-0-gdf793163-windows-x64-embed.zip 31 | sha256: a22271cf57231dcf45aa2ad143cb38a685369334ff8ac5f0da54c13244b19605 32 | assets: 33 | - ffmpeg-x86_64 34 | # pip currently ignores package filtering flags (`os_name=="nt"`) when environment markers are set (`--platform=...`) 35 | # https://github.com/pypa/pip/issues/11664 36 | dependency_override: 37 | # https://github.com/python-trio/trio/blob/v0.32.0/pyproject.toml#L51 38 | - cffi>=1.14 39 | # https://github.com/urllib3/urllib3/blob/2.6.0/pyproject.toml#L46 40 | - brotli>=1.2.0 # optional urllib3 dependency 41 | dependencies: 42 | attrs: 25.4.0 --hash=sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373 43 | brotli: 1.2.0 --hash=sha256:e7c0af964e0b4e3412a0ebf341ea26ec767fa0b4cf81abb5e897c9338b5ad6a3 44 | certifi: 2025.11.12 --hash=sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b 45 | cffi: 2.0.0 --hash=sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25 46 | charset-normalizer: 3.4.4 --hash=sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c 47 | h11: 0.16.0 --hash=sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86 48 | idna: 3.11 --hash=sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea 49 | isodate: 0.7.2 --hash=sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15 50 | lxml: 6.0.2 --hash=sha256:fa25afbadead523f7001caf0c2382afd272c315a033a7b06336da2637d92d6ed 51 | outcome: 1.3.0.post0 --hash=sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b 52 | pycountry: 24.6.1 --hash=sha256:f1a4fb391cd7214f8eefd39556d740adcc233c778a27f8942c8dca351d6ce06f 53 | pycparser: 2.23 --hash=sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934 54 | pycryptodome: 3.23.0 --hash=sha256:c75b52aacc6c0c260f204cbdd834f76edc9fb0d8e0da9fbf8352ef58202564e2 55 | PySocks: 1.7.1 --hash=sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5 56 | requests: 2.32.5 --hash=sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6 57 | sniffio: 1.3.1 --hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 58 | sortedcontainers: 2.4.0 --hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 59 | trio: 0.32.0 --hash=sha256:4ab65984ef8370b79a76659ec87aa3a30c5c7c83ff250b4de88c29a8ab6123c5 60 | trio-websocket: 0.12.2 --hash=sha256:df605665f1db533f4a386c94525870851096a223adcb97f72a07e8b4beba45b6 61 | urllib3: 2.6.2 --hash=sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd 62 | websocket-client: 1.9.0 --hash=sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef 63 | wsproto: 1.3.2 --hash=sha256:61eea322cdf56e8cc904bd3ad7573359a242ba65688716b0710a5eb12beab584 64 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | streamlink/windows-builds 2 | ==== 3 | 4 | Windows installer and portable archive builds for [Streamlink](https://github.com/streamlink/streamlink). 5 | 6 | Please see [Streamlink's install documentation](https://streamlink.github.io/install.html) for more details and different install methods. 7 | 8 | The windows-builds changelog can be found [here](https://github.com/streamlink/windows-builds/blob/master/CHANGELOG.md). 9 | 10 | 11 | ## Contents 12 | 13 | - [an embedded Python environment](https://github.com/streamlink/python-windows-embed) 14 | - [Streamlink and its dependencies](https://github.com/streamlink/streamlink) 15 | - [FFmpeg, for muxing streams](https://github.com/streamlink/FFmpeg-Builds) 16 | 17 | 18 | ## Download 19 | 20 | ### Stable releases 21 | 22 | Builds of official Streamlink releases. 23 | Download from the [releases page](https://github.com/streamlink/windows-builds/releases). 24 | 25 | ### Nightly builds 26 | 27 | Built once each day at midnight UTC from Streamlink's master branch. 28 | This includes the most recent changes, but is not considered "stable". 29 | Download from the build-artifacts of the [scheduled nightly build runs](https://github.com/streamlink/windows-builds/actions?query=event%3Aschedule+is%3Asuccess+branch%3Amaster) (requires a GitHub login). 30 | 31 | 32 | ## Notes 33 | 34 | ### Installers 35 | 36 | - When installing, the `bin` subdirectory of the installation path gets added to the system's `PATH` environment variable, so the `streamlink.exe` and `streamlinkw.exe` executables can be resolved without having to specify the absolute or relative path to these files. 37 | - An entry gets added to the system's list of installed software, and an uninstaller gets generated. 38 | - When installing, the `pkgs` subdirectory gets deleted recursively before unpacking any files, to ensure that old and unsupported python package files of previous installations don't exist when upgrading without uninstalling. 39 | - A default config file gets written to `%APPDATA%\streamlink\config` if it doesn't exist. 40 | - The [`ffmpeg-ffmpeg`](https://streamlink.github.io/cli.html#cmdoption-ffmpeg-ffmpeg) argument in the config file always gets updated to the current install-location. 41 | - Python modules not part of the standard library will be byte-compiled after installation. 42 | 43 | ### Portable archives 44 | 45 | - The `bin` directory with the `streamlink.exe` and `streamlinkw.exe` executables won't be added to the `PATH` environment variable. 46 | - Since no config file will be generated either, users will need to create one themselves, including the [`ffmpeg-ffmpeg`](https://streamlink.github.io/cli.html#cmdoption-ffmpeg-ffmpeg) argument. Otherwise, [`--ffmpeg-ffmpeg`](https://streamlink.github.io/cli.html#cmdoption-ffmpeg-ffmpeg) needs to be set on the command line to enable muxed output streams. 47 | - Python modules not part of the standard library will be byte-compiled upon first execution. 48 | 49 | 50 | ## Additional notes 51 | 52 | Both the embedded Python builds and FFmpeg builds are unofficial and unsigned, as we're building them ourselves. Due to this circumstance, certain antivirus programs might trigger false positive alerts. The sources, build instructions and build logs can be read and observed in the repositories linked above. 53 | 54 | 55 | ## Developer notes 56 | 57 | ### Build requirements 58 | 59 | - GNU/Linux environment 60 | - [git](https://git-scm.com/) 61 | - [Python 3.9+](https://www.python.org/) and the most recent version of [pip](https://pip.pypa.io/en/stable/) 62 | - [virtualenv](https://pypi.org/project/virtualenv/) 63 | - [pynsist](https://pypi.org/project/pynsist/) `==2.8` 64 | - [distlib](https://pypi.org/project/distlib/) `==0.3.6` 65 | - [freezegun](https://pypi.org/project/freezegun/) 66 | - [NSIS](https://nsis.sourceforge.io/Main_Page) 67 | - [jq](https://stedolan.github.io/jq/) 68 | - [gawk](https://www.gnu.org/software/gawk/) 69 | - [Imagemagick](https://imagemagick.org/index.php) 70 | - [Inkscape](https://inkscape.org/) 71 | 72 | ### How to 73 | 74 | The build configurations can be found in the `config.yml` file. Here, the default Streamlink source and version are defined that will be used when building, in addition to assets, and most importantly, the various build flavors. 75 | 76 | The `installer.cfg` file defines the pynsist configuration, and the `installer.nsi` file is used as an extension for pynsist's default NSIS template. `portable.yml` on the other hand defines the configuration for the portable builds. 77 | 78 | Each build flavor includes the source of an embedded Python build and the fixed set of Streamlink's dependency versions plus checksums for that specific build (Streamlink doesn't provide its own dependency lockfile). 79 | 80 | In order to get an update for the dependency JSON data of a specific build flavor, run 81 | 82 | ```sh 83 | ./get-dependencies.sh "${FLAVOR}" "${GITSOURCE}" "${GITREF}" "${OPT_DEPS}" 84 | ``` 85 | 86 | with `GITSOURCE`, `GITREF` and `OPT_DEPS` being an optional override. 87 | 88 | Building the installers and portable archives works the same way, by running 89 | 90 | ```sh 91 | ./build-installer.sh "${FLAVOR}" "${GITSOURCE}" "${GITREF}" 92 | ./build-portable.sh "${FLAVOR}" "${GITSOURCE}" "${GITREF}" 93 | ``` 94 | 95 | with `GITSOURCE` and `GITREF` being once again optional overrides. 96 | Building the installer and portable archives requires an activated virtual Python environment. 97 | 98 | Successfully built installers and portable archives can be found in the `./dist` directory. NSIS unfortunately doesn't support reproducible builds, so the checksums of the installers will always vary. The portable archives however are reproducible if the `SOURCE_DATE_EPOCH` env var is set. 99 | -------------------------------------------------------------------------------- /installer.nsi: -------------------------------------------------------------------------------- 1 | !include "FileFunc.nsh" 2 | !include "TextFunc.nsh" 3 | 4 | !macro NSD_SetUserData hwnd data 5 | nsDialogs::SetUserData ${hwnd} ${data} 6 | !macroend 7 | !define NSD_SetUserData `!insertmacro NSD_SetUserData` 8 | 9 | !macro NSD_GetUserData hwnd outvar 10 | nsDialogs::GetUserData ${hwnd} 11 | Pop ${outvar} 12 | !macroend 13 | !define NSD_GetUserData `!insertmacro NSD_GetUserData` 14 | 15 | Var configFileRadioBtn 16 | Var configFileOverwrite 17 | 18 | [% extends "pyapp_msvcrt.nsi" %] 19 | 20 | [% block modernui %] 21 | ; let the user review all changes being made to the system first 22 | !define MUI_FINISHPAGE_NOAUTOCLOSE 23 | !define MUI_UNFINISHPAGE_NOAUTOCLOSE 24 | 25 | ; add checkbox for opening the documentation in the user's default web browser 26 | !define MUI_FINISHPAGE_RUN 27 | !define MUI_FINISHPAGE_RUN_TEXT "Open online manual in web browser" 28 | !define MUI_FINISHPAGE_RUN_FUNCTION "OpenDocs" 29 | !define MUI_FINISHPAGE_RUN_NOTCHECKED 30 | 31 | ; make global installation mode the default choice 32 | ; see MULTIUSER_PAGE_INSTALLMODE macro below 33 | !undef MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER 34 | 35 | Function OpenDocs 36 | ExecShell "" "https://streamlink.github.io/cli.html" 37 | FunctionEnd 38 | 39 | ; add checkbox for editing the configuration file 40 | !define MUI_FINISHPAGE_SHOWREADME 41 | !define MUI_FINISHPAGE_SHOWREADME_TEXT "Edit configuration file" 42 | !define MUI_FINISHPAGE_SHOWREADME_FUNCTION "EditConfig" 43 | !define MUI_FINISHPAGE_SHOWREADME_NOTCHECKED 44 | 45 | Function EditConfig 46 | SetShellVarContext current 47 | Exec '"$WINDIR\notepad.exe" "$APPDATA\streamlink\config"' 48 | SetShellVarContext all 49 | FunctionEnd 50 | 51 | ; constants need to be defined before importing MUI 52 | [[ super() ]] 53 | 54 | ; Add the product version information 55 | VIProductVersion "${VI_VERSION}" 56 | VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductName" "Streamlink" 57 | VIAddVersionKey /LANG=${LANG_ENGLISH} "CompanyName" "Streamlink" 58 | VIAddVersionKey /LANG=${LANG_ENGLISH} "FileDescription" "Streamlink Installer" 59 | VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalCopyright" "" 60 | VIAddVersionKey /LANG=${LANG_ENGLISH} "FileVersion" "${VERSION}" 61 | 62 | Function pageConfigFile 63 | !insertmacro MUI_HEADER_TEXT "Streamlink config file" "Located at: %APPDATA%\streamlink\config" 64 | 65 | nsDialogs::Create 1018 66 | Pop $0 67 | ${If} $0 == error 68 | Abort 69 | ${EndIf} 70 | 71 | ${NSD_CreateRadioButton} 0 0 100% 12u "Keep existing config file, or create a new one if it doesn't exist yet" 72 | Pop $configFileRadioBtn 73 | ${NSD_AddStyle} $configFileRadioBtn ${WS_GROUP} 74 | ${NSD_SetUserData} $configFileRadioBtn "off" 75 | ${NSD_OnClick} $configFileRadioBtn configFileRadioClick 76 | ${NSD_Check} $configFileRadioBtn 77 | ${NSD_CreateRadioButton} 0 12u 100% 12u "Overwrite existing config file, or create a new one if it doesn't exist yet" 78 | Pop $configFileRadioBtn 79 | ${NSD_SetUserData} $configFileRadioBtn "on" 80 | ${NSD_OnClick} $configFileRadioBtn configFileRadioClick 81 | 82 | ${NSD_CreateHLine} 0 24u 100% 83 | Pop $0 84 | ${NSD_CreateLabel} 0 36u 100% 36u "NOTE: New major version releases of Streamlink may contain breaking changes that require modifications of old config files" 85 | Pop $0 86 | 87 | nsDialogs::Show 88 | FunctionEnd 89 | 90 | Function configFileRadioClick 91 | Pop $configFileRadioBtn 92 | ${NSD_GetUserData} $configFileRadioBtn $configFileOverwrite 93 | FunctionEnd 94 | 95 | [% endblock %] 96 | 97 | ; UI pages 98 | [% block ui_pages %] 99 | !insertmacro MUI_PAGE_WELCOME 100 | !insertmacro MUI_PAGE_COMPONENTS 101 | !insertmacro MULTIUSER_PAGE_INSTALLMODE 102 | !insertmacro MUI_PAGE_DIRECTORY 103 | page custom pageConfigFile 104 | !insertmacro MUI_PAGE_INSTFILES 105 | !insertmacro MUI_PAGE_FINISH 106 | [% endblock ui_pages %] 107 | 108 | [% block sections %] 109 | [[ super() ]] 110 | SubSection /e "Bundled tools" bundled 111 | Section "FFMPEG" ffmpeg 112 | SetOutPath "$INSTDIR\ffmpeg" 113 | File /r "${DIR_BUILD}/ffmpeg/*.*" 114 | SetShellVarContext current 115 | 116 | ; https://nsis.sourceforge.io/ConfigWrite 117 | ; update "ffmpeg-ffmpeg" config var to the path of the bundled ffmpeg executable 118 | ${ConfigWrite} "$APPDATA\streamlink\config" "ffmpeg-ffmpeg=" "$INSTDIR\ffmpeg\ffmpeg.exe" $R0 119 | ; remove "rtmp-rtmpdump" config var which was removed in Streamlink 3.0.0 120 | ${ConfigWrite} "$APPDATA\streamlink\config" "rtmp-rtmpdump=" "" $R0 121 | 122 | SetShellVarContext all 123 | SetOutPath - 124 | SectionEnd 125 | SubSectionEnd 126 | [% endblock %] 127 | 128 | [% block install_pkgs %] 129 | ; Try to remove the pkgs subdirectory before installing the actual pkgs content, in case it already exists from previous 130 | ; installs. This prevents old plugin files from being loaded by Streamlink that are incompatible with the current version. 131 | ; The issue that gets introduced by this is the recursive removal of this path, and if the user has selected an 132 | ; install path where a different pkgs subdirectory exists for other reasons, this will be removed unintentionally. 133 | ; Since pynist's uninstaller invokes the same command instead of deleting all installed files and directories 134 | ; in reverse order explicitly, we don't care too much about adding it here. 135 | ; https://github.com/takluyver/pynsist/issues/66 136 | RMDir /r "$INSTDIR\pkgs" 137 | [[ super() ]] 138 | [% endblock install_pkgs %] 139 | 140 | [% block install_files %] 141 | [[ super() ]] 142 | ; Install config file 143 | SetShellVarContext current # install the config file for the current user 144 | ${If} $configFileOverwrite == on 145 | SetOverwrite on 146 | SetOutPath $APPDATA\streamlink 147 | File /r "${DIR_BUILD}/config" 148 | ${Else} 149 | SetOverwrite off 150 | SetOutPath $APPDATA\streamlink 151 | File /r "${DIR_BUILD}/config" 152 | ${EndIf} 153 | SetOverwrite ifnewer 154 | SetOutPath - 155 | SetShellVarContext all 156 | 157 | ; Add metadata 158 | ; hijack the install_files block for this 159 | WriteRegStr HKLM "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\${PRODUCT_NAME}" "DisplayVersion" "${VERSION}" 160 | WriteRegStr HKLM "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\${PRODUCT_NAME}" "Publisher" "Streamlink" 161 | WriteRegStr HKLM "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\${PRODUCT_NAME}" "URLInfoAbout" "https://streamlink.github.io/" 162 | WriteRegStr HKLM "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\${PRODUCT_NAME}" "HelpLink" "https://streamlink.github.io/" 163 | ${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2 164 | IntFmt $0 "0x%08X" $0 165 | WriteRegDWORD HKLM "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\${PRODUCT_NAME}" "EstimatedSize" "$0" 166 | [% endblock %] 167 | 168 | [% block uninstall_files %] 169 | [[ super() ]] 170 | RMDir /r "$INSTDIR\ffmpeg" 171 | [% endblock %] 172 | 173 | [% block install_commands %] 174 | ; Remove any existing bin dir from %PATH% to avoid duplicates 175 | [% if has_commands %] 176 | nsExec::ExecToLog '[[ python ]] -Es "$INSTDIR\_system_path.py" remove "$INSTDIR\bin"' 177 | [% endif %] 178 | [[ super() ]] 179 | [% endblock install_commands %] 180 | 181 | [% block install_shortcuts %] 182 | ; Remove shortcut from previous releases 183 | Delete "$SMPROGRAMS\Streamlink.lnk" 184 | [% endblock %] 185 | 186 | [% block uninstall_shortcuts %] 187 | ; no shortcuts to be removed... 188 | [% endblock %] 189 | 190 | [% block mouseover_messages %] 191 | [[ super() ]] 192 | StrCmp $0 ${sec_app} "" +2 193 | SendMessage $R0 ${WM_SETTEXT} 0 "STR:${PRODUCT_NAME} with embedded Python" 194 | StrCmp $0 ${bundled} "" +2 195 | SendMessage $R0 ${WM_SETTEXT} 0 "STR:Extra tools used to play some streams" 196 | StrCmp $0 ${ffmpeg} "" +2 197 | SendMessage $R0 ${WM_SETTEXT} 0 "STR:FFMPEG is used to mux separate video and audio streams, for example DASH streams or high quality YouTube videos" 198 | [% endblock %] 199 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | Changelog - streamlink/windows-builds 2 | ==== 3 | 4 | ## 8.1.0-2 (2025-12-14) 5 | 6 | - Updated Streamlink to 8.1.0, updated its dependencies 7 | - Updated Python from 3.14.0 to 3.14.2 8 | - Fixed build name referencing old Python version 9 | 10 | ## 8.0.0-1 (2025-11-11) 11 | 12 | - Updated Streamlink to 8.0.0, updated its dependencies 13 | - Updated Python from 3.13.7 to 3.14.0 14 | - Added packaging changelog to GitHub releases 15 | 16 | ## 7.6.0-1 (2025-09-08) 17 | 18 | - Updated Streamlink to 7.6.0, updated its dependencies 19 | - Updated Python from 3.13.5 to 3.13.7 20 | - Updated FFmpeg to ffmpeg-n8.0, with latest library versions 21 | 22 | ## 7.5.0-1 (2025-07-08) 23 | 24 | - Updated Streamlink to 7.5.0, updated its dependencies 25 | - Updated Python from 3.13.4 to 3.13.5 26 | 27 | ## 7.4.0-1 (2025-06-08) 28 | 29 | - Updated Streamlink to 7.4.0, updated its dependencies 30 | - Updated Python from 3.13.3 to 3.13.4 31 | 32 | ## 7.3.0-1 (2025-04-26) 33 | 34 | - Updated Streamlink to 7.3.0, updated its dependencies 35 | - Updated Python from 3.13.2 to 3.13.3 36 | 37 | ## 7.2.0-1 (2025-04-04) 38 | 39 | - Updated Streamlink to 7.2.0, updated its dependencies 40 | - Added optional `zstandard` dependency 41 | 42 | ## 7.1.3-1 (2025-02-14) 43 | 44 | - Updated Streamlink to 7.1.3, updated its dependencies 45 | - Updated Python from 3.12.8 to 3.13.2 46 | - Added preview builds triggered from commits to Streamlink's master branch 47 | - Removed nightly builds 48 | - Changed installer and portable archive file name format for builds of untagged commits 49 | 50 | ## 7.1.2-2 (2025-01-21) 51 | 52 | - Updated FFmpeg to n7.1-153-gaeb8631048, with latest library versions 53 | 54 | ## 7.1.2-1 (2025-01-08) 55 | 56 | - Updated Streamlink to 7.1.2 57 | 58 | ## 7.1.1-1 (2024-12-28) 59 | 60 | - Updated Streamlink to 7.1.1 61 | 62 | ## 7.1.0-1 (2024-12-28) 63 | 64 | - Updated Streamlink to 7.1.0, updated its dependencies 65 | - Updated Python from 3.12.7 to 3.12.8 66 | 67 | ## 7.0.0-1 (2024-11-04) 68 | 69 | - Updated Streamlink to 7.0.0, updated its dependencies 70 | - Dropped EOL Python 3.8 builds (Windows 7/8 are now unsupported) 71 | - Dropped x86 ("32 bit") builds 72 | - Updated Python from 3.12.6 to 3.12.7 73 | - Updated FFmpeg to n7.1-11-g5c59d97e8a, with latest library versions 74 | - Updated default config file 75 | 76 | ## 6.11.0-1 (2024-10-01) 77 | 78 | - Updated Streamlink to 6.11.0, updated its dependencies 79 | - Updated Python from 3.12.5 to 3.12.6 80 | - Updated Python from 3.8.19-12-ge319f774 to 3.8.20 81 | 82 | ## 6.10.0-1 (2024-09-06) 83 | 84 | - Updated Streamlink to 6.10.0, updated its dependencies 85 | 86 | ## 6.9.0-1 (2024-08-12) 87 | 88 | - Updated Streamlink to 6.9.0, updated its dependencies 89 | - Updated Python from 3.12.4 to 3.12.5 90 | - Updated Python from 3.8.19-9-g5505b91a to 3.8.19-12-ge319f774 91 | 92 | ## 6.8.3-1 (2024-07-11) 93 | 94 | - Updated Streamlink to 6.8.3, updated its dependencies 95 | 96 | ## 6.8.2-1 (2024-07-04) 97 | 98 | - Updated Streamlink to 6.8.2, updated its dependencies 99 | 100 | ## 6.8.1-1 (2024-06-18) 101 | 102 | - Updated Streamlink to 6.8.1 103 | 104 | ## 6.8.0-1 (2024-06-17) 105 | 106 | - Updated Streamlink to 6.8.0, updated its dependencies 107 | - Updated Python from 3.12.3 to 3.12.4 108 | - Updated Python from 3.8.19-3-gf5bd65ed to 3.8.19-9-g5505b91a 109 | 110 | ## 6.7.4-1 (2024-05-12) 111 | 112 | - Updated Streamlink to 6.7.4, updated its dependencies 113 | 114 | ## 6.7.3-1 (2024-04-14) 115 | 116 | - Updated Streamlink to 6.7.3, updated its dependencies 117 | - Updated Python from 3.12.2 to 3.12.3 118 | - Updated Python from 3.8.18-18-g64c9fcc8 to 3.8.19-3-gf5bd65ed 119 | - Updated FFmpeg to n7.0-7-gd38bf5e08e, with latest library versions 120 | 121 | ## 6.7.1-1 (2024-03-19) 122 | 123 | - Updated Streamlink to 6.7.1, updated its dependencies 124 | 125 | ## 6.7.0-1 (2024-03-09) 126 | 127 | - Updated Streamlink to 6.7.0, updated its dependencies 128 | 129 | ## 6.6.2-1 (2024-02-20) 130 | 131 | - Updated Streamlink to 6.6.2 132 | 133 | ## 6.6.1-1 (2024-02-17) 134 | 135 | - Updated Streamlink to 6.6.1 136 | 137 | ## 6.6.0-1 (2024-02-16) 138 | 139 | - Updated Streamlink to 6.6.0, updated its dependencies 140 | - Updated Python from 3.12.1 to 3.12.2 141 | - Updated Python from 3.8.18 to 3.8.18-18-g64c9fcc8 142 | 143 | ## 6.5.1-1 (2024-01-16) 144 | 145 | - Updated Streamlink to 6.5.1, updated its dependencies 146 | - Switched from Python 3.11 to Python 3.12 147 | 148 | ## 6.5.0-2 (2023-12-17) 149 | 150 | - Fixed missing transitive dependencies of Python 3.8 builds 151 | 152 | ## 6.5.0-1 (2023-12-16) 153 | 154 | - Updated Streamlink to 6.5.0, updated its dependencies 155 | - Updated Python from 3.11.6 to 3.11.7 156 | - Updated Python from 3.8.18 to 3.8.18-8-g575c99a5 157 | - Added brotli dependency 158 | - Rewritten dependencies setup (update/build scripts and config format) 159 | 160 | ## 6.4.2-1 (2023-11-28) 161 | 162 | - Updated Streamlink to 6.4.2 163 | 164 | ## 6.4.1-1 (2023-11-22) 165 | 166 | - Updated Streamlink to 6.4.1 167 | 168 | ## 6.4.0-1 (2023-11-21) 169 | 170 | - Updated Streamlink to 6.4.0, updated its dependencies 171 | - Updated FFmpeg to n6.1, with latest library versions 172 | 173 | ## 6.3.1-1 (2023-10-26) 174 | 175 | - Updated Streamlink to 6.3.1 176 | 177 | ## 6.3.0-1 (2023-10-25) 178 | 179 | - Updated Streamlink to 6.3.0, updated its dependencies 180 | - Updated Python from 3.11.5 to 3.11.6 181 | 182 | ## 6.2.1-1 (2023-10-03) 183 | 184 | - Updated Streamlink to 6.2.1, updated its dependencies 185 | - Updated FFmpeg to n6.0-35, with latest library versions 186 | - Switched build-config format from JSON to YML 187 | 188 | ## 6.2.0-1 (2023-09-14) 189 | 190 | - Updated Streamlink to 6.2.0, updated its dependencies 191 | 192 | ## 6.1.0-2 (2023-08-27) 193 | 194 | - Updated Python from 3.11.4 to 3.11.5 (OpenSSL 1.1.1u -> 3.0.9) 195 | - Updated Python from 3.8.17 to 3.8.18 196 | - Fixed DLL-loading issues of embedded Python builds ("SSL module is not available") 197 | 198 | ## 6.1.0-1 (2023-08-16) 199 | 200 | - Updated Streamlink to 6.1.0, updated its dependencies 201 | - Added param to get-dependencies script for optional dependency overrides 202 | 203 | ## 6.0.1-1 (2023-08-02) 204 | 205 | - Updated Streamlink to 6.0.1, updated its dependencies 206 | 207 | ## 6.0.0-1 (2023-07-20) 208 | 209 | - Updated Streamlink to 6.0.0, updated its dependencies 210 | - Updated Python from 3.11.3 to 3.11.4 211 | - Updated Python from 3.8.16 to 3.8.17 212 | - Updated Streamlink config file ([`--player` breaking changes](https://streamlink.github.io/migrations.html#player-path-only-player-cli-argument)) 213 | - Added new page to installer for overwriting the existing config file 214 | 215 | ## 5.5.1-2 (2023-05-22) 216 | 217 | - Updated dependencies ([urllib3 2.x](https://urllib3.readthedocs.io/en/2.0.2/v2-migration-guide.html#what-are-the-important-changes), [requests 2.31.0](https://github.com/psf/requests/releases/tag/v2.31.0)) 218 | - Updated Python from 3.8.16 to 3.8.16-18-g9f89c471 219 | 220 | ## 5.5.1-1 (2023-05-08) 221 | 222 | - Updated Streamlink to 5.5.1, updated its dependencies 223 | 224 | ## 5.5.0-1 (2023-05-05) 225 | 226 | - Updated Streamlink to 5.5.0, updated its dependencies 227 | 228 | ## 5.4.0-1 (2023-04-12) 229 | 230 | - Updated Streamlink to 5.4.0, updated its dependencies 231 | - Updated Python from 3.11.2 to 3.11.3 232 | - Updated FFmpeg from n5.1.2-9 to n6.0-3 233 | 234 | ## 5.3.1-1 (2023-02-25) 235 | 236 | - Updated Streamlink to 5.3.1 237 | 238 | ## 5.3.0-1 (2023-02-18) 239 | 240 | - Updated Streamlink to 5.3.0, updated its dependencies 241 | - Updated Python from 3.11.1 to 3.11.2 242 | 243 | ## 5.2.1-1 (2023-01-23) 244 | 245 | - Updated Streamlink to 5.2.1, updated its dependencies 246 | - Updated FFmpeg from n5.1-1 to n5.1.2-9 247 | 248 | ## 5.1.2-2 (2022-12-14) 249 | 250 | - Switched from Python 3.10 to Python 3.11 251 | - Updated Python from 3.8.15 to 3.8.16 252 | - Updated dependencies 253 | 254 | ## 5.1.2-1 (2022-12-03) 255 | 256 | - Updated Streamlink to 5.1.2, updated its dependencies 257 | 258 | ## 5.1.1-1 (2022-11-23) 259 | 260 | - Updated Streamlink to 5.1.1 261 | 262 | ## 5.1.0-1 (2022-11-14) 263 | 264 | - Updated Streamlink to 5.1.0, updated its dependencies 265 | - Updated Python from 3.8.14 to 3.8.15 266 | - Updated Python from 3.10.7 to 3.10.8 267 | - Bumped distlib from 0.3.3 to 0.3.6 268 | 269 | ## 5.0.1-1 (2022-09-22) 270 | 271 | - Updated Streamlink to 5.0.1 272 | 273 | ## 5.0.0-1 (2022-09-16) 274 | 275 | - Updated Streamlink to 5.0.0, updated its dependencies 276 | - Updated Python from 3.8.13 to 3.8.14 277 | - Updated Python from 3.10.6 to 3.10.7 278 | 279 | ## 4.3.0-1 (2022-08-15) 280 | 281 | - Updated Streamlink to 4.3.0, updated its dependencies 282 | - Updated Python from 3.10.5 to 3.10.6 283 | 284 | ## 4.2.0-2 (2022-08-02) 285 | 286 | - Fixed missing dist-info directory in installer, causing an error when `--loglevel=debug` was set due to missing metadata of the streamlink package 287 | - Updated FFmpeg to n5.1-1 288 | - Added `requirements.txt` for easier build dependency specification 289 | 290 | ## 4.2.0-1 (2022-07-09) 291 | 292 | - Updated Streamlink to 4.2.0, updated its dependencies 293 | 294 | ## 4.1.0-3 (2022-06-11) 295 | 296 | - Implemented portable builds 297 | - Renamed repository from streamlink/windows-installer to streamlink/windows-builds 298 | - Upgraded Python from 3.10.3 to 3.10.5 299 | - Moved Python standard library into zip archive for both installers and portable builds 300 | - Added changelog 301 | 302 | ## 4.1.0-2 (2022-06-01) 303 | 304 | - Updated lxml dependency to 4.9.0 305 | 306 | ## 4.1.0-1 (2022-05-30) 307 | 308 | - Updated Streamlink to 4.1.0, updated its dependencies 309 | 310 | ## 4.0.0-1 (2022-05-01) 311 | 312 | - Updated Streamlink to 4.0.0, updated its dependencies 313 | - Added check for removing old and unsupported `rtmp-rtmpdump` parameter from users' config files in the installers 314 | 315 | ## 3.2.0-1 (2022-03-22) 316 | 317 | - Initial release, based on Streamlink 3.2.0 318 | --------------------------------------------------------------------------------