- кнопка распознавания в плеере: видна только на музыкальных станциях без
метаданных эфира (track == null), показывает спиннер и результат через Toast
- распознанный трек отображается в плеере и пишется в ОТДЕЛЬНУЮ историю
распознанных (не дублируется в историю эфирных треков — гейт по ключу)
- экран Истории: переключатель «Треки эфира | Распознанные», два списка
- Room: таблица recognized_track (миграция 7→8), DAO/репозиторий
- ShazamRepository → POST /shazam/recognize/{stationId}, маппинг 503/400 в текст
- MusicGenres.isMusicStation — клиентский гейт (синхронизирован с бэкендом)
- bump backend submodule (модуль shazam)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
113 lines
3.9 KiB
Kotlin
113 lines
3.9 KiB
Kotlin
package com.radiola.data.local
|
|
|
|
import androidx.room.Database
|
|
import androidx.room.RoomDatabase
|
|
import androidx.room.migration.Migration
|
|
import androidx.sqlite.db.SupportSQLiteDatabase
|
|
import com.radiola.data.local.dao.AlarmDao
|
|
import com.radiola.data.local.dao.RecognizedTrackDao
|
|
import com.radiola.data.local.dao.RecordingDao
|
|
import com.radiola.data.local.dao.StationDao
|
|
import com.radiola.data.local.dao.TagDao
|
|
import com.radiola.data.local.dao.TrackHistoryDao
|
|
import com.radiola.data.local.entity.AlarmEntity
|
|
import com.radiola.data.local.entity.RecognizedTrackEntity
|
|
import com.radiola.data.local.entity.RecordingEntity
|
|
import com.radiola.data.local.entity.StationEntity
|
|
import com.radiola.data.local.entity.TagEntity
|
|
import com.radiola.data.local.entity.TrackHistoryEntity
|
|
|
|
val MIGRATION_1_2 = object : Migration(1, 2) {
|
|
override fun migrate(database: SupportSQLiteDatabase) {
|
|
database.execSQL("CREATE TABLE IF NOT EXISTS tags (name TEXT PRIMARY KEY NOT NULL)")
|
|
}
|
|
}
|
|
|
|
val MIGRATION_2_3 = object : Migration(2, 3) {
|
|
override fun migrate(database: SupportSQLiteDatabase) {
|
|
database.execSQL("ALTER TABLE stations ADD COLUMN source TEXT NOT NULL DEFAULT 'record'")
|
|
}
|
|
}
|
|
|
|
val MIGRATION_3_4 = object : Migration(3, 4) {
|
|
override fun migrate(database: SupportSQLiteDatabase) {
|
|
database.execSQL(
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS recordings (
|
|
id INTEGER PRIMARY KEY NOT NULL,
|
|
stationName TEXT NOT NULL,
|
|
stationId INTEGER NOT NULL,
|
|
filePath TEXT NOT NULL,
|
|
startTime INTEGER NOT NULL,
|
|
endTime INTEGER,
|
|
trackName TEXT,
|
|
duration INTEGER
|
|
)
|
|
""".trimIndent()
|
|
)
|
|
}
|
|
}
|
|
|
|
val MIGRATION_4_5 = object : Migration(4, 5) {
|
|
override fun migrate(database: SupportSQLiteDatabase) {
|
|
database.execSQL("ALTER TABLE stations ADD COLUMN qualities TEXT NOT NULL DEFAULT ''")
|
|
}
|
|
}
|
|
|
|
val MIGRATION_5_6 = object : Migration(5, 6) {
|
|
override fun migrate(database: SupportSQLiteDatabase) {
|
|
database.execSQL("ALTER TABLE recordings ADD COLUMN markers TEXT NOT NULL DEFAULT ''")
|
|
}
|
|
}
|
|
|
|
// Добавляем таблицу будильников
|
|
val MIGRATION_6_7 = object : Migration(6, 7) {
|
|
override fun migrate(database: SupportSQLiteDatabase) {
|
|
database.execSQL(
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS alarms (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
|
hour INTEGER NOT NULL,
|
|
minute INTEGER NOT NULL,
|
|
daysMask INTEGER NOT NULL,
|
|
stationId INTEGER NOT NULL,
|
|
stationName TEXT NOT NULL,
|
|
enabled INTEGER NOT NULL,
|
|
fadeInSec INTEGER NOT NULL
|
|
)
|
|
""".trimIndent()
|
|
)
|
|
}
|
|
}
|
|
|
|
// Добавляем таблицу истории распознанных треков (Shazam)
|
|
val MIGRATION_7_8 = object : Migration(7, 8) {
|
|
override fun migrate(database: SupportSQLiteDatabase) {
|
|
database.execSQL(
|
|
"""
|
|
CREATE TABLE IF NOT EXISTS recognized_track (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
|
|
artist TEXT NOT NULL,
|
|
song TEXT NOT NULL,
|
|
stationName TEXT NOT NULL,
|
|
coverUrl TEXT,
|
|
timestamp INTEGER NOT NULL
|
|
)
|
|
""".trimIndent()
|
|
)
|
|
}
|
|
}
|
|
|
|
@Database(
|
|
entities = [StationEntity::class, TrackHistoryEntity::class, TagEntity::class, RecordingEntity::class, AlarmEntity::class, RecognizedTrackEntity::class],
|
|
version = 8
|
|
)
|
|
abstract class AppDatabase : RoomDatabase() {
|
|
abstract fun stationDao(): StationDao
|
|
abstract fun trackHistoryDao(): TrackHistoryDao
|
|
abstract fun tagDao(): TagDao
|
|
abstract fun recordingDao(): RecordingDao
|
|
abstract fun alarmDao(): AlarmDao
|
|
abstract fun recognizedTrackDao(): RecognizedTrackDao
|
|
}
|