Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
f6631b5
feat(soundcloud): add SoundCloud tab with feed, search, downloads, an…
kibetmasi Sep 23, 2026
65611a8
fix(soundcloud): resolve KSP crash from ViewModel default params
kibetmasi Sep 23, 2026
c010a13
Merge pull request #1 from kibetmasi/feat/soundcloud-tab
kibetmasi Sep 23, 2026
66d8d61
ci: drop Wear OS workflows and keep phone-only builds
kibetmasi Sep 23, 2026
379ba8e
chore: merge SoundCloud CI and OptIn fixes into master
kibetmasi Sep 23, 2026
efd1ba4
docs(changelog): add 0.8.0-soundcloud release notes
kibetmasi Sep 23, 2026
cecae65
feat(soundcloud): refine feed and playback experience
kibetmasi Sep 23, 2026
fd56e58
feat(soundcloud): match library compact and tab-row navigation
kibetmasi Sep 23, 2026
642365f
fix(soundcloud): transparent loading container and Search-style bar
kibetmasi Sep 23, 2026
482f869
ci(release): publish continuous GitHub Release on every master push
kibetmasi Sep 23, 2026
4875802
ci: run only commitlint and Release APK on master pushes
kibetmasi Sep 23, 2026
cac617b
ci(release): real download links and keep Latest pointing at newest b…
kibetmasi Sep 23, 2026
16e710b
ci(release): bump versionCode so APKs install as updates
kibetmasi Sep 23, 2026
b0db164
fix(soundcloud): match Library header inset and open Experimental set…
kibetmasi Sep 23, 2026
2531dd3
feat(soundcloud): multi-select downloads with Library batch actions
kibetmasi Sep 23, 2026
58a9c36
ci(release): use minutes-since-epoch versionCode within Int range
kibetmasi Sep 23, 2026
2a08fb8
fix(soundcloud): stop 429 DRM spam, auto-refresh client_id, vertical …
kibetmasi Sep 23, 2026
0f3dc7e
fix(playback): catch FGS start denial in MusicService.onStartCommand
kibetmasi Sep 23, 2026
50ecaf0
fix(soundcloud): pad list bottom for mini player and nav bar
kibetmasi Sep 23, 2026
e464d1b
feat(soundcloud): share tracks and playlists as links
kibetmasi Sep 23, 2026
dee14e9
docs: rewrite README as user-focused download and SoundCloud guide
kibetmasi Sep 23, 2026
f66b690
docs: add client_id screenshot and drop Obtainium tip
kibetmasi Sep 23, 2026
eb0e857
docs: redact client_id from README and screenshot
kibetmasi Sep 23, 2026
bf8fd64
docs: fully mask client_id in SoundCloud DevTools screenshot
kibetmasi Sep 23, 2026
cc8e188
docs: scrub real client_id from DevTools screenshot
kibetmasi Sep 23, 2026
a5a0ae4
fix: play SoundCloud HLS and highlight now-playing rows
kibetmasi Sep 23, 2026
ebb1fa1
fix: start SoundCloud playback after resolving only the tapped track
kibetmasi Sep 23, 2026
2d50ef0
ci: tolerate force-push when commitlint resolves the push range
kibetmasi Sep 23, 2026
2ac3347
fix(soundcloud): polish now-playing UI and add section/shelf swipe
kibetmasi Sep 23, 2026
75cb8d4
fix(soundcloud): skip unplayable tracks and tag downloads correctly
kibetmasi Sep 25, 2026
b5345c4
feat: move SoundCloud settings and download newer releases in-app
kibetmasi Sep 25, 2026
ac1ac2a
fix: place update preference keys on MainActivity
kibetmasi Sep 25, 2026
0061c7f
chore: publish a follow-up release for update prompts
kibetmasi Sep 25, 2026
73cbf36
feat(stats): badge integration tracks with a source logo
kibetmasi Sep 25, 2026
d5c4d0e
feat(soundcloud): like the current track from the player card
kibetmasi Sep 25, 2026
fb3c82e
feat: check for updates from the changelog sheet
kibetmasi Sep 25, 2026
d58f4bc
fix(soundcloud): refresh expired stream links after restart
kibetmasi Sep 25, 2026
50bbdc3
fix: escape the changelog unavailable string
kibetmasi Sep 25, 2026
4bfd6be
fix: import awaitAll for SoundCloud stream refresh
kibetmasi Sep 25, 2026
469e199
feat: play YouTube Music with feed, radio, and likes
kibetmasi Sep 27, 2026
ee33fa7
fix: keep YouTube playback, likes, and playlists working
kibetmasi Sep 27, 2026
f0912fc
fix: escape the playlist empty-state apostrophe
kibetmasi Sep 27, 2026
72b860f
fix: escape the empty playlist string
kibetmasi Sep 27, 2026
bc1d5ea
fix: restore in-app YouTube sign-in and one-tap play
kibetmasi Sep 27, 2026
4370a3f
fix: log out of YouTube fully and start playback on one tap
kibetmasi Sep 27, 2026
15337ad
fix: restore YouTube search and clear liked session on sign-out
kibetmasi Sep 27, 2026
8366d19
fix: put YouTube search in the brown header
kibetmasi Sep 27, 2026
db0eafd
fix: stop forcing the desktop Google sign-in page
kibetmasi Sep 27, 2026
7b4d26e
feat: show recently played tracks and YouTube Music likes
kibetmasi Sep 27, 2026
5603b65
fix: load the YouTube Music Liked Music playlist
kibetmasi Sep 27, 2026
4243cfb
fix: send the YouTube Music request that returns Liked Music
kibetmasi Sep 27, 2026
dd63840
fix: load only YouTube Music liked songs
kibetmasi Sep 27, 2026
fc01d85
fix: keep the player closed when a song starts
kibetmasi Sep 27, 2026
4d6e63b
fix: authenticate Liked Music and personalize recommendations
kibetmasi Sep 27, 2026
0342c4e
fix: focus search on a second tab tap
kibetmasi Sep 27, 2026
50c1185
feat: send the signed-in identity on YouTube Music requests
kibetmasi Sep 27, 2026
0777f86
feat: add skip silence and cut the delay before a song starts
kibetmasi Sep 27, 2026
621698f
feat: page through liked music instead of capping at 100
kibetmasi Sep 27, 2026
6f311d3
fix: keep newest likes first and load the rest on scroll
kibetmasi Sep 27, 2026
3827d6b
fix: pause the current YouTube song instead of restarting it
kibetmasi Sep 27, 2026
6146d57
feat: like, playlists, and add-to-playlist via YouTube Music
kibetmasi Sep 28, 2026
068173c
fix: stop the app from closing on Pixel Fold launch
kibetmasi Sep 28, 2026
1096f32
chore: ignore the local Cursor directory
kibetmasi Sep 28, 2026
5555ad3
feat: peek the next playlist cover on the Playlists tab
kibetmasi Sep 28, 2026
23f4e15
fix: stop update install from crashing without permission
kibetmasi Sep 28, 2026
5c7eb2f
fix: harden install checks and keep unit tests green
kibetmasi Sep 28, 2026
1cc59c6
fix: peek the next song on now playing, not playlists
kibetmasi Sep 28, 2026
48e9cc5
feat: play youtube lists in order with library song actions
kibetmasi Sep 28, 2026
2e26cee
fix: make youtube song selection and queue actions work
kibetmasi Sep 28, 2026
0dcdb80
fix: show recently played under your mix on feed
kibetmasi Sep 28, 2026
5e69d8b
feat: open listening stats from the bottom of feed
kibetmasi Sep 28, 2026
474d89a
fix: drop the unused youtube bookmark save
kibetmasi Sep 28, 2026
a1a83f6
fix: pin YouTube selection actions to the list header
kibetmasi Sep 28, 2026
de143ed
fix: open feed selection options for shelf tracks
kibetmasi Sep 28, 2026
785cfd8
fix: name YouTube plays in listening stats
kibetmasi Sep 28, 2026
6969e51
fix: use real YouTube artist and album names
kibetmasi Sep 28, 2026
b141660
fix: keep played YouTube playlist tracks and stop skipping songs
kibetmasi Sep 29, 2026
37d0215
fix: fill missing stats names with the saved AI key
kibetmasi Sep 29, 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
41 changes: 41 additions & 0 deletions .github/workflows/build-app.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
name: Build app

