Skip to content

This PR adds multi-language romanization support, new app languages, a dedicated Lyrics settings section, fixes 21 pre-existing lint errors, and includes various improvements across the codebase.#2457

Open
daedaevibin wants to merge 48 commits into
PixelPlayerHQ:masterfrom
Veridian-Zenith:master

Conversation

@daedaevibin

@daedaevibin daedaevibin commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

Overview

This PR combines multi-language romanization support, new app languages, dedicated Lyrics settings section, lint fixes, and merges VoidX3D PR #2497 (AI provider overhaul + performance optimization) with additional bug fixes on top.

107 files changed (excluding VoidX3D commits)


New Features

Multi-language romanization (MultiLangRomanizer)

  • Added detection for 10+ scripts: Japanese, Korean, Chinese, Hindi, Punjabi, Cyrillic, Vietnamese, Thai, Arabic, Greek, Hebrew
  • romanizeVietnamese(): NFKD-decomposes and strips diacritics to plain ASCII Latin
  • Cyrillic romanization: Language-specific processors for 7 Slavic languages

New app languages

  • Japanese: Full translation (values-ja/)
  • Vietnamese (values-vi/) and Traditional Chinese (values-zh-rTW/)
  • Locale config: locales_config.xml registers all 14 supported locales

LYRICS settings category

  • New dedicated LYRICS category in Settings between APPEARANCE and PLAYBACK

