music: move sort name number handling to setting

Make the numeric sort name handling added prior dependent on a new
"Intelligent Sorting" setting that also controls the article checks.

This kind of behavior might not be desirable in all cases, and it makes
the setting more consistent anyway.
This commit is contained in:
Alexander Capehart 2023-03-23 17:40:44 -06:00
parent 97b63992b5
commit 7c0b73b699
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
25 changed files with 66 additions and 61 deletions

View file

@ -21,6 +21,9 @@ deletion
- Fix "format" not appearing in song properties view
- Fix visual bugs when editing duplicate songs in the queue
#### What's Changed
- "Ignore articles when sorting" is now "Intelligent sorting"
## 3.0.3
#### What's New

View file

@ -85,7 +85,7 @@ sealed interface Music : Item {
* A unique identifier for a piece of music.
*
* [UID] enables a much cheaper and more reliable form of differentiating music, derived from
* either a hash of meaningful metadata or the MusicBrainz ID spec. Using this enables several
* either internal app information or the MusicBrainz ID spec. Using this enables several
* improvements to music management in this app, including:
* - Proper differentiation of identical music. It's common for large, well-tagged libraries to
* have functionally duplicate items that are differentiated with MusicBrainz IDs, and so
@ -355,7 +355,7 @@ class SortName(name: String, musicSettings: MusicSettings) : Comparable<SortName
init {
var sortName = name
if (musicSettings.automaticSortNames) {
if (musicSettings.intelligentSorting) {
sortName =
sortName.run {
when {
@ -365,23 +365,24 @@ class SortName(name: String, musicSettings: MusicSettings) : Comparable<SortName
else -> this
}
}
}
// Parse out numeric portions of the title and use those for sorting, if applicable.
val numericEnd = sortName.indexOfFirst { !it.isDigit() }
when (numericEnd) {
// No numeric component.
0 -> number = null
// Whole title is numeric.
-1 -> {
number = sortName.toIntOrNull()
sortName = ""
}
// Part of the title is numeric.
else -> {
number = sortName.slice(0 until numericEnd).toIntOrNull()
sortName = sortName.slice(numericEnd until sortName.length)
// Parse out numeric portions of the title and use those for sorting, if applicable.
when (val numericEnd = sortName.indexOfFirst { !it.isDigit() }) {
// No numeric component.
0 -> number = null
// Whole title is numeric.
-1 -> {
number = sortName.toIntOrNull()
sortName = ""
}
// Part of the title is numeric.
else -> {
number = sortName.slice(0 until numericEnd).toIntOrNull()
sortName = sortName.slice(numericEnd until sortName.length)
}
}
} else {
number = null
}
collationKey = COLLATOR.getCollationKey(sortName)

View file

@ -44,8 +44,8 @@ interface MusicSettings : Settings<MusicSettings.Listener> {
val shouldBeObserving: Boolean
/** A [String] of characters representing the desired characters to denote multi-value tags. */
var multiValueSeparators: String
/** Whether to trim english articles with song sort names. */
val automaticSortNames: Boolean
/** Whether to enable more advanced sorting by articles and numbers. */
val intelligentSorting: Boolean
// TODO: Move sort settings to list module
/** The [Sort] mode used in [Song] lists. */
var songSort: Sort
@ -115,7 +115,7 @@ class MusicSettingsImpl @Inject constructor(@ApplicationContext context: Context
}
}
override val automaticSortNames: Boolean
override val intelligentSorting: Boolean
get() = sharedPreferences.getBoolean(getString(R.string.set_key_auto_sort_names), true)
override var songSort: Sort

View file

@ -483,6 +483,7 @@ class GenreImpl(
* @return A new [Music.UID] of Auxio format whose [UUID] was derived from the SHA-256 hash of the
* metadata given.
*/
@VisibleForTesting
fun createHashedUid(mode: MusicMode, updates: MessageDigest.() -> Unit): Music.UID {
val digest =
MessageDigest.getInstance("SHA-256").run {

View file

@ -267,8 +267,8 @@
<string name="set_playback">Прайграванне</string>
<string name="lbl_ep_live">Канцэртны міні-альбом</string>
<string name="lbl_ep_remix">Міні-альбом рэміксаў</string>
<string name="set_auto_sort_names_desc">Ігнараваць такія словы, як \"the\", пры сартаванні па імені (лепш за ўсё працуе з англамоўнай музыкай)</string>
<string name="set_auto_sort_names">Ігнараваць артыклі пры сартаванні</string>
<string name="set_intelligent_sorting_desc">Ігнараваць такія словы, як \"the\", пры сартаванні па імені (лепш за ўсё працуе з англамоўнай музыкай)</string>
<string name="set_intelligent_sorting">Ігнараваць артыклі пры сартаванні</string>
<string name="lbl_eps">Міні-альбомы</string>
<string name="lbl_ep">Міні-альбом</string>
</resources>

View file

@ -280,6 +280,6 @@
<string name="set_library">Knihovna</string>
<string name="set_state">Perzistence</string>
<string name="lbl_sort_dec">Sestupně</string>
<string name="set_auto_sort_names">Při řazení ignorovat předložky</string>
<string name="set_auto_sort_names_desc">Ignorovat slova jako „the“ při řazení podle názvu (funguje nejlépe u hudby v angličtině)</string>
<string name="set_intelligent_sorting">Při řazení ignorovat předložky</string>
<string name="set_intelligent_sorting_desc">Ignorovat slova jako „the“ při řazení podle názvu (funguje nejlépe u hudby v angličtině)</string>
</resources>

View file

@ -271,6 +271,6 @@
<string name="set_state">Persistenz</string>
<string name="set_replay_gain">Lautstärkeanpassung ReplayGain</string>
<string name="lbl_sort_dec">Absteigend</string>
<string name="set_auto_sort_names">Artikel beim Sortieren ignorieren</string>
<string name="set_auto_sort_names_desc">Wörter wie „the“ ignorieren (funktioniert am besten mit englischsprachiger Musik)</string>
<string name="set_intelligent_sorting">Artikel beim Sortieren ignorieren</string>
<string name="set_intelligent_sorting_desc">Wörter wie „the“ ignorieren (funktioniert am besten mit englischsprachiger Musik)</string>
</resources>

View file

@ -275,6 +275,6 @@
<string name="set_personalize_desc">Personalizar los controles y el comportamiento de la interfaz de usuario</string>
<string name="set_library">Biblioteca</string>
<string name="lbl_sort_dec">Descendente</string>
<string name="set_auto_sort_names">Ignorar artículos al ordenar</string>
<string name="set_auto_sort_names_desc">Ignorar palabras como \"the\" al ordenar por nombre (funciona mejor con música en inglés)</string>
<string name="set_intelligent_sorting">Ignorar artículos al ordenar</string>
<string name="set_intelligent_sorting_desc">Ignorar palabras como \"the\" al ordenar por nombre (funciona mejor con música en inglés)</string>
</resources>

View file

@ -145,7 +145,7 @@
<string name="set_separators_comma">Coma (,)</string>
<string name="set_separators_semicolon">Punto e coma (;)</string>
<string name="set_hide_collaborators_desc">Mostrar só artistas que estean directamente acreditados nun álbum (funciona mellos en bibliotecas ben etiquetadas)</string>
<string name="set_auto_sort_names">Ignorar artigos ao ordenar</string>
<string name="set_intelligent_sorting">Ignorar artigos ao ordenar</string>
<string name="set_hide_collaborators">Agochar colaboradores</string>
<string name="set_images">Imaxes</string>
<string name="set_cover_mode">Portadas de álbums</string>
@ -241,7 +241,7 @@
<item quantity="other">%d artistas</item>
</plurals>
<string name="set_separators_plus">Máis (+)</string>
<string name="set_auto_sort_names_desc">Ignorar palabras como \"the\" ao ordenar por nome (funciona mellor con música en inglés)</string>
<string name="set_intelligent_sorting_desc">Ignorar palabras como \"the\" ao ordenar por nome (funciona mellor con música en inglés)</string>
<string name="set_dirs_mode">Modo</string>
<string name="set_dirs_desc">Xestionar dende onde se carga a música</string>
<string name="set_repeat_pause_desc">Pausar cando se repite unha canción</string>

View file

@ -275,6 +275,6 @@
<string name="set_personalize_desc">Personalizza controlli e comportamento dell\'UI</string>
<string name="set_audio_desc">Configura comportamento di suono e riproduzione</string>
<string name="lbl_sort_dec">Discendente</string>
<string name="set_auto_sort_names">Ignora gli articoli durante l\'ordinamento</string>
<string name="set_auto_sort_names_desc">Ignora parole come \"the\" durante l\'ordinamento per nome (funziona meglio con la musica in lingua inglese)</string>
<string name="set_intelligent_sorting">Ignora gli articoli durante l\'ordinamento</string>
<string name="set_intelligent_sorting_desc">Ignora parole come \"the\" durante l\'ordinamento per nome (funziona meglio con la musica in lingua inglese)</string>
</resources>

View file

@ -149,7 +149,7 @@
<string name="set_separators_slash">קו נטוי (/)</string>
<string name="set_separators_warning">אזהרה: השימוש בהגדרה זו עלול לגרום לחלק מהתגיות להיות מפורשות באופן שגוי כבעלות מספר ערכים. ניתן לפתור זאת על ידי הכנסת קו נטוי אחורי (\\) לפני תווים מפרידים לא רצויים.</string>
<string name="set_cover_mode_quality">איכות גבוהה</string>
<string name="set_auto_sort_names_desc">התעלמ~י ממילים כמו \"The\" (\"ה-\") בעת סידור על פי שם (עובד באופן הכי טוב עם מוזיקה בשפה האנגלית)</string>
<string name="set_intelligent_sorting_desc">התעלמ~י ממילים כמו \"The\" (\"ה-\") בעת סידור על פי שם (עובד באופן הכי טוב עם מוזיקה בשפה האנגלית)</string>
<string name="set_images">תמונות</string>
<string name="set_audio_desc">התאמ~י התנהגות צליל והשמעה</string>
<string name="set_headset_autoplay_desc">התחל~י לנגן תמיד ברגע שמחוברות אוזניות (עלול לא לעבוד בכל המערכות)</string>

View file

@ -242,8 +242,8 @@
<string name="set_dirs_mode">モード</string>
<string name="set_separators_desc">複数のタグ値を表す文字を構成する</string>
<string name="set_bar_action">カスタム再生バー アクション</string>
<string name="set_auto_sort_names">ソート時に記事を無視する</string>
<string name="set_auto_sort_names_desc">名前で並べ替えるときに「the」などの単語を無視する (英語の音楽に最適)</string>
<string name="set_intelligent_sorting">ソート時に記事を無視する</string>
<string name="set_intelligent_sorting_desc">名前で並べ替えるときに「the」などの単語を無視する (英語の音楽に最適)</string>
<string name="set_cover_mode_media_store">初期 (高速読み込み)</string>
<string name="set_replay_gain_mode_dynamic">再生中の場合はアルバムを優先</string>
<string name="set_separators">複数値セパレータ</string>

View file

@ -271,6 +271,6 @@
<string name="set_behavior">동작</string>
<string name="set_personalize_desc">UI 제어 및 동작 커스텀</string>
<string name="lbl_sort_dec">내림차순</string>
<string name="set_auto_sort_names">정렬할 때 기사 무시</string>
<string name="set_auto_sort_names_desc">이름으로 정렬할 때 \"the\"와 같은 단어 무시(영어 음악에서 가장 잘 작동함)</string>
<string name="set_intelligent_sorting">정렬할 때 기사 무시</string>
<string name="set_intelligent_sorting_desc">이름으로 정렬할 때 \"the\"와 같은 단어 무시(영어 음악에서 가장 잘 작동함)</string>
</resources>

View file

@ -269,6 +269,6 @@
<string name="set_dirs_list">Aplankalai</string>
<string name="set_state">Atkaklumas</string>
<string name="lbl_sort_dec">Mažėjantis</string>
<string name="set_auto_sort_names_desc">Ignoruoti tokius žodžius kaip „the“, kai rūšiuojama pagal pavadinimą (geriausiai veikia su anglų kalbos muzika)</string>
<string name="set_auto_sort_names">Ignoruoti straipsnius rūšiuojant</string>
<string name="set_intelligent_sorting_desc">Ignoruoti tokius žodžius kaip „the“, kai rūšiuojama pagal pavadinimą (geriausiai veikia su anglų kalbos muzika)</string>
<string name="set_intelligent_sorting">Ignoruoti straipsnius rūšiuojant</string>
</resources>

View file

@ -276,6 +276,6 @@
<string name="err_did_not_wipe">Nie można wyczyścić stanu odtwarzania</string>
<string name="err_did_not_save">Nie można zapisać stanu odtwarzania</string>
<string name="lbl_sort_dec">Malejąco</string>
<string name="set_auto_sort_names">Ignoruj rodzajniki podczas sortowania</string>
<string name="set_auto_sort_names_desc">Ignoruj słowa takie jak „the” podczas sortowania według tytułu (działa najlepiej z tytułami w języku angielskim)</string>
<string name="set_intelligent_sorting">Ignoruj rodzajniki podczas sortowania</string>
<string name="set_intelligent_sorting_desc">Ignoruj słowa takie jak „the” podczas sortowania według tytułu (działa najlepiej z tytułami w języku angielskim)</string>
</resources>

View file

@ -273,6 +273,6 @@
<string name="set_behavior">Comportamento</string>
<string name="set_dirs_list">Pastas</string>
<string name="lbl_sort_dec">Descendente</string>
<string name="set_auto_sort_names">Ignorar artigos ao classificar</string>
<string name="set_auto_sort_names_desc">Ignore palavras como \"the\" ao classificar por nome (funciona melhor com músicas em inglês)</string>
<string name="set_intelligent_sorting">Ignorar artigos ao classificar</string>
<string name="set_intelligent_sorting_desc">Ignore palavras como \"the\" ao classificar por nome (funciona melhor com músicas em inglês)</string>
</resources>

View file

@ -273,6 +273,6 @@
<string name="set_state">Estado de reprodução</string>
<string name="set_separators_and">E comercial (&amp;)</string>
<string name="set_behavior">Comportamento</string>
<string name="set_auto_sort_names">Ignorar artigos ao classificar</string>
<string name="set_auto_sort_names_desc">Ignore palavras como \"the\" ao classificar por nome (funciona melhor com músicas em inglês)</string>
<string name="set_intelligent_sorting">Ignorar artigos ao classificar</string>
<string name="set_intelligent_sorting_desc">Ignore palavras como \"the\" ao classificar por nome (funciona melhor com músicas em inglês)</string>
</resources>

View file

@ -278,6 +278,6 @@
<string name="set_dirs_list">Папки</string>
<string name="set_state">Состояние воспроизведения</string>
<string name="lbl_sort_dec">По убыванию</string>
<string name="set_auto_sort_names">Игнорировать артикли при сортировке</string>
<string name="set_auto_sort_names_desc">Игнорировать такие слова, как «the», при сортировке по имени (лучше всего работает с англоязычной музыкой)</string>
<string name="set_intelligent_sorting">Игнорировать артикли при сортировке</string>
<string name="set_intelligent_sorting_desc">Игнорировать такие слова, как «the», при сортировке по имени (лучше всего работает с англоязычной музыкой)</string>
</resources>

View file

@ -269,6 +269,6 @@
<string name="set_personalize_desc">Arayüz kontrollerini ve davranışını özelleştirin</string>
<string name="set_behavior">Davranış</string>
<string name="set_replay_gain">Ses yüksekliği dengesi ReplayGain</string>
<string name="set_auto_sort_names">Sıralama yaparken makaleleri yoksay</string>
<string name="set_auto_sort_names_desc">Ada göre sıralarken \"the\" gibi kelimeleri yok sayın (en iyi ingilizce müzikle çalışır)</string>
<string name="set_intelligent_sorting">Sıralama yaparken makaleleri yoksay</string>
<string name="set_intelligent_sorting_desc">Ada göre sıralarken \"the\" gibi kelimeleri yok sayın (en iyi ingilizce müzikle çalışır)</string>
</resources>

View file

@ -275,6 +275,6 @@
<string name="set_audio_desc">Налаштування звуку і поведінки при відтворенні</string>
<string name="set_dirs_list">Папки</string>
<string name="lbl_sort_dec">За спаданням</string>
<string name="set_auto_sort_names">Ігнорувати артиклі під час сортування</string>
<string name="set_auto_sort_names_desc">Ігнорування таких слів, як \"the\", під час сортування за назвою (найкраще працює з англомовною музикою)</string>
<string name="set_intelligent_sorting">Ігнорувати артиклі під час сортування</string>
<string name="set_intelligent_sorting_desc">Ігнорування таких слів, як \"the\", під час сортування за назвою (найкраще працює з англомовною музикою)</string>
</resources>

View file

@ -269,6 +269,6 @@
<string name="set_music">音乐</string>
<string name="set_audio_desc">配置声音和播放行为</string>
<string name="lbl_sort_dec">降序</string>
<string name="set_auto_sort_names">排序时忽略冠词</string>
<string name="set_auto_sort_names_desc">按名称排序时忽略类似“the”这样的冠词对英文歌曲的效果最好</string>
<string name="set_intelligent_sorting">排序时忽略冠词</string>
<string name="set_intelligent_sorting_desc">按名称排序时忽略类似“the”这样的冠词对英文歌曲的效果最好</string>
</resources>

View file

@ -216,8 +216,8 @@
<string name="set_separators_plus">Plus (+)</string>
<string name="set_separators_and">Ampersand (&amp;)</string>
<string name="set_separators_warning">Warning: Using this setting may result in some tags being incorrectly interpreted as having multiple values. You can resolve this by prefixing unwanted separator characters with a backslash (\\).</string>
<string name="set_auto_sort_names">Ignore articles when sorting</string>
<string name="set_auto_sort_names_desc">Ignore words like \"the\" when sorting by name (works best with english-language music)</string>
<string name="set_intelligent_sorting">Intelligent sorting</string>
<string name="set_intelligent_sorting_desc">Correctly sort names that begin with numbers or words like \"the\" (works best with english-language music)</string>
<string name="set_hide_collaborators">Hide collaborators</string>
<string name="set_hide_collaborators_desc">Only show artists that are directly credited on an album (works best on well-tagged libraries)</string>
<string name="set_images">Images</string>

View file

@ -23,8 +23,8 @@
<SwitchPreferenceCompat
app:defaultValue="true"
app:key="@string/set_key_auto_sort_names"
app:summary="@string/set_auto_sort_names_desc"
app:title="@string/set_auto_sort_names" />
app:summary="@string/set_intelligent_sorting_desc"
app:title="@string/set_intelligent_sorting" />
<SwitchPreferenceCompat
app:defaultValue="false"

View file

@ -34,7 +34,7 @@ open class FakeMusicSettings : MusicSettings {
override var multiValueSeparators: String
get() = throw NotImplementedError()
set(_) = throw NotImplementedError()
override val automaticSortNames: Boolean
override val intelligentSorting: Boolean
get() = throw NotImplementedError()
override var songSort: Sort
get() = throw NotImplementedError()

View file

@ -1,6 +1,6 @@
/*
* Copyright (c) 2023 Auxio Project
* RawMusicTest.kt is part of Auxio.
* DeviceMusicImplTest.kt is part of Auxio.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -26,11 +26,11 @@ import org.oxycblt.auxio.music.Music
import org.oxycblt.auxio.music.MusicMode
import org.oxycblt.auxio.music.metadata.Date
class RawMusicTest {
class DeviceMusicImplTest {
@Test
fun musicUid_auxio() {
val uid =
Music.UID.auxio(MusicMode.SONGS) {
createHashedUid(MusicMode.SONGS) {
update("Wheel")
update(listOf("Parannoul", "Asian Glow"))
update("Paraglow")