# Compiles a debug APK on every push so broken builds fail before release.
on:
push:

permissions:
contents: read

concurrency:
group: build-app-${{ github.ref }}
cancel-in-progress: true

jobs:
build:
if: github.actor != 'dependabot[bot]'
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v6

- name: Set up JDK 21
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: '21'

- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6

- name: Build debug APK
run: gradle :app:assembleDebug -Ppixelplay.enableAbiSplits=true

- name: Upload debug APKs
uses: actions/upload-artifact@v7
with:
name: PixelPlay-debug-${{ github.sha }}
path: app/build/outputs/apk/debug/*.apk
if-no-files-found: error
compression-level: 0
7 changes: 2 additions & 5 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
name: "CodeQL Advanced"

# Weekly + manual only — avoid a full Gradle rebuild on every master push.
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
workflow_dispatch:
schedule:
- cron: '25 15 * * 0'
Expand Down Expand Up @@ -49,7 +46,7 @@ jobs:
build-mode: manual

- name: Build with Gradle
run: ${{ github.workspace }}/gradlew :app:assembleDebug :wear:assembleDebug --no-daemon
run: ${{ github.workspace }}/gradlew :app:assembleDebug --no-daemon

- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v4
Expand Down
68 changes: 68 additions & 0 deletions .github/workflows/commitlint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
name: Commit Lint (Semantic)

# Keep this — cheap and useful. Runs on push/PR; not an APK build.
on:
push:
branches: [master, 'feat/**', 'fix/**', 'chore/**', 'ci/**']
pull_request:
types: [opened, synchronize, reopened, edited]
branches: [master]

permissions:
contents: read
pull-requests: read

concurrency:
group: commitlint-${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
cancel-in-progress: true

jobs:
commitlint:
name: Enforce conventional commits
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0

- name: Setup Node
uses: actions/setup-node@v6
with:
node-version: '22'

- name: Install commitlint
run: npm install --no-save @commitlint/cli@19 @commitlint/config-conventional@19

- name: Lint PR commits
if: github.event_name == 'pull_request'
run: |
npx commitlint \
--from "${{ github.event.pull_request.base.sha }}" \
--to "${{ github.event.pull_request.head.sha }}" \
--verbose

- name: Lint push commits
if: github.event_name == 'push'
run: |
# Validate every new commit on the push (range from before → after).
# Force-pushes rewrite `before` so that SHA may no longer exist — fall back
# to linting only HEAD instead of failing with "Invalid revision range".
BEFORE="${{ github.event.before }}"
ZERO="0000000000000000000000000000000000000000"
if [ -z "$BEFORE" ] || [ "$BEFORE" = "$ZERO" ]; then
echo "No previous SHA (new branch); linting HEAD only."
npx commitlint --last --verbose
elif ! git cat-file -e "${BEFORE}^{commit}" 2>/dev/null; then
echo "Previous SHA $BEFORE is unreachable (likely force-push); linting HEAD only."
npx commitlint --last --verbose
else
npx commitlint --from "$BEFORE" --to "${{ github.sha }}" --verbose
fi

- name: Lint PR title
if: github.event_name == 'pull_request'
env:
PR_TITLE: ${{ github.event.pull_request.title }}
run: |
echo "$PR_TITLE" | npx commitlint --verbose
4 changes: 1 addition & 3 deletions .github/workflows/nightly-apk.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
name: Build Nightly APK

# Manual only — continuous Release APK on master replaces scheduled nightlies.
on:
schedule:
# Runs at 02:17 America/Buenos_Aires.
- cron: '17 5 * * *'
workflow_dispatch:

permissions:
Expand Down
3 changes: 1 addition & 2 deletions .github/workflows/phone-debug.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
name: Build Phone APK (Debug)

# PR / manual only — master publishes via Release APK instead.
on:
push:
branches: [ master ]
pull_request:
types: [opened, synchronize, reopened]
branches: [ master ]
Expand Down
3 changes: 1 addition & 2 deletions .github/workflows/phone-release.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
name: Build Phone APK (Release)

# PR / manual only — master publishes via Release APK instead.
on:
push:
branches: [ master ]
pull_request:
types: [opened, synchronize, reopened]
branches: [ master ]
Expand Down
Loading