mirror of
https://github.com/advplyr/audiobookshelf-app.git
synced 2026-08-09 13:28:43 +02:00
Compare commits
23
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
75627ea40f | ||
|
|
0fa04d7d9a | ||
|
|
1e76ebe075 | ||
|
|
965da2fee3 | ||
|
|
b03f59ace3 | ||
|
|
79c7244b24 | ||
|
|
0843be3f4e | ||
|
|
6911f368e5 | ||
|
|
42167ea738 | ||
|
|
1c57d3506a | ||
|
|
8adc6fae4c | ||
|
|
e9746577ba | ||
|
|
9f68730622 | ||
|
|
f019b67b0c | ||
|
|
0f650c0572 | ||
|
|
dfc77ea0d0 | ||
|
|
67f514524f | ||
|
|
d97c6a0872 | ||
|
|
e7ad62760f | ||
|
|
fd34ea8124 | ||
|
|
5db94bf5b8 | ||
|
|
796d6d79d4 | ||
|
|
03aafafe1c |
@@ -36,8 +36,8 @@ android {
|
|||||||
applicationId "com.audiobookshelf.app"
|
applicationId "com.audiobookshelf.app"
|
||||||
minSdkVersion rootProject.ext.minSdkVersion
|
minSdkVersion rootProject.ext.minSdkVersion
|
||||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||||
versionCode 111
|
versionCode 112
|
||||||
versionName "0.9.80-beta"
|
versionName "0.9.81-beta"
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
manifestPlaceholders = [
|
manifestPlaceholders = [
|
||||||
"appAuthRedirectScheme": "com.audiobookshelf.app"
|
"appAuthRedirectScheme": "com.audiobookshelf.app"
|
||||||
|
|||||||
@@ -135,6 +135,7 @@ data class DeviceSettings(
|
|||||||
var sleepTimerLength: Long, // Time in milliseconds
|
var sleepTimerLength: Long, // Time in milliseconds
|
||||||
var disableSleepTimerFadeOut: Boolean,
|
var disableSleepTimerFadeOut: Boolean,
|
||||||
var disableSleepTimerResetFeedback: Boolean,
|
var disableSleepTimerResetFeedback: Boolean,
|
||||||
|
var enableSleepTimerAlmostDoneChime: Boolean,
|
||||||
var languageCode: String,
|
var languageCode: String,
|
||||||
var downloadUsingCellular: DownloadUsingCellularSetting,
|
var downloadUsingCellular: DownloadUsingCellularSetting,
|
||||||
var streamingUsingCellular: StreamingUsingCellularSetting,
|
var streamingUsingCellular: StreamingUsingCellularSetting,
|
||||||
@@ -163,6 +164,7 @@ data class DeviceSettings(
|
|||||||
autoSleepTimerAutoRewindTime = 300000L, // 5 minutes
|
autoSleepTimerAutoRewindTime = 300000L, // 5 minutes
|
||||||
disableSleepTimerFadeOut = false,
|
disableSleepTimerFadeOut = false,
|
||||||
disableSleepTimerResetFeedback = false,
|
disableSleepTimerResetFeedback = false,
|
||||||
|
enableSleepTimerAlmostDoneChime = false,
|
||||||
languageCode = "en-us",
|
languageCode = "en-us",
|
||||||
downloadUsingCellular = DownloadUsingCellularSetting.ALWAYS,
|
downloadUsingCellular = DownloadUsingCellularSetting.ALWAYS,
|
||||||
streamingUsingCellular = StreamingUsingCellularSetting.ALWAYS,
|
streamingUsingCellular = StreamingUsingCellularSetting.ALWAYS,
|
||||||
@@ -188,9 +190,9 @@ data class DeviceSettings(
|
|||||||
|
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
fun getShakeThresholdGravity() : Float { // Used in ShakeDetector
|
fun getShakeThresholdGravity() : Float { // Used in ShakeDetector
|
||||||
return if (shakeSensitivity == ShakeSensitivitySetting.VERY_HIGH) 1.2f
|
return if (shakeSensitivity == ShakeSensitivitySetting.VERY_HIGH) 1.1f
|
||||||
else if (shakeSensitivity == ShakeSensitivitySetting.HIGH) 1.4f
|
else if (shakeSensitivity == ShakeSensitivitySetting.HIGH) 1.3f
|
||||||
else if (shakeSensitivity == ShakeSensitivitySetting.MEDIUM) 1.6f
|
else if (shakeSensitivity == ShakeSensitivitySetting.MEDIUM) 1.5f
|
||||||
else if (shakeSensitivity == ShakeSensitivitySetting.LOW) 2f
|
else if (shakeSensitivity == ShakeSensitivitySetting.LOW) 2f
|
||||||
else if (shakeSensitivity == ShakeSensitivitySetting.VERY_LOW) 2.7f
|
else if (shakeSensitivity == ShakeSensitivitySetting.VERY_LOW) 2.7f
|
||||||
else {
|
else {
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ object DeviceManager {
|
|||||||
|
|
||||||
val serverConnectionConfigId get() = serverConnectionConfig?.id ?: ""
|
val serverConnectionConfigId get() = serverConnectionConfig?.id ?: ""
|
||||||
val serverConnectionConfigName get() = serverConnectionConfig?.name ?: ""
|
val serverConnectionConfigName get() = serverConnectionConfig?.name ?: ""
|
||||||
|
val serverConnectionConfigString get() = serverConnectionConfig?.name ?: "No server connection"
|
||||||
val serverAddress
|
val serverAddress
|
||||||
get() = serverConnectionConfig?.address ?: ""
|
get() = serverConnectionConfig?.address ?: ""
|
||||||
val serverUserId
|
val serverUserId
|
||||||
@@ -63,6 +64,10 @@ object DeviceManager {
|
|||||||
if (deviceData.deviceSettings?.autoSleepTimerAutoRewindTime == null) {
|
if (deviceData.deviceSettings?.autoSleepTimerAutoRewindTime == null) {
|
||||||
deviceData.deviceSettings?.autoSleepTimerAutoRewindTime = 300000L // 5 minutes
|
deviceData.deviceSettings?.autoSleepTimerAutoRewindTime = 300000L // 5 minutes
|
||||||
}
|
}
|
||||||
|
// Initialize sleep timer almost done chime added in v0.9.81
|
||||||
|
if (deviceData.deviceSettings?.enableSleepTimerAlmostDoneChime == null) {
|
||||||
|
deviceData.deviceSettings?.enableSleepTimerAlmostDoneChime = false
|
||||||
|
}
|
||||||
|
|
||||||
// Language added in v0.9.69
|
// Language added in v0.9.69
|
||||||
if (deviceData.deviceSettings?.languageCode == null) {
|
if (deviceData.deviceSettings?.languageCode == null) {
|
||||||
|
|||||||
+1
-1
@@ -29,7 +29,7 @@ class InternalDownloadManager(
|
|||||||
*/
|
*/
|
||||||
@Throws(IOException::class)
|
@Throws(IOException::class)
|
||||||
fun download(url: String) {
|
fun download(url: String) {
|
||||||
val request: Request = Request.Builder().url(url).build()
|
val request: Request = Request.Builder().url(url).addHeader("Accept-Encoding", "identity").build()
|
||||||
client.newCall(request)
|
client.newCall(request)
|
||||||
.enqueue(
|
.enqueue(
|
||||||
object : Callback {
|
object : Callback {
|
||||||
|
|||||||
@@ -1,15 +1,20 @@
|
|||||||
package com.audiobookshelf.app.managers
|
package com.audiobookshelf.app.managers
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.media.MediaPlayer
|
||||||
import android.os.*
|
import android.os.*
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
|
import com.audiobookshelf.app.R
|
||||||
import com.audiobookshelf.app.device.DeviceManager
|
import com.audiobookshelf.app.device.DeviceManager
|
||||||
import com.audiobookshelf.app.player.PlayerNotificationService
|
import com.audiobookshelf.app.player.PlayerNotificationService
|
||||||
import com.audiobookshelf.app.player.SLEEP_TIMER_WAKE_UP_EXPIRATION
|
import com.audiobookshelf.app.player.SLEEP_TIMER_WAKE_UP_EXPIRATION
|
||||||
|
import com.audiobookshelf.app.plugins.AbsLogger
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import kotlin.concurrent.schedule
|
import kotlin.concurrent.schedule
|
||||||
import kotlin.math.roundToInt
|
import kotlin.math.roundToInt
|
||||||
|
|
||||||
|
const val SLEEP_TIMER_CHIME_SOUND_VOLUME = 0.7f
|
||||||
|
|
||||||
class SleepTimerManager
|
class SleepTimerManager
|
||||||
constructor(private val playerNotificationService: PlayerNotificationService) {
|
constructor(private val playerNotificationService: PlayerNotificationService) {
|
||||||
private val tag = "SleepTimerManager"
|
private val tag = "SleepTimerManager"
|
||||||
@@ -156,6 +161,10 @@ constructor(private val playerNotificationService: PlayerNotificationService) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sleepTimeSecondsRemaining == 30 && sleepTimerElapsed > 1 && DeviceManager.deviceData.deviceSettings?.enableSleepTimerAlmostDoneChime == true) {
|
||||||
|
playChimeSound()
|
||||||
|
}
|
||||||
|
|
||||||
if (sleepTimeSecondsRemaining <= 0) {
|
if (sleepTimeSecondsRemaining <= 0) {
|
||||||
Log.d(tag, "Sleep Timer Pausing Player on Chapter")
|
Log.d(tag, "Sleep Timer Pausing Player on Chapter")
|
||||||
pause()
|
pause()
|
||||||
@@ -263,6 +272,18 @@ constructor(private val playerNotificationService: PlayerNotificationService) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Plays chime sound */
|
||||||
|
private fun playChimeSound() {
|
||||||
|
AbsLogger.info(tag, "playChimeSound: Playing sleep timer chime sound")
|
||||||
|
val ctx = playerNotificationService.getContext()
|
||||||
|
val mediaPlayer = MediaPlayer.create(ctx, R.raw.bell)
|
||||||
|
mediaPlayer.setVolume(SLEEP_TIMER_CHIME_SOUND_VOLUME, SLEEP_TIMER_CHIME_SOUND_VOLUME)
|
||||||
|
mediaPlayer.start()
|
||||||
|
mediaPlayer.setOnCompletionListener {
|
||||||
|
mediaPlayer.release()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the chapter end time for use in End of Chapter timers. If less than 10 seconds remain in
|
* Gets the chapter end time for use in End of Chapter timers. If less than 10 seconds remain in
|
||||||
* the chapter, then use the next chapter.
|
* the chapter, then use the next chapter.
|
||||||
|
|||||||
@@ -136,7 +136,6 @@ class MediaManager(private var apiHandler: ApiHandler, var ctx: Context) {
|
|||||||
val serverConnConfig = if (DeviceManager.isConnectedToServer) DeviceManager.serverConnectionConfig else DeviceManager.deviceData.getLastServerConnectionConfig()
|
val serverConnConfig = if (DeviceManager.isConnectedToServer) DeviceManager.serverConnectionConfig else DeviceManager.deviceData.getLastServerConnectionConfig()
|
||||||
|
|
||||||
if (!DeviceManager.isConnectedToServer || !DeviceManager.checkConnectivity(ctx) || serverConnConfig == null || serverConnConfig.id !== serverConfigIdUsed) {
|
if (!DeviceManager.isConnectedToServer || !DeviceManager.checkConnectivity(ctx) || serverConnConfig == null || serverConnConfig.id !== serverConfigIdUsed) {
|
||||||
Log.d(tag, "Reset caches")
|
|
||||||
podcastEpisodeLibraryItemMap = mutableMapOf()
|
podcastEpisodeLibraryItemMap = mutableMapOf()
|
||||||
serverLibraries = listOf()
|
serverLibraries = listOf()
|
||||||
serverLibraryItems = mutableListOf()
|
serverLibraryItems = mutableListOf()
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import android.net.Uri
|
|||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.provider.MediaStore
|
import android.provider.MediaStore
|
||||||
import android.support.v4.media.session.MediaControllerCompat
|
import android.support.v4.media.session.MediaControllerCompat
|
||||||
import android.util.Log
|
|
||||||
import com.audiobookshelf.app.BuildConfig
|
import com.audiobookshelf.app.BuildConfig
|
||||||
import com.audiobookshelf.app.R
|
import com.audiobookshelf.app.R
|
||||||
import com.bumptech.glide.Glide
|
import com.bumptech.glide.Glide
|
||||||
@@ -41,7 +40,6 @@ class AbMediaDescriptionAdapter constructor(private val controller: MediaControl
|
|||||||
// Cache the bitmap for the current audiobook so that successive calls to
|
// Cache the bitmap for the current audiobook so that successive calls to
|
||||||
// `getCurrentLargeIcon` don't cause the bitmap to be recreated.
|
// `getCurrentLargeIcon` don't cause the bitmap to be recreated.
|
||||||
currentIconUri = albumArtUri
|
currentIconUri = albumArtUri
|
||||||
Log.d(tag, "ART $currentIconUri")
|
|
||||||
|
|
||||||
if (currentIconUri.toString().startsWith("content://")) {
|
if (currentIconUri.toString().startsWith("content://")) {
|
||||||
currentBitmap = if (Build.VERSION.SDK_INT < 28) {
|
currentBitmap = if (Build.VERSION.SDK_INT < 28) {
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import android.util.Log
|
|||||||
import android.view.KeyEvent
|
import android.view.KeyEvent
|
||||||
import com.audiobookshelf.app.data.LibraryItemWrapper
|
import com.audiobookshelf.app.data.LibraryItemWrapper
|
||||||
import com.audiobookshelf.app.data.PodcastEpisode
|
import com.audiobookshelf.app.data.PodcastEpisode
|
||||||
import com.audiobookshelf.app.device.DeviceManager
|
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import kotlin.concurrent.schedule
|
import kotlin.concurrent.schedule
|
||||||
|
|
||||||
|
|||||||
+20
-28
@@ -4,14 +4,11 @@ import android.annotation.SuppressLint
|
|||||||
import android.app.*
|
import android.app.*
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.graphics.Bitmap
|
|
||||||
import android.graphics.Color
|
import android.graphics.Color
|
||||||
import android.graphics.ImageDecoder
|
|
||||||
import android.hardware.Sensor
|
import android.hardware.Sensor
|
||||||
import android.hardware.SensorManager
|
import android.hardware.SensorManager
|
||||||
import android.net.*
|
import android.net.*
|
||||||
import android.os.*
|
import android.os.*
|
||||||
import android.provider.MediaStore
|
|
||||||
import android.provider.Settings
|
import android.provider.Settings
|
||||||
import android.support.v4.media.MediaBrowserCompat
|
import android.support.v4.media.MediaBrowserCompat
|
||||||
import android.support.v4.media.MediaDescriptionCompat
|
import android.support.v4.media.MediaDescriptionCompat
|
||||||
@@ -311,19 +308,6 @@ class PlayerNotificationService : MediaBrowserServiceCompat() {
|
|||||||
|
|
||||||
val coverUri = currentPlaybackSession!!.getCoverUri(ctx)
|
val coverUri = currentPlaybackSession!!.getCoverUri(ctx)
|
||||||
|
|
||||||
var bitmap: Bitmap? = null
|
|
||||||
// Local covers get bitmap
|
|
||||||
if (currentPlaybackSession!!.localLibraryItem?.coverContentUrl != null) {
|
|
||||||
bitmap =
|
|
||||||
if (Build.VERSION.SDK_INT < 28) {
|
|
||||||
MediaStore.Images.Media.getBitmap(ctx.contentResolver, coverUri)
|
|
||||||
} else {
|
|
||||||
val source: ImageDecoder.Source =
|
|
||||||
ImageDecoder.createSource(ctx.contentResolver, coverUri)
|
|
||||||
ImageDecoder.decodeBitmap(source)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fix for local images crashing on Android 11 for specific devices
|
// Fix for local images crashing on Android 11 for specific devices
|
||||||
// https://stackoverflow.com/questions/64186578/android-11-mediastyle-notification-crash/64232958#64232958
|
// https://stackoverflow.com/questions/64186578/android-11-mediastyle-notification-crash/64232958#64232958
|
||||||
try {
|
try {
|
||||||
@@ -347,8 +331,7 @@ class PlayerNotificationService : MediaBrowserServiceCompat() {
|
|||||||
.setExtras(extra)
|
.setExtras(extra)
|
||||||
.setTitle(currentPlaybackSession!!.displayTitle)
|
.setTitle(currentPlaybackSession!!.displayTitle)
|
||||||
|
|
||||||
bitmap?.let { mediaDescriptionBuilder.setIconBitmap(it) }
|
mediaDescriptionBuilder.setIconUri(coverUri)
|
||||||
?: mediaDescriptionBuilder.setIconUri(coverUri)
|
|
||||||
|
|
||||||
return mediaDescriptionBuilder.build()
|
return mediaDescriptionBuilder.build()
|
||||||
}
|
}
|
||||||
@@ -1106,11 +1089,12 @@ class PlayerNotificationService : MediaBrowserServiceCompat() {
|
|||||||
// No further calls will be made to other media browsing methods.
|
// No further calls will be made to other media browsing methods.
|
||||||
null
|
null
|
||||||
} else {
|
} else {
|
||||||
Log.d(tag, "Android Auto starting $clientPackageName $clientUid")
|
AbsLogger.info(tag, "onGetRoot: clientPackageName: $clientPackageName, clientUid: $clientUid")
|
||||||
isStarted = true
|
isStarted = true
|
||||||
|
|
||||||
// Reset cache if no longer connected to server or server changed
|
// Reset cache if no longer connected to server or server changed
|
||||||
if (mediaManager.checkResetServerItems()) {
|
if (mediaManager.checkResetServerItems()) {
|
||||||
|
AbsLogger.info(tag, "onGetRoot: Reset Android Auto server items cache (${DeviceManager.serverConnectionConfigString})")
|
||||||
forceReloadingAndroidAuto = true
|
forceReloadingAndroidAuto = true
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1135,7 +1119,7 @@ class PlayerNotificationService : MediaBrowserServiceCompat() {
|
|||||||
parentMediaId: String,
|
parentMediaId: String,
|
||||||
result: Result<MutableList<MediaBrowserCompat.MediaItem>>
|
result: Result<MutableList<MediaBrowserCompat.MediaItem>>
|
||||||
) {
|
) {
|
||||||
Log.d(tag, "ON LOAD CHILDREN $parentMediaId")
|
AbsLogger.info(tag, "onLoadChildren: parentMediaId: $parentMediaId (${DeviceManager.serverConnectionConfigString})")
|
||||||
|
|
||||||
result.detach()
|
result.detach()
|
||||||
|
|
||||||
@@ -1146,7 +1130,6 @@ class PlayerNotificationService : MediaBrowserServiceCompat() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (parentMediaId == DOWNLOADS_ROOT) { // Load downloads
|
if (parentMediaId == DOWNLOADS_ROOT) { // Load downloads
|
||||||
|
|
||||||
val localBooks = DeviceManager.dbManager.getLocalLibraryItems("book")
|
val localBooks = DeviceManager.dbManager.getLocalLibraryItems("book")
|
||||||
val localPodcasts = DeviceManager.dbManager.getLocalLibraryItems("podcast")
|
val localPodcasts = DeviceManager.dbManager.getLocalLibraryItems("podcast")
|
||||||
val localBrowseItems: MutableList<MediaBrowserCompat.MediaItem> = mutableListOf()
|
val localBrowseItems: MutableList<MediaBrowserCompat.MediaItem> = mutableListOf()
|
||||||
@@ -1243,8 +1226,10 @@ class PlayerNotificationService : MediaBrowserServiceCompat() {
|
|||||||
Log.d(tag, "Trying to initialize browseTree.")
|
Log.d(tag, "Trying to initialize browseTree.")
|
||||||
if (!this::browseTree.isInitialized || forceReloadingAndroidAuto) {
|
if (!this::browseTree.isInitialized || forceReloadingAndroidAuto) {
|
||||||
forceReloadingAndroidAuto = false
|
forceReloadingAndroidAuto = false
|
||||||
|
AbsLogger.info(tag, "onLoadChildren: Loading Android Auto items")
|
||||||
mediaManager.loadAndroidAutoItems {
|
mediaManager.loadAndroidAutoItems {
|
||||||
Log.d(tag, "android auto loaded. Starting browseTree initialize")
|
AbsLogger.info(tag, "onLoadChildren: Loaded Android Auto data, initializing browseTree")
|
||||||
|
|
||||||
browseTree =
|
browseTree =
|
||||||
BrowseTree(
|
BrowseTree(
|
||||||
this,
|
this,
|
||||||
@@ -1260,15 +1245,21 @@ class PlayerNotificationService : MediaBrowserServiceCompat() {
|
|||||||
MediaBrowserCompat.MediaItem.FLAG_BROWSABLE
|
MediaBrowserCompat.MediaItem.FLAG_BROWSABLE
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
Log.d(tag, "browseTree initialize and android auto loaded")
|
|
||||||
result.sendResult(children as MutableList<MediaBrowserCompat.MediaItem>?)
|
result.sendResult(children as MutableList<MediaBrowserCompat.MediaItem>?)
|
||||||
firstLoadDone = true
|
firstLoadDone = true
|
||||||
if (mediaManager.serverLibraries.isNotEmpty()) {
|
if (mediaManager.serverLibraries.isNotEmpty()) {
|
||||||
Log.d(tag, "Starting personalization fetch")
|
AbsLogger.info(tag, "onLoadChildren: Android Auto fetching personalized data for all libraries")
|
||||||
mediaManager.populatePersonalizedDataForAllLibraries { notifyChildrenChanged("/") }
|
mediaManager.populatePersonalizedDataForAllLibraries {
|
||||||
|
AbsLogger.info(tag, "onLoadChildren: Android Auto loaded personalized data for all libraries")
|
||||||
|
notifyChildrenChanged("/")
|
||||||
|
}
|
||||||
|
|
||||||
Log.d(tag, "Initialize inprogress items")
|
AbsLogger.info(tag, "onLoadChildren: Android Auto fetching in progress items")
|
||||||
mediaManager.initializeInProgressItems { notifyChildrenChanged("/") }
|
mediaManager.initializeInProgressItems {
|
||||||
|
AbsLogger.info(tag, "onLoadChildren: Android Auto loaded in progress items")
|
||||||
|
notifyChildrenChanged("/")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -1288,7 +1279,8 @@ class PlayerNotificationService : MediaBrowserServiceCompat() {
|
|||||||
MediaBrowserCompat.MediaItem.FLAG_BROWSABLE
|
MediaBrowserCompat.MediaItem.FLAG_BROWSABLE
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
Log.d(tag, "browseTree initialize and android auto loaded")
|
|
||||||
|
AbsLogger.info(tag, "onLoadChildren: Android auto data loaded")
|
||||||
result.sendResult(children as MutableList<MediaBrowserCompat.MediaItem>?)
|
result.sendResult(children as MutableList<MediaBrowserCompat.MediaItem>?)
|
||||||
}
|
}
|
||||||
} else if (parentMediaId == LIBRARIES_ROOT || parentMediaId == RECENTLY_ROOT) {
|
} else if (parentMediaId == LIBRARIES_ROOT || parentMediaId == RECENTLY_ROOT) {
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import android.hardware.SensorEvent
|
|||||||
import android.hardware.SensorEventListener
|
import android.hardware.SensorEventListener
|
||||||
import android.hardware.SensorManager
|
import android.hardware.SensorManager
|
||||||
import com.audiobookshelf.app.device.DeviceManager
|
import com.audiobookshelf.app.device.DeviceManager
|
||||||
|
import com.audiobookshelf.app.plugins.AbsLogger
|
||||||
import kotlin.math.sqrt
|
import kotlin.math.sqrt
|
||||||
|
|
||||||
class ShakeDetector : SensorEventListener {
|
class ShakeDetector : SensorEventListener {
|
||||||
@@ -46,6 +47,7 @@ class ShakeDetector : SensorEventListener {
|
|||||||
if (mShakeTimestamp + SHAKE_COUNT_RESET_TIME_MS < now) {
|
if (mShakeTimestamp + SHAKE_COUNT_RESET_TIME_MS < now) {
|
||||||
mShakeCount = 0
|
mShakeCount = 0
|
||||||
}
|
}
|
||||||
|
AbsLogger.info("ShakeDetector", "Device shake above threshold ($gForce > $shakeThreshold)")
|
||||||
mShakeTimestamp = now
|
mShakeTimestamp = now
|
||||||
mShakeCount++
|
mShakeCount++
|
||||||
mListener!!.onShake(mShakeCount)
|
mListener!!.onShake(mShakeCount)
|
||||||
|
|||||||
@@ -29,16 +29,16 @@ class AbsLogger : Plugin() {
|
|||||||
onLogEmitter = { log:AbsLog ->
|
onLogEmitter = { log:AbsLog ->
|
||||||
notifyListeners("onLog", JSObject(jacksonMapper.writeValueAsString(log)))
|
notifyListeners("onLog", JSObject(jacksonMapper.writeValueAsString(log)))
|
||||||
}
|
}
|
||||||
Log.i("AbsLogger", "Initialize AbsLogger plugin")
|
info("AbsLogger", "load: AbsLogger plugin initialized")
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
lateinit var onLogEmitter:(log:AbsLog) -> Unit
|
var onLogEmitter:((log:AbsLog) -> Unit)? = null
|
||||||
|
|
||||||
fun log(level:String, tag:String, message:String) {
|
fun log(level:String, tag:String, message:String) {
|
||||||
val absLog = AbsLog(id = UUID.randomUUID().toString(), tag, level, message, timestamp = System.currentTimeMillis())
|
val absLog = AbsLog(id = UUID.randomUUID().toString(), tag, level, message, timestamp = System.currentTimeMillis())
|
||||||
DeviceManager.dbManager.saveLog(absLog)
|
DeviceManager.dbManager.saveLog(absLog)
|
||||||
onLogEmitter(absLog)
|
onLogEmitter?.let { it(absLog) }
|
||||||
}
|
}
|
||||||
fun info(tag:String, message:String) {
|
fun info(tag:String, message:String) {
|
||||||
Log.i("AbsLogger", message)
|
Log.i("AbsLogger", message)
|
||||||
|
|||||||
Binary file not shown.
@@ -14,7 +14,7 @@ ext {
|
|||||||
androidx_core_ktx_version = '1.16.0'
|
androidx_core_ktx_version = '1.16.0'
|
||||||
androidx_media_version = '1.7.0'
|
androidx_media_version = '1.7.0'
|
||||||
exoplayer_version = '2.18.7'
|
exoplayer_version = '2.18.7'
|
||||||
glide_version = '4.11.0'
|
glide_version = '4.16.0'
|
||||||
junit_version = '4.13.2'
|
junit_version = '4.13.2'
|
||||||
kotlin_version = '2.1.0'
|
kotlin_version = '2.1.0'
|
||||||
kotlin_coroutines_version = '1.10.1'
|
kotlin_coroutines_version = '1.10.1'
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<a v-if="showBack" @click="back" class="rounded-full h-10 w-10 flex items-center justify-center mr-2 cursor-pointer">
|
<a v-if="showBack" @click="back" class="rounded-full h-10 w-10 flex items-center justify-center mr-2 cursor-pointer">
|
||||||
<span class="material-symbols text-3xl text-fg">arrow_back</span>
|
<span class="material-symbols text-3xl text-fg">arrow_back</span>
|
||||||
</a>
|
</a>
|
||||||
<div v-if="user && currentLibrary && socketConnected">
|
<div v-if="user && currentLibrary">
|
||||||
<div class="pl-1.5 pr-2.5 py-2 bg-bg bg-opacity-30 rounded-md flex items-center" @click="clickShowLibraryModal">
|
<div class="pl-1.5 pr-2.5 py-2 bg-bg bg-opacity-30 rounded-md flex items-center" @click="clickShowLibraryModal">
|
||||||
<ui-library-icon :icon="currentLibraryIcon" :size="4" font-size="base" />
|
<ui-library-icon :icon="currentLibraryIcon" :size="4" font-size="base" />
|
||||||
<p class="text-sm leading-4 ml-2 mt-0.5 max-w-24 truncate">{{ currentLibraryName }}</p>
|
<p class="text-sm leading-4 ml-2 mt-0.5 max-w-24 truncate">{{ currentLibraryName }}</p>
|
||||||
@@ -56,9 +56,6 @@ export default {
|
|||||||
this.$store.commit('setCastAvailable', val)
|
this.$store.commit('setCastAvailable', val)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
socketConnected() {
|
|
||||||
return this.$store.state.socketConnected
|
|
||||||
},
|
|
||||||
currentLibrary() {
|
currentLibrary() {
|
||||||
return this.$store.getters['libraries/getCurrentLibrary']
|
return this.$store.getters['libraries/getCurrentLibrary']
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -77,12 +77,12 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Series sequence -->
|
<!-- Series sequence -->
|
||||||
<div v-if="seriesSequence && showSequence && !isSelectionMode" class="absolute rounded-lg bg-black bg-opacity-90 box-shadow-md z-10" :style="{ top: 0.375 * sizeMultiplier + 'rem', right: 0.375 * sizeMultiplier + 'rem', padding: `${0.1 * sizeMultiplier}rem ${0.25 * sizeMultiplier}rem` }">
|
<div v-if="seriesSequence && showSequence && !isSelectionMode" class="absolute rounded-lg bg-black/90 text-white box-shadow-md z-10" :style="{ top: 0.375 * sizeMultiplier + 'rem', right: 0.375 * sizeMultiplier + 'rem', padding: `${0.1 * sizeMultiplier}rem ${0.25 * sizeMultiplier}rem` }">
|
||||||
<p :style="{ fontSize: sizeMultiplier * 0.8 + 'rem' }">#{{ seriesSequence }}</p>
|
<p :style="{ fontSize: sizeMultiplier * 0.8 + 'rem' }">#{{ seriesSequence }}</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Podcast Episode # -->
|
<!-- Podcast Episode # -->
|
||||||
<div v-if="recentEpisodeNumber !== null && !isSelectionMode" class="absolute rounded-lg bg-black bg-opacity-90 box-shadow-md z-10" :style="{ top: 0.375 * sizeMultiplier + 'rem', right: 0.375 * sizeMultiplier + 'rem', padding: `${0.1 * sizeMultiplier}rem ${0.25 * sizeMultiplier}rem` }">
|
<div v-if="recentEpisodeNumber !== null && !isSelectionMode" class="absolute rounded-lg bg-black/90 box-shadow-md z-10" :style="{ top: 0.375 * sizeMultiplier + 'rem', right: 0.375 * sizeMultiplier + 'rem', padding: `${0.1 * sizeMultiplier}rem ${0.25 * sizeMultiplier}rem` }">
|
||||||
<p class="text-white" :style="{ fontSize: sizeMultiplier * 0.8 + 'rem' }">
|
<p class="text-white" :style="{ fontSize: sizeMultiplier * 0.8 + 'rem' }">
|
||||||
Episode<span v-if="recentEpisodeNumber"> #{{ recentEpisodeNumber }}</span>
|
Episode<span v-if="recentEpisodeNumber"> #{{ recentEpisodeNumber }}</span>
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
@@ -732,12 +732,12 @@
|
|||||||
ASSETCATALOG_COMPILER_APPICON_NAME = Icons;
|
ASSETCATALOG_COMPILER_APPICON_NAME = Icons;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 37;
|
CURRENT_PROJECT_VERSION = 38;
|
||||||
DEVELOPMENT_TEAM = 7UFJ7D8V6A;
|
DEVELOPMENT_TEAM = 7UFJ7D8V6A;
|
||||||
INFOPLIST_FILE = App/Info.plist;
|
INFOPLIST_FILE = App/Info.plist;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||||
MARKETING_VERSION = 0.9.80;
|
MARKETING_VERSION = 0.9.81;
|
||||||
OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\"";
|
OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\"";
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.audiobookshelf.app.dev;
|
PRODUCT_BUNDLE_IDENTIFIER = com.audiobookshelf.app.dev;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
@@ -756,12 +756,12 @@
|
|||||||
ASSETCATALOG_COMPILER_APPICON_NAME = Icons;
|
ASSETCATALOG_COMPILER_APPICON_NAME = Icons;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 37;
|
CURRENT_PROJECT_VERSION = 38;
|
||||||
DEVELOPMENT_TEAM = 7UFJ7D8V6A;
|
DEVELOPMENT_TEAM = 7UFJ7D8V6A;
|
||||||
INFOPLIST_FILE = App/Info.plist;
|
INFOPLIST_FILE = App/Info.plist;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||||
MARKETING_VERSION = 0.9.80;
|
MARKETING_VERSION = 0.9.81;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.audiobookshelf.app;
|
PRODUCT_BUNDLE_IDENTIFIER = com.audiobookshelf.app;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "";
|
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "";
|
||||||
|
|||||||
+10
-10
@@ -1,5 +1,5 @@
|
|||||||
PODS:
|
PODS:
|
||||||
- Alamofire (5.8.1)
|
- Alamofire (5.10.2)
|
||||||
- Capacitor (7.2.0):
|
- Capacitor (7.2.0):
|
||||||
- CapacitorCordova
|
- CapacitorCordova
|
||||||
- CapacitorApp (7.0.1):
|
- CapacitorApp (7.0.1):
|
||||||
@@ -25,11 +25,11 @@ PODS:
|
|||||||
- Capacitor
|
- Capacitor
|
||||||
- CordovaPlugins (6.2.1):
|
- CordovaPlugins (6.2.1):
|
||||||
- CapacitorCordova
|
- CapacitorCordova
|
||||||
- Realm (10.47.0):
|
- Realm (10.54.4):
|
||||||
- Realm/Headers (= 10.47.0)
|
- Realm/Headers (= 10.54.4)
|
||||||
- Realm/Headers (10.47.0)
|
- Realm/Headers (10.54.4)
|
||||||
- RealmSwift (10.47.0):
|
- RealmSwift (10.54.4):
|
||||||
- Realm (= 10.47.0)
|
- Realm (= 10.54.4)
|
||||||
- WebnativellcCapacitorFilesharer (7.0.4):
|
- WebnativellcCapacitorFilesharer (7.0.4):
|
||||||
- Capacitor
|
- Capacitor
|
||||||
|
|
||||||
@@ -88,7 +88,7 @@ EXTERNAL SOURCES:
|
|||||||
:path: "../../node_modules/@webnativellc/capacitor-filesharer"
|
:path: "../../node_modules/@webnativellc/capacitor-filesharer"
|
||||||
|
|
||||||
SPEC CHECKSUMS:
|
SPEC CHECKSUMS:
|
||||||
Alamofire: 3ca42e259043ee0dc5c0cdd76c4bc568b8e42af7
|
Alamofire: 7193b3b92c74a07f85569e1a6c4f4237291e7496
|
||||||
Capacitor: 106e7a4205f4618d582b886a975657c61179138d
|
Capacitor: 106e7a4205f4618d582b886a975657c61179138d
|
||||||
CapacitorApp: d63334c052278caf5d81585d80b21905c6f93f39
|
CapacitorApp: d63334c052278caf5d81585d80b21905c6f93f39
|
||||||
CapacitorBrowser: 081852cf532acf77b9d2953f3a88fe5b9711fb06
|
CapacitorBrowser: 081852cf532acf77b9d2953f3a88fe5b9711fb06
|
||||||
@@ -102,10 +102,10 @@ SPEC CHECKSUMS:
|
|||||||
CapacitorPreferences: cbf154e5e5519b7f5ab33817a334dda1e98387f9
|
CapacitorPreferences: cbf154e5e5519b7f5ab33817a334dda1e98387f9
|
||||||
CapacitorStatusBar: 275cbf2f4dfc00388f519ef80c7ec22edda342c9
|
CapacitorStatusBar: 275cbf2f4dfc00388f519ef80c7ec22edda342c9
|
||||||
CordovaPlugins: 5a72a85b45469e68556bb172409f1b6d57b27236
|
CordovaPlugins: 5a72a85b45469e68556bb172409f1b6d57b27236
|
||||||
Realm: e43fb540ae947497e3ea8a662443256920602060
|
Realm: 8b5cda39a41f17a1734da2f39c6004eb8745587a
|
||||||
RealmSwift: 8b06ed06b5d16749ae0c4d91c0cba414a9e28189
|
RealmSwift: 0b4f808fed6898f1f6c26f501f740efd80dff0b4
|
||||||
WebnativellcCapacitorFilesharer: 10b111373d4dc49608935600dcbcc14605258c73
|
WebnativellcCapacitorFilesharer: 10b111373d4dc49608935600dcbcc14605258c73
|
||||||
|
|
||||||
PODFILE CHECKSUM: 498821c0cfa2508609567fa95d7244c01cbef538
|
PODFILE CHECKSUM: 498821c0cfa2508609567fa95d7244c01cbef538
|
||||||
|
|
||||||
COCOAPODS: 1.12.1
|
COCOAPODS: 1.16.2
|
||||||
|
|||||||
Generated
+2
-2
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "audiobookshelf-app",
|
"name": "audiobookshelf-app",
|
||||||
"version": "0.9.80-beta",
|
"version": "0.9.81-beta",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "audiobookshelf-app",
|
"name": "audiobookshelf-app",
|
||||||
"version": "0.9.80-beta",
|
"version": "0.9.81-beta",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@capacitor-community/keep-awake": "^7.0.0",
|
"@capacitor-community/keep-awake": "^7.0.0",
|
||||||
"@capacitor-community/volume-buttons": "^7.0.0",
|
"@capacitor-community/volume-buttons": "^7.0.0",
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "audiobookshelf-app",
|
"name": "audiobookshelf-app",
|
||||||
"version": "0.9.80-beta",
|
"version": "0.9.81-beta",
|
||||||
"author": "advplyr",
|
"author": "advplyr",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "nuxt --hostname 0.0.0.0 --port 1337",
|
"dev": "nuxt --hostname 0.0.0.0 --port 1337",
|
||||||
|
|||||||
@@ -100,6 +100,13 @@
|
|||||||
<p class="pl-4">{{ $strings.LabelDisableVibrateOnReset }}</p>
|
<p class="pl-4">{{ $strings.LabelDisableVibrateOnReset }}</p>
|
||||||
<span class="material-symbols text-xl ml-2" @click.stop="showInfo('disableSleepTimerResetFeedback')">info</span>
|
<span class="material-symbols text-xl ml-2" @click.stop="showInfo('disableSleepTimerResetFeedback')">info</span>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="flex items-center py-3">
|
||||||
|
<div class="w-10 flex justify-center" @click="toggleSleepTimerAlmostDoneChime">
|
||||||
|
<ui-toggle-switch v-model="settings.enableSleepTimerAlmostDoneChime" @input="saveSettings" />
|
||||||
|
</div>
|
||||||
|
<p class="pl-4">{{ $strings.LabelSleepTimerAlmostDoneChime }}</p>
|
||||||
|
<span class="material-symbols text-xl ml-2" @click.stop="showInfo('enableSleepTimerAlmostDoneChime')">info</span>
|
||||||
|
</div>
|
||||||
<div class="flex items-center py-3">
|
<div class="flex items-center py-3">
|
||||||
<div class="w-10 flex justify-center" @click="toggleAutoSleepTimer">
|
<div class="w-10 flex justify-center" @click="toggleAutoSleepTimer">
|
||||||
<ui-toggle-switch v-model="settings.autoSleepTimer" @input="saveSettings" />
|
<ui-toggle-switch v-model="settings.autoSleepTimer" @input="saveSettings" />
|
||||||
@@ -207,6 +214,7 @@ export default {
|
|||||||
sleepTimerLength: 900000, // 15 minutes
|
sleepTimerLength: 900000, // 15 minutes
|
||||||
disableSleepTimerFadeOut: false,
|
disableSleepTimerFadeOut: false,
|
||||||
disableSleepTimerResetFeedback: false,
|
disableSleepTimerResetFeedback: false,
|
||||||
|
enableSleepTimerAlmostDoneChime: false,
|
||||||
autoSleepTimerAutoRewind: false,
|
autoSleepTimerAutoRewind: false,
|
||||||
autoSleepTimerAutoRewindTime: 300000, // 5 minutes
|
autoSleepTimerAutoRewindTime: 300000, // 5 minutes
|
||||||
languageCode: 'en-us',
|
languageCode: 'en-us',
|
||||||
@@ -234,6 +242,10 @@ export default {
|
|||||||
name: this.$strings.LabelDisableVibrateOnReset,
|
name: this.$strings.LabelDisableVibrateOnReset,
|
||||||
message: this.$strings.LabelDisableVibrateOnResetHelp
|
message: this.$strings.LabelDisableVibrateOnResetHelp
|
||||||
},
|
},
|
||||||
|
enableSleepTimerAlmostDoneChime: {
|
||||||
|
name: this.$strings.LabelSleepTimerAlmostDoneChime,
|
||||||
|
message: this.$strings.LabelSleepTimerAlmostDoneChimeHelp
|
||||||
|
},
|
||||||
autoSleepTimerAutoRewind: {
|
autoSleepTimerAutoRewind: {
|
||||||
name: this.$strings.LabelAutoSleepTimerAutoRewind,
|
name: this.$strings.LabelAutoSleepTimerAutoRewind,
|
||||||
message: this.$strings.LabelAutoSleepTimerAutoRewindHelp
|
message: this.$strings.LabelAutoSleepTimerAutoRewindHelp
|
||||||
@@ -549,6 +561,10 @@ export default {
|
|||||||
this.settings.disableSleepTimerResetFeedback = !this.settings.disableSleepTimerResetFeedback
|
this.settings.disableSleepTimerResetFeedback = !this.settings.disableSleepTimerResetFeedback
|
||||||
this.saveSettings()
|
this.saveSettings()
|
||||||
},
|
},
|
||||||
|
toggleSleepTimerAlmostDoneChime() {
|
||||||
|
this.settings.enableSleepTimerAlmostDoneChime = !this.settings.enableSleepTimerAlmostDoneChime
|
||||||
|
this.saveSettings()
|
||||||
|
},
|
||||||
toggleDisableAutoRewind() {
|
toggleDisableAutoRewind() {
|
||||||
this.settings.disableAutoRewind = !this.settings.disableAutoRewind
|
this.settings.disableAutoRewind = !this.settings.disableAutoRewind
|
||||||
this.saveSettings()
|
this.saveSettings()
|
||||||
@@ -620,6 +636,7 @@ export default {
|
|||||||
this.settings.sleepTimerLength = !isNaN(deviceSettings.sleepTimerLength) ? deviceSettings.sleepTimerLength : 900000 // 15 minutes
|
this.settings.sleepTimerLength = !isNaN(deviceSettings.sleepTimerLength) ? deviceSettings.sleepTimerLength : 900000 // 15 minutes
|
||||||
this.settings.disableSleepTimerFadeOut = !!deviceSettings.disableSleepTimerFadeOut
|
this.settings.disableSleepTimerFadeOut = !!deviceSettings.disableSleepTimerFadeOut
|
||||||
this.settings.disableSleepTimerResetFeedback = !!deviceSettings.disableSleepTimerResetFeedback
|
this.settings.disableSleepTimerResetFeedback = !!deviceSettings.disableSleepTimerResetFeedback
|
||||||
|
this.settings.enableSleepTimerAlmostDoneChime = !!deviceSettings.enableSleepTimerAlmostDoneChime
|
||||||
|
|
||||||
this.settings.autoSleepTimerAutoRewind = !!deviceSettings.autoSleepTimerAutoRewind
|
this.settings.autoSleepTimerAutoRewind = !!deviceSettings.autoSleepTimerAutoRewind
|
||||||
this.settings.autoSleepTimerAutoRewindTime = !isNaN(deviceSettings.autoSleepTimerAutoRewindTime) ? deviceSettings.autoSleepTimerAutoRewindTime : 300000 // 5 minutes
|
this.settings.autoSleepTimerAutoRewindTime = !isNaN(deviceSettings.autoSleepTimerAutoRewindTime) ? deviceSettings.autoSleepTimerAutoRewindTime : 300000 // 5 minutes
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
"ButtonCancel": "Abbrechen",
|
"ButtonCancel": "Abbrechen",
|
||||||
"ButtonCancelTimer": "Timer abbrechen",
|
"ButtonCancelTimer": "Timer abbrechen",
|
||||||
"ButtonClearFilter": "Filter löschen",
|
"ButtonClearFilter": "Filter löschen",
|
||||||
|
"ButtonClearLogs": "Protokolle löschen",
|
||||||
"ButtonCloseFeed": "Feed schließen",
|
"ButtonCloseFeed": "Feed schließen",
|
||||||
"ButtonCollections": "Sammlungen",
|
"ButtonCollections": "Sammlungen",
|
||||||
"ButtonConnect": "Verbinden",
|
"ButtonConnect": "Verbinden",
|
||||||
@@ -28,6 +29,7 @@
|
|||||||
"ButtonLocalMedia": "Lokale Medien",
|
"ButtonLocalMedia": "Lokale Medien",
|
||||||
"ButtonLogs": "Protokolle",
|
"ButtonLogs": "Protokolle",
|
||||||
"ButtonManageLocalFiles": "Verwalte lokale Dateien",
|
"ButtonManageLocalFiles": "Verwalte lokale Dateien",
|
||||||
|
"ButtonMaskServerAddress": "Server Adresse verstecken",
|
||||||
"ButtonNewFolder": "Neuer Ordner",
|
"ButtonNewFolder": "Neuer Ordner",
|
||||||
"ButtonNextEpisode": "Nächste Episode",
|
"ButtonNextEpisode": "Nächste Episode",
|
||||||
"ButtonOk": "Einverstanden",
|
"ButtonOk": "Einverstanden",
|
||||||
@@ -51,6 +53,7 @@
|
|||||||
"ButtonStream": "Streamen",
|
"ButtonStream": "Streamen",
|
||||||
"ButtonSubmit": "Ok",
|
"ButtonSubmit": "Ok",
|
||||||
"ButtonSwitchServerUser": "Wechsle Server/Benutzer",
|
"ButtonSwitchServerUser": "Wechsle Server/Benutzer",
|
||||||
|
"ButtonUnmaskServerAddress": "Server Adresse anzeigen",
|
||||||
"ButtonUserStats": "Nutzerstatistiken",
|
"ButtonUserStats": "Nutzerstatistiken",
|
||||||
"ButtonYes": "Ja",
|
"ButtonYes": "Ja",
|
||||||
"HeaderAccount": "Konto",
|
"HeaderAccount": "Konto",
|
||||||
@@ -311,6 +314,7 @@
|
|||||||
"MessageNoItems": "Keine Medien",
|
"MessageNoItems": "Keine Medien",
|
||||||
"MessageNoItemsFound": "Keine Medien gefunden",
|
"MessageNoItemsFound": "Keine Medien gefunden",
|
||||||
"MessageNoListeningSessions": "Keine Hörsitzungen",
|
"MessageNoListeningSessions": "Keine Hörsitzungen",
|
||||||
|
"MessageNoLogs": "Keine Protokolle vorhanden",
|
||||||
"MessageNoMediaFolders": "Keine Medien Ordner",
|
"MessageNoMediaFolders": "Keine Medien Ordner",
|
||||||
"MessageNoNetworkConnection": "Keine Netzwerkverbindung",
|
"MessageNoNetworkConnection": "Keine Netzwerkverbindung",
|
||||||
"MessageNoPodcastsFound": "Keine Podcasts gefunden",
|
"MessageNoPodcastsFound": "Keine Podcasts gefunden",
|
||||||
|
|||||||
@@ -241,6 +241,8 @@
|
|||||||
"LabelShowAll": "Show All",
|
"LabelShowAll": "Show All",
|
||||||
"LabelSize": "Size",
|
"LabelSize": "Size",
|
||||||
"LabelSleepTimer": "Sleep timer",
|
"LabelSleepTimer": "Sleep timer",
|
||||||
|
"LabelSleepTimerAlmostDoneChime": "Play a chime when almost finished",
|
||||||
|
"LabelSleepTimerAlmostDoneChimeHelp": "Play a chime when the sleep timer has 30 seconds remaining",
|
||||||
"LabelStart": "Start",
|
"LabelStart": "Start",
|
||||||
"LabelStartTime": "Start time",
|
"LabelStartTime": "Start time",
|
||||||
"LabelStatsBestDay": "Best Day",
|
"LabelStatsBestDay": "Best Day",
|
||||||
|
|||||||
@@ -26,7 +26,9 @@
|
|||||||
"ButtonLatest": "Najnovije",
|
"ButtonLatest": "Najnovije",
|
||||||
"ButtonLibrary": "Knjižnica",
|
"ButtonLibrary": "Knjižnica",
|
||||||
"ButtonLocalMedia": "Preuzeti medijski zapisi",
|
"ButtonLocalMedia": "Preuzeti medijski zapisi",
|
||||||
|
"ButtonLogs": "Zapisnici",
|
||||||
"ButtonManageLocalFiles": "Upravljanje preuzetim datotekama",
|
"ButtonManageLocalFiles": "Upravljanje preuzetim datotekama",
|
||||||
|
"ButtonMaskServerAddress": "Maskiraj adresu poslužitelja",
|
||||||
"ButtonNewFolder": "Nova mapa",
|
"ButtonNewFolder": "Nova mapa",
|
||||||
"ButtonNextEpisode": "Sljedeći nastavak",
|
"ButtonNextEpisode": "Sljedeći nastavak",
|
||||||
"ButtonOk": "U redu",
|
"ButtonOk": "U redu",
|
||||||
@@ -50,6 +52,7 @@
|
|||||||
"ButtonStream": "Reproduciraj strujanjem",
|
"ButtonStream": "Reproduciraj strujanjem",
|
||||||
"ButtonSubmit": "Pošalji",
|
"ButtonSubmit": "Pošalji",
|
||||||
"ButtonSwitchServerUser": "Promijeni poslužitelj/korisnika",
|
"ButtonSwitchServerUser": "Promijeni poslužitelj/korisnika",
|
||||||
|
"ButtonUnmaskServerAddress": "Prikaži adresu poslužitelja",
|
||||||
"ButtonUserStats": "Statistika korisnika",
|
"ButtonUserStats": "Statistika korisnika",
|
||||||
"ButtonYes": "Da",
|
"ButtonYes": "Da",
|
||||||
"HeaderAccount": "Korisnički račun",
|
"HeaderAccount": "Korisnički račun",
|
||||||
@@ -310,6 +313,7 @@
|
|||||||
"MessageNoItems": "Nema stavki",
|
"MessageNoItems": "Nema stavki",
|
||||||
"MessageNoItemsFound": "Nema pronađenih stavki",
|
"MessageNoItemsFound": "Nema pronađenih stavki",
|
||||||
"MessageNoListeningSessions": "Nema sesija slušanja",
|
"MessageNoListeningSessions": "Nema sesija slušanja",
|
||||||
|
"MessageNoLogs": "Nema zapisnika",
|
||||||
"MessageNoMediaFolders": "Nema medijskih mapa",
|
"MessageNoMediaFolders": "Nema medijskih mapa",
|
||||||
"MessageNoNetworkConnection": "Nema mrežne veze",
|
"MessageNoNetworkConnection": "Nema mrežne veze",
|
||||||
"MessageNoPodcastsFound": "Nije pronađen niti jedan podcast",
|
"MessageNoPodcastsFound": "Nije pronađen niti jedan podcast",
|
||||||
|
|||||||
+11
-2
@@ -6,6 +6,7 @@
|
|||||||
"ButtonCancel": "Mégsem",
|
"ButtonCancel": "Mégsem",
|
||||||
"ButtonCancelTimer": "Időzítő megszakítása",
|
"ButtonCancelTimer": "Időzítő megszakítása",
|
||||||
"ButtonClearFilter": "Szűrő törlése",
|
"ButtonClearFilter": "Szűrő törlése",
|
||||||
|
"ButtonClearLogs": "Naplók tisztítása",
|
||||||
"ButtonCloseFeed": "Hírcsatorna bezárása",
|
"ButtonCloseFeed": "Hírcsatorna bezárása",
|
||||||
"ButtonCollections": "Gyűjtemények",
|
"ButtonCollections": "Gyűjtemények",
|
||||||
"ButtonConnect": "Csatlakozás",
|
"ButtonConnect": "Csatlakozás",
|
||||||
@@ -26,7 +27,9 @@
|
|||||||
"ButtonLatest": "Legújabb",
|
"ButtonLatest": "Legújabb",
|
||||||
"ButtonLibrary": "Könyvtár",
|
"ButtonLibrary": "Könyvtár",
|
||||||
"ButtonLocalMedia": "Helyi média",
|
"ButtonLocalMedia": "Helyi média",
|
||||||
|
"ButtonLogs": "Naplók",
|
||||||
"ButtonManageLocalFiles": "Helyi fájlok kezelése",
|
"ButtonManageLocalFiles": "Helyi fájlok kezelése",
|
||||||
|
"ButtonMaskServerAddress": "Kiszolgáló címének maszkolása",
|
||||||
"ButtonNewFolder": "Új mappa",
|
"ButtonNewFolder": "Új mappa",
|
||||||
"ButtonNextEpisode": "Következő epizód",
|
"ButtonNextEpisode": "Következő epizód",
|
||||||
"ButtonOk": "Ok",
|
"ButtonOk": "Ok",
|
||||||
@@ -50,6 +53,7 @@
|
|||||||
"ButtonStream": "Streamelés",
|
"ButtonStream": "Streamelés",
|
||||||
"ButtonSubmit": "Küldés",
|
"ButtonSubmit": "Küldés",
|
||||||
"ButtonSwitchServerUser": "Szerver/Felhasználó váltása",
|
"ButtonSwitchServerUser": "Szerver/Felhasználó váltása",
|
||||||
|
"ButtonUnmaskServerAddress": "Kiszolgáló címének maszkolásának törlése",
|
||||||
"ButtonUserStats": "Felhasználói statisztikák",
|
"ButtonUserStats": "Felhasználói statisztikák",
|
||||||
"ButtonYes": "Igen",
|
"ButtonYes": "Igen",
|
||||||
"HeaderAccount": "Fiók",
|
"HeaderAccount": "Fiók",
|
||||||
@@ -95,6 +99,7 @@
|
|||||||
"LabelAllowSeekingOnMediaControls": "Pozíció keresés engedélyezése a média értesítési vezérlőkön",
|
"LabelAllowSeekingOnMediaControls": "Pozíció keresés engedélyezése a média értesítési vezérlőkön",
|
||||||
"LabelAlways": "Mindig",
|
"LabelAlways": "Mindig",
|
||||||
"LabelAndroidAutoBrowseLimitForGrouping": "Ábécé szerinti lehívási korlát",
|
"LabelAndroidAutoBrowseLimitForGrouping": "Ábécé szerinti lehívási korlát",
|
||||||
|
"LabelAndroidAutoBrowseLimitForGroupingHelp": "Ne használja az ábécé szerinti lehívási korlátot, ha ennél kevesebb elemet kell megjeleníteni",
|
||||||
"LabelAndroidAutoBrowseSeriesSequenceOrder": "A sorozat könyveinek sorrendje",
|
"LabelAndroidAutoBrowseSeriesSequenceOrder": "A sorozat könyveinek sorrendje",
|
||||||
"LabelAskConfirmation": "Kérjen megerősítést",
|
"LabelAskConfirmation": "Kérjen megerősítést",
|
||||||
"LabelAuthor": "Szerző",
|
"LabelAuthor": "Szerző",
|
||||||
@@ -136,7 +141,7 @@
|
|||||||
"LabelEbooks": "E-könyvek",
|
"LabelEbooks": "E-könyvek",
|
||||||
"LabelEnable": "Engedélyezés",
|
"LabelEnable": "Engedélyezés",
|
||||||
"LabelEnableMp3IndexSeeking": "Mp3 indexkeresés engedélyezése",
|
"LabelEnableMp3IndexSeeking": "Mp3 indexkeresés engedélyezése",
|
||||||
"LabelEnableMp3IndexSeekingHelp": "Ezt a beállítást csak akkor kell engedélyezni, ha vannak mp3 fájljai, amelyek nem megfelelően keresnek. A pontatlan keresés leginkább a változó bitráta (VBR) mp3 fájlok miatt lehetséges. Ez a beállítás indexkeresést fog kényszeríteni, amely során egy idő-bájt leképezés jön létre, ahogy a fájlt olvassák. Nagy mp3 fájlok esetén előfordulhat késedelem a fájl végéhez való kereséskor.",
|
"LabelEnableMp3IndexSeekingHelp": "Ezt a beállítást csak akkor kell engedélyezni, ha vannak mp3 fájljai, amelyek nem megfelelően keresnek. A pontatlan keresés leginkább a változó bitráta (VBR) mp3 fájlok miatt lehetséges. Ez a beállítás indexkeresést fog kényszeríteni, amely során egy idő-bájt leképezés jön létre, ahogy a fájlt olvassák. Nagy mp3 fájlok esetén előfordulhat késedelem a fájl végénél történő kereséskor.",
|
||||||
"LabelEnd": "Vége",
|
"LabelEnd": "Vége",
|
||||||
"LabelEndOfChapter": "Fejezet vége",
|
"LabelEndOfChapter": "Fejezet vége",
|
||||||
"LabelEndTime": "Befejezés ideje",
|
"LabelEndTime": "Befejezés ideje",
|
||||||
@@ -178,6 +183,7 @@
|
|||||||
"LabelLow": "Alacsony",
|
"LabelLow": "Alacsony",
|
||||||
"LabelMediaType": "Média típus",
|
"LabelMediaType": "Média típus",
|
||||||
"LabelMedium": "Közepes",
|
"LabelMedium": "Közepes",
|
||||||
|
"LabelMissing": "Hiányzik",
|
||||||
"LabelMore": "Több",
|
"LabelMore": "Több",
|
||||||
"LabelMoreInfo": "Több információ",
|
"LabelMoreInfo": "Több információ",
|
||||||
"LabelName": "Név",
|
"LabelName": "Név",
|
||||||
@@ -240,7 +246,7 @@
|
|||||||
"LabelStatsBestDay": "Legjobb nap",
|
"LabelStatsBestDay": "Legjobb nap",
|
||||||
"LabelStatsDailyAverage": "Napi átlag",
|
"LabelStatsDailyAverage": "Napi átlag",
|
||||||
"LabelStatsDays": "Napok",
|
"LabelStatsDays": "Napok",
|
||||||
"LabelStatsDaysListened": "Hallgatott napok",
|
"LabelStatsDaysListened": "Hallgatással töltött napok",
|
||||||
"LabelStatsInARow": "egymás után",
|
"LabelStatsInARow": "egymás után",
|
||||||
"LabelStatsItemsFinished": "Befejezett elemek",
|
"LabelStatsItemsFinished": "Befejezett elemek",
|
||||||
"LabelStatsMinutes": "perc",
|
"LabelStatsMinutes": "perc",
|
||||||
@@ -250,6 +256,7 @@
|
|||||||
"LabelTag": "Címke",
|
"LabelTag": "Címke",
|
||||||
"LabelTags": "Címkék",
|
"LabelTags": "Címkék",
|
||||||
"LabelTheme": "Téma",
|
"LabelTheme": "Téma",
|
||||||
|
"LabelThemeBlack": "Fekete",
|
||||||
"LabelThemeDark": "Sötét",
|
"LabelThemeDark": "Sötét",
|
||||||
"LabelThemeLight": "Világos",
|
"LabelThemeLight": "Világos",
|
||||||
"LabelTimeRemaining": "{0} maradt",
|
"LabelTimeRemaining": "{0} maradt",
|
||||||
@@ -294,6 +301,7 @@
|
|||||||
"MessageItemMissing": "Az elem hiányzik, és a szerveren kell javítani. Egy elemet általában azért jelölnek hiányzónak, mert a fájl elérési útvonalai nem elérhetőek.",
|
"MessageItemMissing": "Az elem hiányzik, és a szerveren kell javítani. Egy elemet általában azért jelölnek hiányzónak, mert a fájl elérési útvonalai nem elérhetőek.",
|
||||||
"MessageLoading": "Betöltés...",
|
"MessageLoading": "Betöltés...",
|
||||||
"MessageLoadingServerData": "Szerveradatok betöltése...",
|
"MessageLoadingServerData": "Szerveradatok betöltése...",
|
||||||
|
"MessageLocalFolderDescription": "A „Belső alkalmazás-tároló” csak ezzel az alkalmazással érhető el. Ez az alkalmazás csak a közvetlenül az alkalmazáson keresztül letöltött médiát támogatja. A megosztott tároló mappák segítségével más alkalmazások is hozzáférhetnek az alkalmazás által letöltött médiához.",
|
||||||
"MessageMarkAsFinished": "Befejezettnek jelölés",
|
"MessageMarkAsFinished": "Befejezettnek jelölés",
|
||||||
"MessageMediaLinkedToADifferentServer": "A média egy másik címen található Audiobookshelf szerverhez kapcsolódik ({0}). A haladás szinkronizálva lesz, amikor csatlakozik ehhez a szervercímhez.",
|
"MessageMediaLinkedToADifferentServer": "A média egy másik címen található Audiobookshelf szerverhez kapcsolódik ({0}). A haladás szinkronizálva lesz, amikor csatlakozik ehhez a szervercímhez.",
|
||||||
"MessageMediaLinkedToADifferentUser": "A média ehhez a szerverhez kapcsolódik, de egy másik felhasználó töltötte le. A haladás csak a letöltést végrehajtó felhasználóhoz lesz szinkronizálva.",
|
"MessageMediaLinkedToADifferentUser": "A média ehhez a szerverhez kapcsolódik, de egy másik felhasználó töltötte le. A haladás csak a letöltést végrehajtó felhasználóhoz lesz szinkronizálva.",
|
||||||
@@ -306,6 +314,7 @@
|
|||||||
"MessageNoItems": "Nincsenek elemek",
|
"MessageNoItems": "Nincsenek elemek",
|
||||||
"MessageNoItemsFound": "Nincs találat",
|
"MessageNoItemsFound": "Nincs találat",
|
||||||
"MessageNoListeningSessions": "Nincsenek hallgatási munkamenetek",
|
"MessageNoListeningSessions": "Nincsenek hallgatási munkamenetek",
|
||||||
|
"MessageNoLogs": "Nincsenek naplók",
|
||||||
"MessageNoMediaFolders": "Nincsenek médiamappák",
|
"MessageNoMediaFolders": "Nincsenek médiamappák",
|
||||||
"MessageNoNetworkConnection": "Nincs hálózati kapcsolat",
|
"MessageNoNetworkConnection": "Nincs hálózati kapcsolat",
|
||||||
"MessageNoPodcastsFound": "Nem találhatók podcastok",
|
"MessageNoPodcastsFound": "Nem találhatók podcastok",
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
"ButtonCancel": "Annuleren",
|
"ButtonCancel": "Annuleren",
|
||||||
"ButtonCancelTimer": "Timer annuleren",
|
"ButtonCancelTimer": "Timer annuleren",
|
||||||
"ButtonClearFilter": "Filter verwijderen",
|
"ButtonClearFilter": "Filter verwijderen",
|
||||||
|
"ButtonClearLogs": "Log bestanden verwijderen",
|
||||||
"ButtonCloseFeed": "Feed sluiten",
|
"ButtonCloseFeed": "Feed sluiten",
|
||||||
"ButtonCollections": "Collecties",
|
"ButtonCollections": "Collecties",
|
||||||
"ButtonConnect": "Verbinden",
|
"ButtonConnect": "Verbinden",
|
||||||
@@ -26,9 +27,11 @@
|
|||||||
"ButtonLatest": "Meest recent",
|
"ButtonLatest": "Meest recent",
|
||||||
"ButtonLibrary": "Bibliotheek",
|
"ButtonLibrary": "Bibliotheek",
|
||||||
"ButtonLocalMedia": "Lokale Media",
|
"ButtonLocalMedia": "Lokale Media",
|
||||||
|
"ButtonLogs": "Log bestanden",
|
||||||
"ButtonManageLocalFiles": "Beheer Lokale Bestanden",
|
"ButtonManageLocalFiles": "Beheer Lokale Bestanden",
|
||||||
"ButtonNewFolder": "Nieuwe map",
|
"ButtonNewFolder": "Nieuwe map",
|
||||||
"ButtonNextEpisode": "Volgende aflevering",
|
"ButtonNextEpisode": "Volgende aflevering",
|
||||||
|
"ButtonOk": "Akkoord",
|
||||||
"ButtonOpenFeed": "Feed openen",
|
"ButtonOpenFeed": "Feed openen",
|
||||||
"ButtonOverride": "Overschrijven",
|
"ButtonOverride": "Overschrijven",
|
||||||
"ButtonPause": "Pauze",
|
"ButtonPause": "Pauze",
|
||||||
@@ -74,6 +77,7 @@
|
|||||||
"HeaderPlaybackSettings": "Afspeel instellingen",
|
"HeaderPlaybackSettings": "Afspeel instellingen",
|
||||||
"HeaderPlaylist": "Afspeellijst",
|
"HeaderPlaylist": "Afspeellijst",
|
||||||
"HeaderPlaylistItems": "Onderdelen in afspeellijst",
|
"HeaderPlaylistItems": "Onderdelen in afspeellijst",
|
||||||
|
"HeaderProgressSyncFailed": "Voortgang synchronisatie mislukt",
|
||||||
"HeaderRSSFeed": "RSS Feed",
|
"HeaderRSSFeed": "RSS Feed",
|
||||||
"HeaderRSSFeedGeneral": "RSS-details",
|
"HeaderRSSFeedGeneral": "RSS-details",
|
||||||
"HeaderRSSFeedIsOpen": "RSS-feed is open",
|
"HeaderRSSFeedIsOpen": "RSS-feed is open",
|
||||||
@@ -162,6 +166,7 @@
|
|||||||
"LabelInternalAppStorage": "Interne App Opslag",
|
"LabelInternalAppStorage": "Interne App Opslag",
|
||||||
"LabelJumpBackwardsTime": "Terug in tijd springen",
|
"LabelJumpBackwardsTime": "Terug in tijd springen",
|
||||||
"LabelJumpForwardsTime": "Verder in tijd springen",
|
"LabelJumpForwardsTime": "Verder in tijd springen",
|
||||||
|
"LabelKeepScreenAwake": "Scherm actief houden",
|
||||||
"LabelLanguage": "Taal",
|
"LabelLanguage": "Taal",
|
||||||
"LabelLayout": "Layout",
|
"LabelLayout": "Layout",
|
||||||
"LabelLayoutAuto": "Automatisch",
|
"LabelLayoutAuto": "Automatisch",
|
||||||
@@ -176,6 +181,7 @@
|
|||||||
"LabelLow": "Laag",
|
"LabelLow": "Laag",
|
||||||
"LabelMediaType": "Mediatype",
|
"LabelMediaType": "Mediatype",
|
||||||
"LabelMedium": "Medium",
|
"LabelMedium": "Medium",
|
||||||
|
"LabelMissing": "Missende",
|
||||||
"LabelMore": "Meer",
|
"LabelMore": "Meer",
|
||||||
"LabelMoreInfo": "Meer info",
|
"LabelMoreInfo": "Meer info",
|
||||||
"LabelName": "Naam",
|
"LabelName": "Naam",
|
||||||
@@ -193,6 +199,8 @@
|
|||||||
"LabelNotFinished": "Niet Voltooid",
|
"LabelNotFinished": "Niet Voltooid",
|
||||||
"LabelNotStarted": "Niet Gestart",
|
"LabelNotStarted": "Niet Gestart",
|
||||||
"LabelNumEpisodes": "{0} afleveringen",
|
"LabelNumEpisodes": "{0} afleveringen",
|
||||||
|
"LabelNumEpisodesIncomplete": "{0} afleveringen, {1} incompleet",
|
||||||
|
"LabelNumberOfEpisodes": "# Afleveringen",
|
||||||
"LabelOff": "Uit",
|
"LabelOff": "Uit",
|
||||||
"LabelOn": "Aan",
|
"LabelOn": "Aan",
|
||||||
"LabelPassword": "Wachtwoord",
|
"LabelPassword": "Wachtwoord",
|
||||||
@@ -246,6 +254,7 @@
|
|||||||
"LabelTag": "Tag",
|
"LabelTag": "Tag",
|
||||||
"LabelTags": "Tags",
|
"LabelTags": "Tags",
|
||||||
"LabelTheme": "Thema",
|
"LabelTheme": "Thema",
|
||||||
|
"LabelThemeBlack": "Zwart",
|
||||||
"LabelThemeDark": "Donker",
|
"LabelThemeDark": "Donker",
|
||||||
"LabelThemeLight": "Licht",
|
"LabelThemeLight": "Licht",
|
||||||
"LabelTimeRemaining": "{0} te gaan",
|
"LabelTimeRemaining": "{0} te gaan",
|
||||||
@@ -272,6 +281,7 @@
|
|||||||
"MessageBookshelfEmpty": "Boekenplank leeg",
|
"MessageBookshelfEmpty": "Boekenplank leeg",
|
||||||
"MessageConfirmDeleteLocalEpisode": "Lokale aflevering \"{0}\" van uw apparaat verwijderen? Het bestand op de server blijft onaangetast.",
|
"MessageConfirmDeleteLocalEpisode": "Lokale aflevering \"{0}\" van uw apparaat verwijderen? Het bestand op de server blijft onaangetast.",
|
||||||
"MessageConfirmDeleteLocalFiles": "Lokale bestanden van dit item van uw apparaat verwijderen? De bestanden op de server en uw voortgang worden niet beïnvloed.",
|
"MessageConfirmDeleteLocalFiles": "Lokale bestanden van dit item van uw apparaat verwijderen? De bestanden op de server en uw voortgang worden niet beïnvloed.",
|
||||||
|
"MessageConfirmDisableAutoTimer": "Weet u zeker dat je de automatische timer voor de rest van vandaag wilt uitschakelen? De timer wordt automatisch weer ingeschakeld aan het einde van deze sluimerperiode of als u de app opnieuw start.",
|
||||||
"MessageConfirmDiscardProgress": "Weet u zeker dat u uw voortgang wilt resetten?",
|
"MessageConfirmDiscardProgress": "Weet u zeker dat u uw voortgang wilt resetten?",
|
||||||
"MessageConfirmDownloadUsingCellular": "U staat op het punt om te downloaden met behulp van mobiele data. Dit kan kosten voor data van de provider met zich meebrengen. Wilt u doorgaan?",
|
"MessageConfirmDownloadUsingCellular": "U staat op het punt om te downloaden met behulp van mobiele data. Dit kan kosten voor data van de provider met zich meebrengen. Wilt u doorgaan?",
|
||||||
"MessageConfirmMarkAsFinished": "Weet u zeker dat u dit item als voltooid wilt markeren?",
|
"MessageConfirmMarkAsFinished": "Weet u zeker dat u dit item als voltooid wilt markeren?",
|
||||||
@@ -300,12 +310,14 @@
|
|||||||
"MessageNoItems": "Geen onderdelen",
|
"MessageNoItems": "Geen onderdelen",
|
||||||
"MessageNoItemsFound": "Geen onderdelen gevonden",
|
"MessageNoItemsFound": "Geen onderdelen gevonden",
|
||||||
"MessageNoListeningSessions": "Geen luistersessies",
|
"MessageNoListeningSessions": "Geen luistersessies",
|
||||||
|
"MessageNoLogs": "Geen log bestanden",
|
||||||
"MessageNoMediaFolders": "Geen Media Folders",
|
"MessageNoMediaFolders": "Geen Media Folders",
|
||||||
"MessageNoNetworkConnection": "Geen netwerk connectie",
|
"MessageNoNetworkConnection": "Geen netwerk connectie",
|
||||||
"MessageNoPodcastsFound": "Geen podcasts gevonden",
|
"MessageNoPodcastsFound": "Geen podcasts gevonden",
|
||||||
"MessageNoSeries": "Geen series",
|
"MessageNoSeries": "Geen series",
|
||||||
"MessageNoUpdatesWereNecessary": "Geen bijwerkingen waren noodzakelijk",
|
"MessageNoUpdatesWereNecessary": "Geen bijwerkingen waren noodzakelijk",
|
||||||
"MessageNoUserPlaylists": "Je hebt geen afspeellijsten",
|
"MessageNoUserPlaylists": "Je hebt geen afspeellijsten",
|
||||||
|
"MessageOldServerConnectionWarning": "Server connectie configuratie gebruikt een oud user ID. Gelieve deze server connectie te verwijderen en opnieuw toe te voegen.",
|
||||||
"MessagePodcastSearchField": "Zoekterm of RSS feed URL invullen",
|
"MessagePodcastSearchField": "Zoekterm of RSS feed URL invullen",
|
||||||
"MessageReportBugsAndContribute": "Rapporteer bugs, vraag functionaliteiten aan en draag bij op",
|
"MessageReportBugsAndContribute": "Rapporteer bugs, vraag functionaliteiten aan en draag bij op",
|
||||||
"MessageSeriesAlreadyDownloaded": "Je hebt alle boeken in deze serie al gedownload.",
|
"MessageSeriesAlreadyDownloaded": "Je hebt alle boeken in deze serie al gedownload.",
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
"ButtonCancel": "Отмена",
|
"ButtonCancel": "Отмена",
|
||||||
"ButtonCancelTimer": "Отмена таймера",
|
"ButtonCancelTimer": "Отмена таймера",
|
||||||
"ButtonClearFilter": "Очистить фильтр",
|
"ButtonClearFilter": "Очистить фильтр",
|
||||||
|
"ButtonClearLogs": "Очистить журнал",
|
||||||
"ButtonCloseFeed": "Закрыть канал",
|
"ButtonCloseFeed": "Закрыть канал",
|
||||||
"ButtonCollections": "Коллекции",
|
"ButtonCollections": "Коллекции",
|
||||||
"ButtonConnect": "Подключение",
|
"ButtonConnect": "Подключение",
|
||||||
@@ -26,7 +27,9 @@
|
|||||||
"ButtonLatest": "Последнее",
|
"ButtonLatest": "Последнее",
|
||||||
"ButtonLibrary": "Библиотека",
|
"ButtonLibrary": "Библиотека",
|
||||||
"ButtonLocalMedia": "Локальные медиа",
|
"ButtonLocalMedia": "Локальные медиа",
|
||||||
|
"ButtonLogs": "Журнал",
|
||||||
"ButtonManageLocalFiles": "Управление локальными файлами",
|
"ButtonManageLocalFiles": "Управление локальными файлами",
|
||||||
|
"ButtonMaskServerAddress": "Скрывать адрес сервера",
|
||||||
"ButtonNewFolder": "Новая папка",
|
"ButtonNewFolder": "Новая папка",
|
||||||
"ButtonNextEpisode": "Следующий эпизод",
|
"ButtonNextEpisode": "Следующий эпизод",
|
||||||
"ButtonOk": "Ок",
|
"ButtonOk": "Ок",
|
||||||
@@ -50,6 +53,7 @@
|
|||||||
"ButtonStream": "Стрим",
|
"ButtonStream": "Стрим",
|
||||||
"ButtonSubmit": "Применить",
|
"ButtonSubmit": "Применить",
|
||||||
"ButtonSwitchServerUser": "Изменить Сервер/Пользователя",
|
"ButtonSwitchServerUser": "Изменить Сервер/Пользователя",
|
||||||
|
"ButtonUnmaskServerAddress": "Не скрывать адрес сервера",
|
||||||
"ButtonUserStats": "Статистика пользователя",
|
"ButtonUserStats": "Статистика пользователя",
|
||||||
"ButtonYes": "Да",
|
"ButtonYes": "Да",
|
||||||
"HeaderAccount": "Учетная запись",
|
"HeaderAccount": "Учетная запись",
|
||||||
@@ -310,6 +314,7 @@
|
|||||||
"MessageNoItems": "Нет элементов",
|
"MessageNoItems": "Нет элементов",
|
||||||
"MessageNoItemsFound": "Элементы не найдены",
|
"MessageNoItemsFound": "Элементы не найдены",
|
||||||
"MessageNoListeningSessions": "Нет сеансов прослушивания",
|
"MessageNoListeningSessions": "Нет сеансов прослушивания",
|
||||||
|
"MessageNoLogs": "Нет записей",
|
||||||
"MessageNoMediaFolders": "Нет папок мультимедиа",
|
"MessageNoMediaFolders": "Нет папок мультимедиа",
|
||||||
"MessageNoNetworkConnection": "Нет подключения к сети",
|
"MessageNoNetworkConnection": "Нет подключения к сети",
|
||||||
"MessageNoPodcastsFound": "Подкасты не найдены",
|
"MessageNoPodcastsFound": "Подкасты не найдены",
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
"ButtonCancel": "Prekliči",
|
"ButtonCancel": "Prekliči",
|
||||||
"ButtonCancelTimer": "Prekliči časovnik",
|
"ButtonCancelTimer": "Prekliči časovnik",
|
||||||
"ButtonClearFilter": "Počisti filter",
|
"ButtonClearFilter": "Počisti filter",
|
||||||
|
"ButtonClearLogs": "Počisti dnevnike",
|
||||||
"ButtonCloseFeed": "Zapri vir",
|
"ButtonCloseFeed": "Zapri vir",
|
||||||
"ButtonCollections": "Zbirke",
|
"ButtonCollections": "Zbirke",
|
||||||
"ButtonConnect": "Poveži",
|
"ButtonConnect": "Poveži",
|
||||||
@@ -26,7 +27,9 @@
|
|||||||
"ButtonLatest": "Najnovejše",
|
"ButtonLatest": "Najnovejše",
|
||||||
"ButtonLibrary": "Knjižnica",
|
"ButtonLibrary": "Knjižnica",
|
||||||
"ButtonLocalMedia": "Lokalni mediji",
|
"ButtonLocalMedia": "Lokalni mediji",
|
||||||
|
"ButtonLogs": "Dnevniki",
|
||||||
"ButtonManageLocalFiles": "Upravljanje lokalnih datotek",
|
"ButtonManageLocalFiles": "Upravljanje lokalnih datotek",
|
||||||
|
"ButtonMaskServerAddress": "Zakrij naslov strežnika",
|
||||||
"ButtonNewFolder": "Nova mapa",
|
"ButtonNewFolder": "Nova mapa",
|
||||||
"ButtonNextEpisode": "Naslednja epizoda",
|
"ButtonNextEpisode": "Naslednja epizoda",
|
||||||
"ButtonOk": "V redu",
|
"ButtonOk": "V redu",
|
||||||
@@ -50,6 +53,7 @@
|
|||||||
"ButtonStream": "Pretakaj",
|
"ButtonStream": "Pretakaj",
|
||||||
"ButtonSubmit": "Potrdi",
|
"ButtonSubmit": "Potrdi",
|
||||||
"ButtonSwitchServerUser": "Preklopi strežnik/uporabnik",
|
"ButtonSwitchServerUser": "Preklopi strežnik/uporabnik",
|
||||||
|
"ButtonUnmaskServerAddress": "Odkrij naslov strežnika",
|
||||||
"ButtonUserStats": "Uporabniška statistika",
|
"ButtonUserStats": "Uporabniška statistika",
|
||||||
"ButtonYes": "Da",
|
"ButtonYes": "Da",
|
||||||
"HeaderAccount": "Račun",
|
"HeaderAccount": "Račun",
|
||||||
@@ -310,6 +314,7 @@
|
|||||||
"MessageNoItems": "Ni elementov",
|
"MessageNoItems": "Ni elementov",
|
||||||
"MessageNoItemsFound": "Ni najdenih elementov",
|
"MessageNoItemsFound": "Ni najdenih elementov",
|
||||||
"MessageNoListeningSessions": "Ni sej poslušanja",
|
"MessageNoListeningSessions": "Ni sej poslušanja",
|
||||||
|
"MessageNoLogs": "Ni dnevnikov",
|
||||||
"MessageNoMediaFolders": "Brez medijskih map",
|
"MessageNoMediaFolders": "Brez medijskih map",
|
||||||
"MessageNoNetworkConnection": "Ni omrežne povezave",
|
"MessageNoNetworkConnection": "Ni omrežne povezave",
|
||||||
"MessageNoPodcastsFound": "Ni podcastov",
|
"MessageNoPodcastsFound": "Ni podcastov",
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
"ButtonCancel": "Скасувати",
|
"ButtonCancel": "Скасувати",
|
||||||
"ButtonCancelTimer": "Скасувати таймер",
|
"ButtonCancelTimer": "Скасувати таймер",
|
||||||
"ButtonClearFilter": "Скинути фільтри",
|
"ButtonClearFilter": "Скинути фільтри",
|
||||||
|
"ButtonClearLogs": "Очистити журнали",
|
||||||
"ButtonCloseFeed": "Закрити стрічку",
|
"ButtonCloseFeed": "Закрити стрічку",
|
||||||
"ButtonCollections": "Добірки",
|
"ButtonCollections": "Добірки",
|
||||||
"ButtonConnect": "Підключитися",
|
"ButtonConnect": "Підключитися",
|
||||||
@@ -28,6 +29,7 @@
|
|||||||
"ButtonLocalMedia": "Локальні файли",
|
"ButtonLocalMedia": "Локальні файли",
|
||||||
"ButtonLogs": "Журнали",
|
"ButtonLogs": "Журнали",
|
||||||
"ButtonManageLocalFiles": "Керування локальними файлами",
|
"ButtonManageLocalFiles": "Керування локальними файлами",
|
||||||
|
"ButtonMaskServerAddress": "Маска адреси сервера",
|
||||||
"ButtonNewFolder": "Нова тека",
|
"ButtonNewFolder": "Нова тека",
|
||||||
"ButtonNextEpisode": "Наступний епізод",
|
"ButtonNextEpisode": "Наступний епізод",
|
||||||
"ButtonOk": "Добре",
|
"ButtonOk": "Добре",
|
||||||
@@ -51,6 +53,7 @@
|
|||||||
"ButtonStream": "Транслювати",
|
"ButtonStream": "Транслювати",
|
||||||
"ButtonSubmit": "Ввести",
|
"ButtonSubmit": "Ввести",
|
||||||
"ButtonSwitchServerUser": "Змінити сервер/користувача",
|
"ButtonSwitchServerUser": "Змінити сервер/користувача",
|
||||||
|
"ButtonUnmaskServerAddress": "Розкрити адресу сервера",
|
||||||
"ButtonUserStats": "Статистика",
|
"ButtonUserStats": "Статистика",
|
||||||
"ButtonYes": "Так",
|
"ButtonYes": "Так",
|
||||||
"HeaderAccount": "Профіль",
|
"HeaderAccount": "Профіль",
|
||||||
@@ -311,6 +314,7 @@
|
|||||||
"MessageNoItems": "Елементи відсутні",
|
"MessageNoItems": "Елементи відсутні",
|
||||||
"MessageNoItemsFound": "Елементів не знайдено",
|
"MessageNoItemsFound": "Елементів не знайдено",
|
||||||
"MessageNoListeningSessions": "Сеанси прослуховування відсутні",
|
"MessageNoListeningSessions": "Сеанси прослуховування відсутні",
|
||||||
|
"MessageNoLogs": "Без журналів",
|
||||||
"MessageNoMediaFolders": "Теки медіа відсутні",
|
"MessageNoMediaFolders": "Теки медіа відсутні",
|
||||||
"MessageNoNetworkConnection": "Немає підключення до мережі",
|
"MessageNoNetworkConnection": "Немає підключення до мережі",
|
||||||
"MessageNoPodcastsFound": "Подкастів не знайдено",
|
"MessageNoPodcastsFound": "Подкастів не знайдено",
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
"ButtonCancel": "取消",
|
"ButtonCancel": "取消",
|
||||||
"ButtonCancelTimer": "取消计时器",
|
"ButtonCancelTimer": "取消计时器",
|
||||||
"ButtonClearFilter": "清除过滤器",
|
"ButtonClearFilter": "清除过滤器",
|
||||||
|
"ButtonClearLogs": "清除日志",
|
||||||
"ButtonCloseFeed": "关闭源",
|
"ButtonCloseFeed": "关闭源",
|
||||||
"ButtonCollections": "收藏",
|
"ButtonCollections": "收藏",
|
||||||
"ButtonConnect": "连接",
|
"ButtonConnect": "连接",
|
||||||
@@ -26,7 +27,9 @@
|
|||||||
"ButtonLatest": "最新",
|
"ButtonLatest": "最新",
|
||||||
"ButtonLibrary": "媒体库",
|
"ButtonLibrary": "媒体库",
|
||||||
"ButtonLocalMedia": "本地媒体",
|
"ButtonLocalMedia": "本地媒体",
|
||||||
|
"ButtonLogs": "日志",
|
||||||
"ButtonManageLocalFiles": "管理本地文件",
|
"ButtonManageLocalFiles": "管理本地文件",
|
||||||
|
"ButtonMaskServerAddress": "屏蔽服务器地址",
|
||||||
"ButtonNewFolder": "新建文件夹",
|
"ButtonNewFolder": "新建文件夹",
|
||||||
"ButtonNextEpisode": "下一集",
|
"ButtonNextEpisode": "下一集",
|
||||||
"ButtonOk": "确定",
|
"ButtonOk": "确定",
|
||||||
@@ -50,6 +53,7 @@
|
|||||||
"ButtonStream": "串流播放",
|
"ButtonStream": "串流播放",
|
||||||
"ButtonSubmit": "提交",
|
"ButtonSubmit": "提交",
|
||||||
"ButtonSwitchServerUser": "切换服务器/用户",
|
"ButtonSwitchServerUser": "切换服务器/用户",
|
||||||
|
"ButtonUnmaskServerAddress": "取消屏蔽服务器地址",
|
||||||
"ButtonUserStats": "用户统计信息",
|
"ButtonUserStats": "用户统计信息",
|
||||||
"ButtonYes": "确定",
|
"ButtonYes": "确定",
|
||||||
"HeaderAccount": "帐户",
|
"HeaderAccount": "帐户",
|
||||||
@@ -310,6 +314,7 @@
|
|||||||
"MessageNoItems": "无项目",
|
"MessageNoItems": "无项目",
|
||||||
"MessageNoItemsFound": "未找到任何项目",
|
"MessageNoItemsFound": "未找到任何项目",
|
||||||
"MessageNoListeningSessions": "无收听会话",
|
"MessageNoListeningSessions": "无收听会话",
|
||||||
|
"MessageNoLogs": "无日志",
|
||||||
"MessageNoMediaFolders": "没有媒体文件夹",
|
"MessageNoMediaFolders": "没有媒体文件夹",
|
||||||
"MessageNoNetworkConnection": "无网络连接",
|
"MessageNoNetworkConnection": "无网络连接",
|
||||||
"MessageNoPodcastsFound": "未找到播客",
|
"MessageNoPodcastsFound": "未找到播客",
|
||||||
|
|||||||
Reference in New Issue
Block a user