AI settings improvements (from VoidX3D PR #2497 + fixes)

  • Split AI settings into AI Provider and Generation Parameters tabs
  • New SearchableProviderSelector with live search
  • Added OLLAMA and CUSTOM providers (11 total)
  • CJK-aware token scaling: effectiveMaxTokens interpolates charsPerToken between 1 (CJK) and 4 (Latin)

Performance optimizations (from VoidX3D PR #2497)

  • Serialized library data loading to avoid I/O contention
  • In-memory state optimization replacing redundant Room SELECT COUNT(*) queries
  • Loading state stability — eliminated 4x state flapping during initial load

Bug Fixes

Lyrics translation fixes

  • Token cap increased from 16384 to 32768
  • Output estimation improved — uses 3x input size (was 2x)
  • Expanded CJK detection — now includes Thai, Arabic, Greek, Hebrew, Hindi, Punjabi
  • Removed false "already translated" guard — was checking stale UI state
  • Lyrics source priority reordered: local file -> embedded -> DB -> song.lyrics
  • Translation prompt improved — handles both synced and plain lyrics

Lyrics search fixes

  • Search dialog now closes on success
  • Romanized artist search added — romanizes both title AND artist for non-Latin scripts
  • Unicode .lrc filename matching — regex now supports Unicode characters
  • Embedded lyrics prioritization

AI system fixes

  • Thinking model detection — checks model name instead of prompt text
  • AI response cache cleanup — 7-day TTL cleanup after each insert
  • Gemini API key — moved from URL query parameter to HTTP header
  • Duplicate model filtering consolidated — uses UnifiedModelFilter consistently
  • Dead code removedcountTokens(), duplicate clearAll(), FQN imports

Architecture fixes

  • Shared OkHttpClient singleton (Feature/remove button playlist #58) — AI clients now share a single OkHttpClient via @AiOkHttpClient qualifier, preserving connection pools across all provider instances
  • High-res FLAC metadata fallback (Fix/search screen design #64) — updateFileMetadataWithTagLib now returns false for problematic FLAC (was silently returning true without writing); added FLAC verification after JAudioTagger commit
  • Provider display name deduplication (Feat/album collapsible header #67) — AiClientFactory uses provider.displayName instead of hardcoded strings; removed 80+ lines of dead per-provider StateFlows and change/reset functions from SettingsViewModel

Other fixes

  • fetchFromRemote exact-match result now properly returned (missing return@withContext)
  • Bulk LRC scanner uses Unicode-aware regex (was ASCII-only)
  • AI max tokens default increased from 4096 to 8192
  • Provider cooldowns use ConcurrentHashMap with auto-cleanup
  • NonObservableLocale lint suppressed on Locale.getDefault() in composables

Lint errors (22 resolved)

Type Count Fix
MissingDefaultResource 14 Created base values/plurals.xml
NewApi 3 Annotated with @RequiresApi(31)
WrongConstant 1 Suppressed lint
NonObservableLocale 3 Suppressed lint
MissingIntentFilterForMediaSearch 1 Added intent-filter

CI & Build

  • Added --no-build-cache to all Gradle build steps in CI workflows
  • Reordered CodeQL workflow: Kotlin version pinning before Gradle setup
  • Removed explicit maxHeapSize from app/build.gradle.kts

Security & Utility

  • ServerUrlUtils.kt: Server URL validation utility to prevent SSRF/malformed URLs
  • app/lint.xml: Lint baseline configuration

Breaking Changes

  • OLLAMA provider: Now requires an API key (requiresApiKey=true)

Testing

  • ./gradlew :app:lintDebugPASS (0 errors)
  • ./gradlew :app:testDebugUnitTest388 tests pass, 5 pre-existing failures (unrelated to this PR)

Credits

  • VoidX3D for the AI provider overhaul and performance optimization (PR #2497)

@daedaevibin

daedaevibin commented Jun 24, 2026

Copy link
Copy Markdown
Contributor Author

Note:

Commits not signed despite my git settings being set to always sign commits. Unsure as to the reason why, currently investigating...


Corrected, rebased, and re-pushed.

New values-ja/ resource directory with all string categories translated.
… Vietnamese

- isThai(): detect Thai script via U+0E00..U+0E7F
- isArabic(): detect Arabic script via U+0600..U+06FF
- isGreek(): detect Greek script via U+0370..U+03FF
- isHebrew(): detect Hebrew script via U+0590..U+05FF
- isVietnamese(): detect Vietnamese via Latin Extended Additional block (U+1EA0..U+1EF9) and specific chars (ă, đ, ơ, ư)
- romanizeVietnamese(): NFKD-decompose and strip diacritics to plain ASCII
LyricsRepositoryImpl.kt:
- Route Cyrillic text to romanizeCyrillic() before falling through
- Route Vietnamese text to romanizeVietnamese()
- Include synced lyrics translations in LRC output

AiStateHolder.kt:
- Detect source language before AI translation using MultiLangRomanizer
- Support all newly detected scripts (Thai, Arabic, Greek, Hebrew, Vietnamese)
- Prefix translation prompt with detected language for better AI results
MissingDefaultResource (14): Create base values/plurals.xml with English defaults
  for all 14 plural names that only existed in values-ar/

NewApi (3): Annotate BlurEffectCache with @RequiresApi(31); guard
  ForegroundServiceStartNotAllowedException with SDK_INT >= S check

WrongConstant (1): Suppress lint on takePersistableUriPermission flags

NonObservableLocale (2): Suppress lint on Locale.getDefault() in composables

MissingIntentFilterForMediaSearch (1): Add MEDIA_PLAY_FROM_SEARCH intent-filter
  to MainActivity for Android Auto voice search support
- Add JAPANESE, TRADITIONAL_CHINESE, VIETNAMESE to AppLanguage enum
- Update locales_config.xml with all supported locales (de, en, es, fr, in, it, ja, ko, nb, ru, tr, vi, zh-CN, zh-TW)
- Add German translations for changelogs and settings
- Add Korean, Norwegian Bokmal, Russian translations for changelogs and settings
- Add Japanese strings_settings.xml update
SettingsCategory.kt:
- Add LYRICS category with QueueMusic icon between APPEARANCE and PLAYBACK
- Move EQUALIZER after PLAYBACK for better grouping
- Add DEVICE_CAPABILITIES after DEVELOPER

SettingsCategoryScreen.kt:
- Extract lyrics management (source priority, reset) into dedicated LYRICS section
- Extract lyrics display (immersive mode, auto-hide delay) into LYRICS section
- Keep PLAYBACK focused on playback-specific settings only
- Suppress NonObservableLocale in AI usage section

SettingsScreen.kt:
- Add color scheme for LYRICS category

FullPlayerContent.kt:
- Remove redundant resetLyricsSearchState() call when opening lyrics sheet
- Add --no-build-cache to all Gradle build steps for CI reproducibility
- Reorder CodeQL workflow steps: pin Kotlin version before Gradle setup
- Remove explicit maxHeapSize from app build.gradle.kts
- Remove kotlin and ksp version overrides from libs.versions.toml
AiPreferencesRepository.kt: Increase default AI max tokens from 4096 to 8192
LyricsStateHolder.kt: Fix lyrics loading priority - read local file and
  embedded lyrics before falling back to stored database lyrics
…lint baseline

- ServerUrlUtils.kt: URL utility for server configuration
- values-vi/ and values-zh-rTW/: Vietnamese and Traditional Chinese translation resources
- app/lint.xml: Lint baseline configuration file
dependabot Bot and others added 5 commits June 24, 2026 22:23
Bumps the github-actions group with 2 updates: [actions/checkout](https://github.com/actions/checkout) and [actions/cache](https://github.com/actions/cache).


Updates `actions/checkout` from 6 to 7
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v6...v7)

Updates `actions/cache` from 5 to 6
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](actions/cache@v5...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
- dependency-name: actions/cache
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Bumps the gradle-dependencies group with 2 updates: [gradle-wrapper](https://github.com/gradle/gradle) and [com.google.genai:google-genai](https://github.com/googleapis/java-genai).


Updates `gradle-wrapper` from 9.5.1 to 9.6.0
- [Release notes](https://github.com/gradle/gradle/releases)
- [Commits](gradle/gradle@v9.5.1...v9.6.0)

Updates `com.google.genai:google-genai` from 1.58.0 to 1.60.0
- [Release notes](https://github.com/googleapis/java-genai/releases)
- [Changelog](https://github.com/googleapis/java-genai/blob/main/CHANGELOG.md)
- [Commits](googleapis/java-genai@v1.58.0...v1.60.0)

---
updated-dependencies:
- dependency-name: gradle-wrapper
  dependency-version: 9.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: gradle-dependencies
- dependency-name: com.google.genai:google-genai
  dependency-version: 1.60.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: gradle-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
…/github-actions-02325a8da5

chore(deps): bump the github-actions group with 2 updates
…dependencies-4659e02046

chore(deps): bump the gradle-dependencies group with 2 updates
@daedaevibin daedaevibin marked this pull request as draft June 25, 2026 05:41
@daedaevibin

daedaevibin commented Jun 25, 2026

Copy link
Copy Markdown
Contributor Author

@theovilardo

Drafted


AI Errors arise after extended periods of time?
Investigating currently.


Results: Incapable of doing repair work at this time due to many at-home items occuring, including my Aunt's new baby!

Since I will be assisting with this child as she is a single mother, I have to relay my time to items of immediate concern, this includes my own physical health and similar items.

You may leave comments and or reviews on problematic items for me to see, I will review and correct any where possible as soon as I am available.

dependabot Bot and others added 10 commits June 26, 2026 22:28
…th 7 updates

Bumps the gradle-dependencies group with 7 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [gradle-wrapper](https://github.com/gradle/gradle) | `9.6.0` | `9.6.1` |
| [com.google.dagger:hilt-android](https://github.com/google/dagger) | `2.59.2` | `2.60` |
| [com.google.dagger:hilt-android-compiler](https://github.com/google/dagger) | `2.59.2` | `2.60` |
| [io.ktor:ktor-server-core-jvm](https://github.com/ktorio/ktor) | `3.5.0` | `3.5.1` |
| [io.ktor:ktor-server-netty-jvm](https://github.com/ktorio/ktor) | `3.5.0` | `3.5.1` |
| [io.ktor:ktor-server-cio-jvm](https://github.com/ktorio/ktor) | `3.5.0` | `3.5.1` |
| [com.google.dagger.hilt.android](https://github.com/google/dagger) | `2.59.2` | `2.60` |



Updates `gradle-wrapper` from 9.6.0 to 9.6.1
- [Release notes](https://github.com/gradle/gradle/releases)
- [Commits](gradle/gradle@v9.6.0...v9.6.1)

Updates `com.google.dagger:hilt-android` from 2.59.2 to 2.60
- [Release notes](https://github.com/google/dagger/releases)
- [Changelog](https://github.com/google/dagger/blob/master/CHANGELOG.md)
- [Commits](google/dagger@dagger-2.59.2...dagger-2.60)

Updates `com.google.dagger:hilt-android-compiler` from 2.59.2 to 2.60
- [Release notes](https://github.com/google/dagger/releases)
- [Changelog](https://github.com/google/dagger/blob/master/CHANGELOG.md)
- [Commits](google/dagger@dagger-2.59.2...dagger-2.60)

Updates `com.google.dagger:hilt-android-compiler` from 2.59.2 to 2.60
- [Release notes](https://github.com/google/dagger/releases)
- [Changelog](https://github.com/google/dagger/blob/master/CHANGELOG.md)
- [Commits](google/dagger@dagger-2.59.2...dagger-2.60)

Updates `io.ktor:ktor-server-core-jvm` from 3.5.0 to 3.5.1
- [Release notes](https://github.com/ktorio/ktor/releases)
- [Changelog](https://github.com/ktorio/ktor/blob/main/CHANGELOG.md)
- [Commits](ktorio/ktor@3.5.0...3.5.1)

Updates `io.ktor:ktor-server-netty-jvm` from 3.5.0 to 3.5.1
- [Release notes](https://github.com/ktorio/ktor/releases)
- [Changelog](https://github.com/ktorio/ktor/blob/main/CHANGELOG.md)
- [Commits](ktorio/ktor@3.5.0...3.5.1)

Updates `io.ktor:ktor-server-cio-jvm` from 3.5.0 to 3.5.1
- [Release notes](https://github.com/ktorio/ktor/releases)
- [Changelog](https://github.com/ktorio/ktor/blob/main/CHANGELOG.md)
- [Commits](ktorio/ktor@3.5.0...3.5.1)

Updates `io.ktor:ktor-server-netty-jvm` from 3.5.0 to 3.5.1
- [Release notes](https://github.com/ktorio/ktor/releases)
- [Changelog](https://github.com/ktorio/ktor/blob/main/CHANGELOG.md)
- [Commits](ktorio/ktor@3.5.0...3.5.1)

Updates `io.ktor:ktor-server-cio-jvm` from 3.5.0 to 3.5.1
- [Release notes](https://github.com/ktorio/ktor/releases)
- [Changelog](https://github.com/ktorio/ktor/blob/main/CHANGELOG.md)
- [Commits](ktorio/ktor@3.5.0...3.5.1)

Updates `com.google.dagger.hilt.android` from 2.59.2 to 2.60
- [Release notes](https://github.com/google/dagger/releases)
- [Changelog](https://github.com/google/dagger/blob/master/CHANGELOG.md)
- [Commits](google/dagger@dagger-2.59.2...dagger-2.60)

---
updated-dependencies:
- dependency-name: gradle-wrapper
  dependency-version: 9.6.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: com.google.dagger:hilt-android
  dependency-version: '2.60'
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: gradle-dependencies
- dependency-name: com.google.dagger:hilt-android-compiler
  dependency-version: '2.60'
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: gradle-dependencies
- dependency-name: com.google.dagger:hilt-android-compiler
  dependency-version: '2.60'
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: gradle-dependencies
- dependency-name: io.ktor:ktor-server-core-jvm
  dependency-version: 3.5.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: io.ktor:ktor-server-netty-jvm
  dependency-version: 3.5.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: io.ktor:ktor-server-cio-jvm
  dependency-version: 3.5.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: io.ktor:ktor-server-netty-jvm
  dependency-version: 3.5.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: io.ktor:ktor-server-cio-jvm
  dependency-version: 3.5.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: com.google.dagger.hilt.android
  dependency-version: '2.60'
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: gradle-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
…path

- Merge migrateTabOrder, ensureLibrarySortDefaults, and legacy favorite
  migration into a single deferred coroutine (2s delay)
- Defer loadPersistedDailyMix and loadSearchHistory to after first
  frame (1.5s delay)
- This prevents DataStore first() calls and DB queries from blocking
  the critical init path that feeds first-frame rendering
…storage

- Load songs first (most critical tab, needed for Songs tab rendering)
- Chain albums after songs, artists after albums, folders after artists
  using Job.join() to prevent 4 simultaneous Room queries from competing
  for limited I/O bandwidth on eMMC storage (Redmi)
- Reduces GC pressure from concurrent heap allocations
…om queries

- Replace songCountFlow (Room query) with allSongsFlow (in-memory)
- Now all 3 flows in the combine are in-memory StateFlows, not Room queries
- Eliminates redundant SELECT COUNT(*) query that re-emitted on every
  songs table write during sync
- Remove individual _isLoadingCategories toggles from albums and artists
  jobs (they no longer manage their own loading state)
- Add a single watcher coroutine that sets _isLoadingCategories = true
  when songs complete, then false when all sequential jobs finish
- Prevents 3 redundant recompositions of LibraryScreen through
  playerUiState during initial data load
- Library folders/loading combine: skip update when Triple unchanged
- Sort options combine: skip update when SortOptionsSnapshot unchanged
- AiUiSnapshot combine: skip update when snapshot unchanged
- Prevents cascading recompositions of LibraryScreen from redundant
  playerUiState emissions during multiple rapid state changes
…quests

- Add LYRICS to AiSystemPromptType enum
- Add LYRICS case to AiSystemPromptEngine.buildPrompt with role/strategy
- Update translateLyrics in AiStateHolder to use AiSystemPromptType.LYRICS
- Add 'Lyrics' display label to formatPromptType in AiUsageComponents
- Lyrics translation requests now appear distinctly in AI activity logs
… Parameters tab

- Add GENERATION_PARAMETERS category to SettingsCategory enum with Tune icon
- AI Integration tab now keeps only: provider selection, API key entry,
  model selection, base URL, and activity logs
- New Generation Parameters tab gets: system prompt editor, temperature,
  top P, top K, max tokens, presence/frequency penalty, sample size,
  digest mode, and extended song fields
- Add English string resources for the new category
…earch

- Add description field to AiProvider enum entries
- Create SearchableProviderSelector composable similar to
  SearchableModelSelector with search, filtering, and count label
- Replace ThemeSelectorItem in AI_INTEGRATION settings with
  SearchableProviderSelector for provider selection
- Search covers name, displayName, and description fields
- Update AI subtitle to reflect model selection and activity logs
- Add GENERATION_PARAMETERS category strings to all locales
- All new strings use English as fallback pending translator contributions
@VoidX3D

VoidX3D commented Jun 28, 2026

Copy link
Copy Markdown
Contributor

Just fixed most to all AI errors in #2497, your changes should work now!

…dependencies-0242c4ee8e

chore(deps): bump the gradle-dependencies group across 1 directory with 7 updates
@daedaevibin

Copy link
Copy Markdown
Contributor Author

Just fixed most to all AI errors in #2497, your changes should work now!

Shall I merge your PR into my fork and test or would you like another approach?

Any suggestions welcome, thanks! :)

- Increase toast buffer from 1 to 5 to prevent rapid status/error drops
- Add status display card to CreateAiPlaylistDialog showing real-time
  AI progress ("Analyzing...", "Selecting...", etc.)
- Pass aiStatus from LibraryScreen to CreateAiPlaylistDialog
- Fix missing import for RoundedCornerShape
@VoidX3D

VoidX3D commented Jun 28, 2026

Copy link
Copy Markdown
Contributor

yea i am still working on some final fixes so you can

@daedaevibin

daedaevibin commented Jun 28, 2026 via email

Copy link
Copy Markdown
Contributor Author

daedaevibin and others added 4 commits June 28, 2026 14:08
…layerUiState

- Expose searchResults, selectedSearchFilter, searchHistory directly
  from PlayerViewModel instead of deriving from 40-field playerUiState
- Defer genre loading to LaunchedEffect gated by showGenreBrowse,
  avoiding heavy SELECT DISTINCT genre query on every navigation
- Guard LaunchedEffect to skip performSearch for empty queries
- Remove unused SearchUiSlice wrapper and flow imports
…ault models

- Update AiProvider descriptions to reflect latest model families
- Ollama: change to requiresApiKey=true with configurable URL (cloud)
- DeepSeek: update endpoint to /v1, default deepseek-chat
- Groq: update default to llama-3.3-70b-versatile
- Mistral: update default to mistral-large-2411
- NVIDIA: update default to nemotron-70b-instruct
- Kimi: update default to moonshot-v1-auto
- GLM: update default to glm-4-plus
- OpenRouter: update default to gemini-2.5-flash-preview free
- Ollama: clear default URL (user configures their endpoint)
- Allow empty API key for providers with requiresApiKey=false
… cooldowns

- Replace mutableMapOf with ConcurrentHashMap for thread-safe cooldown tracking
- Clean up expired cooldown entries on each generateContent call to prevent
  stale entries accumulating over time and blocking all providers
- Reduce cooldown from 5 minutes to 2 minutes for faster recovery
- Skip API key check for providers that don't require one
@VoidX3D

VoidX3D commented Jun 28, 2026

Copy link
Copy Markdown
Contributor

hey btw @daedaevibin can you provide me with some logs and more info on the ai issues so i can check other stuff as well?

@daedaevibin

daedaevibin commented Jun 28, 2026

Copy link
Copy Markdown
Contributor Author

hey btw @daedaevibin can you provide me with some logs and more info on the ai issues so i can check other stuff as well?

Actually, those issues were noticed during normal usage after an extended period of time.

About three days later it started working, but the entire prompt response from the ai was being output where the lyrics go, including formatting markers like ** and similar. It was also being aggressively cut-off due to what looked like token or length limiting.

@VoidX3D

VoidX3D commented Jun 28, 2026

Copy link
Copy Markdown
Contributor

Oh then it should already fixed in the xml conversion for the new ai response handeler and token limiter. I have created a new class type promt for the ai lyrics so using that should resolve most of the issued you can analyze my code and update your lyrics part with it it should reslove all issues.

@VoidX3D

VoidX3D commented Jun 28, 2026

Copy link
Copy Markdown
Contributor

For the token system i have added a new Generation Parameters to combat the same issues for the other playlists where the responses was cut in half due to restraints

VoidX3D and others added 8 commits June 29, 2026 01:22
…and streamline base URL handling in settings
…lly scale maxTokens

- Enhanced AiResponseCleaner.cleanTextResponse to strip paired **text**/__text__ markers
- Strip conversational framing lines prepended by AI (Here is, Sure!, etc.)
- Apply cleaning in AiStateHolder.translateLyrics before returning response
- Dynamically scale maxTokens for LYRICS type based on input size (2x+ output, 4096 min, 16384 max)
- Prevents aggressive cut-off and formatting markers in AI-translated lyrics
Bumps the gradle-dependencies group with 6 updates:

| Package | From | To |
| --- | --- | --- |
| [org.junit.platform:junit-platform-launcher](https://github.com/junit-team/junit-framework) | `6.1.0` | `6.1.1` |
| [org.junit.jupiter:junit-jupiter-api](https://github.com/junit-team/junit-framework) | `6.1.0` | `6.1.1` |
| [org.junit.jupiter:junit-jupiter-engine](https://github.com/junit-team/junit-framework) | `6.1.0` | `6.1.1` |
| [org.junit.vintage:junit-vintage-engine](https://github.com/junit-team/junit-framework) | `6.1.0` | `6.1.1` |
| [com.google.errorprone:error_prone_annotations](https://github.com/google/error-prone) | `2.36.0` | `2.50.0` |
| [org.junit.jupiter:junit-jupiter-params](https://github.com/junit-team/junit-framework) | `6.1.0` | `6.1.1` |


Updates `org.junit.platform:junit-platform-launcher` from 6.1.0 to 6.1.1
- [Release notes](https://github.com/junit-team/junit-framework/releases)
- [Commits](junit-team/junit-framework@r6.1.0...r6.1.1)

Updates `org.junit.jupiter:junit-jupiter-api` from 6.1.0 to 6.1.1
- [Release notes](https://github.com/junit-team/junit-framework/releases)
- [Commits](junit-team/junit-framework@r6.1.0...r6.1.1)

Updates `org.junit.jupiter:junit-jupiter-engine` from 6.1.0 to 6.1.1
- [Release notes](https://github.com/junit-team/junit-framework/releases)
- [Commits](junit-team/junit-framework@r6.1.0...r6.1.1)

Updates `org.junit.vintage:junit-vintage-engine` from 6.1.0 to 6.1.1
- [Release notes](https://github.com/junit-team/junit-framework/releases)
- [Commits](junit-team/junit-framework@r6.1.0...r6.1.1)

Updates `com.google.errorprone:error_prone_annotations` from 2.36.0 to 2.50.0
- [Release notes](https://github.com/google/error-prone/releases)
- [Commits](google/error-prone@v2.36.0...v2.50.0)

Updates `org.junit.jupiter:junit-jupiter-params` from 6.1.0 to 6.1.1
- [Release notes](https://github.com/junit-team/junit-framework/releases)
- [Commits](junit-team/junit-framework@r6.1.0...r6.1.1)

Updates `org.junit.jupiter:junit-jupiter-api` from 6.1.0 to 6.1.1
- [Release notes](https://github.com/junit-team/junit-framework/releases)
- [Commits](junit-team/junit-framework@r6.1.0...r6.1.1)

Updates `org.junit.jupiter:junit-jupiter-engine` from 6.1.0 to 6.1.1
- [Release notes](https://github.com/junit-team/junit-framework/releases)
- [Commits](junit-team/junit-framework@r6.1.0...r6.1.1)

Updates `org.junit.vintage:junit-vintage-engine` from 6.1.0 to 6.1.1
- [Release notes](https://github.com/junit-team/junit-framework/releases)
- [Commits](junit-team/junit-framework@r6.1.0...r6.1.1)

---
updated-dependencies:
- dependency-name: org.junit.platform:junit-platform-launcher
  dependency-version: 6.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: org.junit.jupiter:junit-jupiter-api
  dependency-version: 6.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: org.junit.jupiter:junit-jupiter-engine
  dependency-version: 6.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: org.junit.vintage:junit-vintage-engine
  dependency-version: 6.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: com.google.errorprone:error_prone_annotations
  dependency-version: 2.50.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: gradle-dependencies
- dependency-name: org.junit.jupiter:junit-jupiter-params
  dependency-version: 6.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: org.junit.jupiter:junit-jupiter-api
  dependency-version: 6.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: org.junit.jupiter:junit-jupiter-engine
  dependency-version: 6.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: org.junit.vintage:junit-vintage-engine
  dependency-version: 6.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
…dependencies-8e3801c0aa

chore(deps): bump the gradle-dependencies group with 6 updates
…th 22 updates

Bumps the gradle-dependencies group with 22 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| androidx.compose.ui:ui-text-google-fonts | `1.11.3` | `1.11.4` |
| androidx.compose.ui:ui | `1.11.3` | `1.11.4` |
| androidx.compose.ui:ui-graphics | `1.11.3` | `1.11.4` |
| androidx.compose.ui:ui-tooling | `1.11.3` | `1.11.4` |
| androidx.compose.ui:ui-tooling-preview | `1.11.3` | `1.11.4` |
| androidx.compose.ui:ui-test-manifest | `1.11.3` | `1.11.4` |
| androidx.compose.ui:ui-test-junit4 | `1.11.3` | `1.11.4` |
| androidx.compose.animation:animation | `1.11.3` | `1.11.4` |
| androidx.compose.foundation:foundation | `1.11.3` | `1.11.4` |
| androidx.glance:glance | `1.3.0-alpha01` | `1.3.0-alpha02` |
| androidx.glance:glance-appwidget | `1.3.0-alpha01` | `1.3.0-alpha02` |
| androidx.glance:glance-material3 | `1.3.0-alpha01` | `1.3.0-alpha02` |
| androidx.hilt:hilt-lifecycle-viewmodel-compose | `1.3.0` | `1.4.0` |
| androidx.hilt:hilt-navigation-compose | `1.3.0` | `1.4.0` |
| androidx.hilt:hilt-work | `1.3.0` | `1.4.0` |
| androidx.hilt:hilt-compiler | `1.3.0` | `1.4.0` |
| androidx.compose:compose-bom | `2026.06.00` | `2026.06.01` |
| [org.jetbrains.kotlinx:kotlinx-collections-immutable](https://github.com/Kotlin/kotlinx.collections.immutable) | `0.5.0` | `0.5.1` |
| androidx.compose.material3:material3 | `1.5.0-alpha22` | `1.5.0-alpha23` |
| [org.checkerframework:checker-qual](https://github.com/typetools/checker-framework) | `4.2.0` | `4.2.1` |
| androidx.test.uiautomator:uiautomator | `2.3.0` | `2.4.0` |
| androidx.baselineprofile | `1.5.0-alpha06` | `1.5.0-alpha07` |



Updates `androidx.compose.ui:ui-text-google-fonts` from 1.11.3 to 1.11.4

Updates `androidx.compose.ui:ui` from 1.11.3 to 1.11.4

Updates `androidx.compose.ui:ui-graphics` from 1.11.3 to 1.11.4

Updates `androidx.compose.ui:ui-tooling` from 1.11.3 to 1.11.4

Updates `androidx.compose.ui:ui-tooling-preview` from 1.11.3 to 1.11.4

Updates `androidx.compose.ui:ui-test-manifest` from 1.11.3 to 1.11.4

Updates `androidx.compose.ui:ui-test-junit4` from 1.11.3 to 1.11.4

Updates `androidx.compose.animation:animation` from 1.11.3 to 1.11.4

Updates `androidx.compose.foundation:foundation` from 1.11.3 to 1.11.4

Updates `androidx.glance:glance` from 1.3.0-alpha01 to 1.3.0-alpha02

Updates `androidx.glance:glance-appwidget` from 1.3.0-alpha01 to 1.3.0-alpha02

Updates `androidx.glance:glance-material3` from 1.3.0-alpha01 to 1.3.0-alpha02

Updates `androidx.glance:glance-appwidget` from 1.3.0-alpha01 to 1.3.0-alpha02

Updates `androidx.glance:glance-material3` from 1.3.0-alpha01 to 1.3.0-alpha02

Updates `androidx.hilt:hilt-lifecycle-viewmodel-compose` from 1.3.0 to 1.4.0

Updates `androidx.hilt:hilt-navigation-compose` from 1.3.0 to 1.4.0

Updates `androidx.hilt:hilt-work` from 1.3.0 to 1.4.0

Updates `androidx.hilt:hilt-compiler` from 1.3.0 to 1.4.0

Updates `androidx.hilt:hilt-navigation-compose` from 1.3.0 to 1.4.0

Updates `androidx.hilt:hilt-work` from 1.3.0 to 1.4.0

Updates `androidx.hilt:hilt-compiler` from 1.3.0 to 1.4.0

Updates `androidx.compose:compose-bom` from 2026.06.00 to 2026.06.01

Updates `androidx.compose.ui:ui` from 1.11.3 to 1.11.4

Updates `androidx.compose.ui:ui-graphics` from 1.11.3 to 1.11.4

Updates `androidx.compose.ui:ui-tooling` from 1.11.3 to 1.11.4

Updates `androidx.compose.ui:ui-tooling-preview` from 1.11.3 to 1.11.4

Updates `androidx.compose.ui:ui-test-manifest` from 1.11.3 to 1.11.4

Updates `androidx.compose.ui:ui-test-junit4` from 1.11.3 to 1.11.4

Updates `org.jetbrains.kotlinx:kotlinx-collections-immutable` from 0.5.0 to 0.5.1
- [Release notes](https://github.com/Kotlin/kotlinx.collections.immutable/releases)
- [Changelog](https://github.com/Kotlin/kotlinx.collections.immutable/blob/master/CHANGELOG.md)
- [Commits](Kotlin/kotlinx.collections.immutable@v0.5.0...v0.5.1)

Updates `androidx.compose.material3:material3` from 1.5.0-alpha22 to 1.5.0-alpha23

Updates `org.checkerframework:checker-qual` from 4.2.0 to 4.2.1
- [Release notes](https://github.com/typetools/checker-framework/releases)
- [Changelog](https://github.com/typetools/checker-framework/blob/master/docs/CHANGELOG.md)
- [Commits](typetools/checker-framework@checker-framework-4.2.0...checker-framework-4.2.1)

Updates `androidx.test.uiautomator:uiautomator` from 2.3.0 to 2.4.0

Updates `androidx.baselineprofile` from 1.5.0-alpha06 to 1.5.0-alpha07

---
updated-dependencies:
- dependency-name: androidx.compose.ui:ui-text-google-fonts
  dependency-version: 1.11.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: androidx.compose.ui:ui
  dependency-version: 1.11.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: androidx.compose.ui:ui-graphics
  dependency-version: 1.11.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: androidx.compose.ui:ui-tooling
  dependency-version: 1.11.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: androidx.compose.ui:ui-tooling-preview
  dependency-version: 1.11.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: androidx.compose.ui:ui-test-manifest
  dependency-version: 1.11.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: androidx.compose.ui:ui-test-junit4
  dependency-version: 1.11.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: androidx.compose.animation:animation
  dependency-version: 1.11.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: androidx.compose.foundation:foundation
  dependency-version: 1.11.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: androidx.glance:glance
  dependency-version: 1.3.0-alpha02
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: androidx.glance:glance-appwidget
  dependency-version: 1.3.0-alpha02
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: androidx.glance:glance-material3
  dependency-version: 1.3.0-alpha02
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: androidx.glance:glance-appwidget
  dependency-version: 1.3.0-alpha02
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: androidx.glance:glance-material3
  dependency-version: 1.3.0-alpha02
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: androidx.hilt:hilt-lifecycle-viewmodel-compose
  dependency-version: 1.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: gradle-dependencies
- dependency-name: androidx.hilt:hilt-navigation-compose
  dependency-version: 1.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: gradle-dependencies
- dependency-name: androidx.hilt:hilt-work
  dependency-version: 1.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: gradle-dependencies
- dependency-name: androidx.hilt:hilt-compiler
  dependency-version: 1.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: gradle-dependencies
- dependency-name: androidx.hilt:hilt-navigation-compose
  dependency-version: 1.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: gradle-dependencies
- dependency-name: androidx.hilt:hilt-work
  dependency-version: 1.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: gradle-dependencies
- dependency-name: androidx.hilt:hilt-compiler
  dependency-version: 1.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: gradle-dependencies
- dependency-name: androidx.compose:compose-bom
  dependency-version: 2026.06.01
  dependency-type: direct:production
  dependency-group: gradle-dependencies
- dependency-name: androidx.compose.ui:ui
  dependency-version: 1.11.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: androidx.compose.ui:ui-graphics
  dependency-version: 1.11.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: androidx.compose.ui:ui-tooling
  dependency-version: 1.11.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: androidx.compose.ui:ui-tooling-preview
  dependency-version: 1.11.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: androidx.compose.ui:ui-test-manifest
  dependency-version: 1.11.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: androidx.compose.ui:ui-test-junit4
  dependency-version: 1.11.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: org.jetbrains.kotlinx:kotlinx-collections-immutable
  dependency-version: 0.5.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: androidx.compose.material3:material3
  dependency-version: 1.5.0-alpha23
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: org.checkerframework:checker-qual
  dependency-version: 4.2.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
- dependency-name: androidx.test.uiautomator:uiautomator
  dependency-version: 2.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: gradle-dependencies
- dependency-name: androidx.baselineprofile
  dependency-version: 1.5.0-alpha07
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gradle-dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
@daedaevibin

Copy link
Copy Markdown
Contributor Author

@theovilardo
@VoidX3D

PR Updated, check main description message. (Will be working to close issues i have opened on my fork to cover additional items, you may check as required.)

@daedaevibin daedaevibin marked this pull request as ready for review July 5, 2026 21:36
@VoidX3D

VoidX3D commented Jul 6, 2026

Copy link
Copy Markdown
Contributor

Yes everything looks fine. I'll do some testing after I have time .

…og stuck, non-Latin search

- Increase lyrics translation token cap from 16384 to 32768
- Use 3x output estimation (original+translation per line)
- Expand CJK detection to include Thai, Arabic, Greek, Hebrew, Hindi, Punjabi
- Remove false 'already translated' guard that checked stale UI state
- Reorder lyrics source priority: local file > embedded > DB > song.lyrics
- Close lyrics search dialog on Success (sync searchUiState with dialog visibility)
- Add romanized artist search strategies for non-Latin scripts
- Improve translation prompt to handle both synced and plain (unsynced) lyrics
- Fix fetchFromRemote missing return@withContext for exact-match
- Fix bulk LRC scanner to use Unicode-aware regex
- Fix thinking model detection false positives
- Add AI response cache cleanup (7-day TTL)
- Consolidate duplicate model filtering (UnifiedModelFilter)
- Move Gemini API key from URL query param to HTTP header
- Remove dead code (countTokens, duplicate clearAll, FQN imports)
…duplication

#58: Shared OkHttpClient singleton for AI clients
- Added @AiOkHttpClient qualifier in Qualifiers.kt
- Provided shared OkHttpClient in AppModule.kt with 30s/60s/30s timeouts
- Injected into AiClientFactory and passed to GeminiAiClient/GenericOpenAiClient
- Removed per-client OkHttpClient creation from GeminiAiClient and GenericOpenAiClient
- Connection pool is now reused across all AI client instances

#64: Fix high-res FLAC metadata write skipping
- Changed updateFileMetadataWithTagLib to return false for problematic FLAC
  instead of true (was silently succeeding without writing)
- Added FLAC verification after JAudioTagger commit to detect failed writes
- Falls back to TagLib if JAudioTagger fails on FLAC files

#67: Extract hardcoded provider labels, deduplicate sections
- AiClientFactory now uses provider.displayName instead of hardcoded strings
- Removed 80+ lines of dead per-provider StateFlows from SettingsViewModel
- Removed dead per-provider system prompt change/reset functions
- Removed dead per-provider model change functions
…ode quality improvements

- Fix LyricsRepositoryImpl: Song.id.toLong() → toLongOrNull() with guards
  for non-numeric IDs (Telegram, Netease, GDrive sources)
- Fix return type mismatch in scanAndAssignLocalLrcFiles
- Remove dead favorites operations from MusicDao and UserPreferencesRepository
  (favorites now managed via FavoritesDao with SQL triggers)
- Extract duplicated AiUsageReportSection composable in SettingsCategoryScreen
- Hoist 9 inline collectAsStateWithLifecycle calls in Generation Parameters
- SearchScreen: derive selectedSongIds/selectedPlaylistIds from remembered sets
  instead of separate Flow collections; pass isShuffleEnabled as param
- SongEntity: toLongOrNull() with explicit exception for invalid IDs
- SongRemovalStateHolder: guard non-numeric Song.id on delete
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants