Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
78a1966
feat: initialize StreamGO workspace with Chi router, MongoDB v2, and …
SriKousik Sep 18, 2026
73f3910
feat: add structured colored logger and API_LOGS toggle to silence HT…
SriKousik Sep 18, 2026
d09d6d2
feat: add Swagger UI (/docs), ReDoc (/redoc), and OpenAPI 3.0 spec (/…
SriKousik Sep 18, 2026
e0acbc1
feat: modular port of tracks, topics, browse, search, and streaming e…
SriKousik Sep 18, 2026
29b3e5b
feat: implement bit-perfect Telegram MTProto live audio streaming wit…
SriKousik Sep 18, 2026
8834509
feat: add alternative titles support, artists, albums, playlists, fav…
SriKousik Sep 18, 2026
56d4721
partial
SriKousik Sep 18, 2026
67477f4
test
SriKousik Sep 19, 2026
a8d7670
misc changes
SriKousik Sep 19, 2026
249b48c
topics
SriKousik Sep 19, 2026
9e3767d
enrichment fix
SriKousik Sep 19, 2026
d55088d
feat(stream): support ALAC browser streaming via lossless FLAC transc…
reachrishav Sep 22, 2026
88e333b
Merge pull request #1 from reachrishav/feat/alac-browser-streaming
reachrishav Sep 22, 2026
a043efa
feat(audio): implement on-the-fly ALAC to WAV streaming with instant …
Sep 22, 2026
a4ca79d
update alac stream url
Sep 22, 2026
3fb6dbd
fix(audio): fix ALAC seek noise caused by mid-stream WAV->FLAC switch…
Sep 22, 2026
ac0d436
fix(audio): eliminate dual-format stream collision by consistently se…
Sep 23, 2026
62f0f08
fix(stream): handle malformed FLAC picture headers and broaden ALAC d…
Sep 23, 2026
5ef2cfb
Merge pull request #1 from reachrishav/main
SriKousik Sep 25, 2026
f5b5bbf
feat: add support for recaps, listening calculations, and stream play…
SriKousik Sep 25, 2026
9f5640e
Merge remote-tracking branch 'origin/main'
SriKousik Sep 25, 2026
e840883
fix(stream): restore context import in stream handler
SriKousik Sep 25, 2026
b04667f
fix(alac): accurately detect ALAC format, normalize m4a with bit dept…
SriKousik Sep 25, 2026
70c00e5
Merge branch 'main' into feat/instant-alac-wav-streaming
reachrishav Sep 25, 2026
c14f2f2
perf(artists,albums): direct indexed reads, background bulkwrite sync…
SriKousik Sep 26, 2026
92a5122
Merge pull request #2 from reachrishav/feat/instant-alac-wav-streaming
SriKousik Sep 26, 2026
f968af0
fix: add missing closing curly brace
reachrishav Sep 26, 2026
31e54ad
Merge pull request #3 from reachrishav/fix/alac-streaming-fix
SriKousik Sep 26, 2026
c8fac21
feat(artwork): implement optional Cloudflare R2 artwork pipeline with…
reachrishav Sep 26, 2026
9584129
docs: add Cloudflare R2 optional variables to .env.example
reachrishav Sep 26, 2026
6a0c431
fix(config): strip quotes from environment variables in getEnv
reachrishav Sep 26, 2026
ada17c3
feat(artwork): implement dual cloudflare R2 artwork pipeline with gat…
reachrishav Sep 26, 2026
5b0654b
feat(metadata): implement title and artist deduplication pipeline wit…
reachrishav Sep 26, 2026
8f46599
Merge pull request #2 from reachrishav/feat/artwork-pipeline-r2
reachrishav Sep 26, 2026
a544829
chore: merge feat/metadata-sanitization into feat/artwork-pipeline-op…
reachrishav Sep 27, 2026
66e51b5
feat(artwork): progressive slice fetching, 1000x1000/200x200 caps, an…
reachrishav Sep 27, 2026
9ab8b0f
feat: artwork pipeline enhancements
reachrishav Sep 27, 2026
d3cdee8
Merge pull request #3 from reachrishav/feat/artwork-pipeline-optimiza…
reachrishav Sep 27, 2026
9ce30c4
fix(telegram): increase migration timeout, enforce obfuscated tcp4, a…
SriKousik Oct 1, 2026
8348191
Merge pull request #4 from reachrishav/main
SriKousik Oct 2, 2026
3fa9281
feat(tracks): add DELETE /tracks/{id} endpoint with cache pruning and…
reachrishav Oct 3, 2026
4d98bcb
Merge pull request #4 from reachrishav/feat/delete-song-endpoint
reachrishav Oct 3, 2026
e1fb462
Merge pull request #5 from reachrishav/main
SriKousik Oct 3, 2026
150892c
feat(telegram): modular command handlers matching StreamXBot and remo…
SriKousik Oct 4, 2026
3379507
fix(telegram): remove artificial emojis to strictly match StreamXBot …
SriKousik Oct 4, 2026
8c03bc5
feat(telegram): add config_manager and interactive sudo settings panel
SriKousik Oct 4, 2026
cb51a23
fix(config): support bson.A and enhance type conversion for OWNER_ID …
SriKousik Oct 4, 2026
ae7de94
feat(telegram): cache user access hashes and support direct input pee…
SriKousik Oct 4, 2026
4277658
fix: Deduplication
SriKousik Oct 8, 2026
38d2c68
misc
SriKousik Oct 8, 2026
3d82541
log -> debug
SriKousik Oct 12, 2026
0c4feb4
Prepare Go migration with Python preserved on legacy branch
SriKousik Oct 28, 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
18 changes: 6 additions & 12 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -1,14 +1,8 @@
.venv
node_modules
**/node_modules
.git
__pycache__
*.pyc
*.pyo
*.pyd
.gitignore
bin/
stream_media/
.env
dist
build
StreamX
log.txt
*.log
*.log
cmd/test_*
scratch/
29 changes: 29 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Server Configuration
PORT=8000
DEBUG=false
API_LOGS=false
CORS_ORIGIN=*

# MongoDB Configuration
MONGO_URI=mongodb://localhost:27017
DATABASE_NAME=Stream

# Telegram Credentials
API_ID=0
API_HASH=
BOT_TOKEN=
OWNER_ID=0
SECRET_KEY=
SESSION_STRING=

# Channel IDs (optional)
CHANNEL_ID=0
DUMP_CHANNEL_ID=0

# Cloudflare R2 Blob Storage for Artwork (Optional)
# Leave blank to use free online enrichment (iTunes/Deezer) without any account
R2_ACCOUNT_ID=
R2_ACCESS_KEY_ID=
R2_SECRET_ACCESS_KEY=
R2_BUCKET_NAME=
R2_PUBLIC_URL=
24 changes: 24 additions & 0 deletions .github/workflows/go.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
name: Go

on:
push:
branches: [main, dev/go-migration]
pull_request:
branches: [main]

permissions:
contents: read

jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version-file: go.mod
check-latest: true
cache: true
- run: go test ./...
- run: go vet ./...
- run: go build ./cmd/server
65 changes: 1 addition & 64 deletions .github/workflows/heroku-docker.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Heroku (setup config + Docker web deploy)
name: Heroku (Docker web deploy)

on:
push:
Expand Down Expand Up @@ -50,12 +50,6 @@ jobs:

echo "HEROKU_ENABLED=$ENABLED" >> $GITHUB_ENV

if [ -n "${{ secrets.CONFIG_GIST }}" ]; then
echo "GIST_RAW_URL=${{ secrets.CONFIG_GIST }}" >> $GITHUB_ENV
else
echo "GIST_RAW_URL=" >> $GITHUB_ENV
fi

- name: Ensure Heroku app exists (create if missing)
if: env.HEROKU_ENABLED == 'true'
env:
Expand All @@ -82,63 +76,6 @@ jobs:
exit 1
fi

- name: Download config.py from gist
if: env.HEROKU_ENABLED == 'true' && env.GIST_RAW_URL != ''
env:
GIST_RAW_URL: ${{ env.GIST_RAW_URL }}
run: |
echo "Downloading config.py from $GIST_RAW_URL"
curl -sSL "$GIST_RAW_URL" -o remote_config.py

echo "First lines of remote_config.py:"
head -n 20 remote_config.py || true

- name: Convert config.py (gist) to Heroku config JSON (dynamic keys)
if: env.HEROKU_ENABLED == 'true' && env.GIST_RAW_URL != ''
run: |
python - << 'PY'
import runpy, json, types

cfg = runpy.run_path("remote_config.py")

mapping = {}

for k, v in cfg.items():
# Skip Python internals like __name__, __file__, etc.
if k.startswith("__"):
continue

# Skip modules, functions, classes
if isinstance(v, types.ModuleType) or isinstance(v, type) or callable(v):
continue

# Convert lists/tuples like [6310382769] to "6310382769 123456"
if isinstance(v, (list, tuple)):
mapping[k] = " ".join(str(x) for x in v)
else:
mapping[k] = str(v)

with open("heroku-config.json", "w") as f:
json.dump(mapping, f)

print("Generated heroku-config.json with keys:", ", ".join(mapping.keys()))
PY

- name: Apply config vars to Heroku app
if: env.HEROKU_ENABLED == 'true' && env.GIST_RAW_URL != ''
env:
HEROKU_API_KEY: ${{ env.HEROKU_API_KEY }}
HEROKU_APP_NAME: ${{ env.HEROKU_APP_NAME }}
run: |
echo "Patching config vars for app '$HEROKU_APP_NAME' from gist..."
curl -sS -X PATCH "https://api.heroku.com/apps/$HEROKU_APP_NAME/config-vars" \
-H "Content-Type: application/json" \
-H "Accept: application/vnd.heroku+json; version=3" \
-H "Authorization: Bearer $HEROKU_API_KEY" \
-d @heroku-config.json

echo "Config vars have been updated for app '$HEROKU_APP_NAME'."

- name: Log in to Heroku Container Registry
if: env.HEROKU_ENABLED == 'true'
env:
Expand Down
66 changes: 31 additions & 35 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,39 +1,35 @@
__pycache__/
.venv/
venv/
*.session*
*.txt
.env
tes*
export/
*_cache
GenCovers/
!requirements.txt
!test.py
.env
cookies/
stream_media/
# Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib
bin/
dist/

# Test binary, built with `go test -c`
*.test

logs
*.log
# Output of the go coverage tool, specifically when used with LiteIDE
*.out

# Dependency directories (remove the comment below to include it)
# vendor/

# Go workspace file
go.work

# Local environment and secret files
.env
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
*.local.env

node_modules
dist
dist-ssr
*.local
# Media temporary cache
stream_media/
alac_cache/
tmp/

.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
# IDE specific files
.idea/
.vscode/
*.swp
*.swo
1 change: 0 additions & 1 deletion Api/__init__.py

This file was deleted.

13 changes: 0 additions & 13 deletions Api/__main__.py

This file was deleted.

1 change: 0 additions & 1 deletion Api/deps/__init__.py

This file was deleted.

22 changes: 0 additions & 22 deletions Api/deps/db.py

This file was deleted.

Loading
Loading