Compare commits

..

No commits in common. "main" and "v2.0.0-alpha.1" have entirely different histories.

36 changed files with 1668 additions and 2516 deletions

View File

@ -23,14 +23,10 @@ A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Device**
- Model: [e.g. Pixel 4]
**Smartphone (please complete the following information):**
- Device: [e.g. Pixel 4]
- OS: [e.g. Android 12]
- Subtracks version [e.g. 1.2.0]
**Server**
- Software: [e.g. Navidrome]
- Version: [e.g. 0.49.3]
**Additional context**
Add any other context about the problem here.

View File

@ -22,8 +22,6 @@
"resourcesSortByTitle",
"resourcesSortByUpdated",
"settingsAboutActionsSupport",
"settingsAboutShareLogs",
"settingsAboutChooseLog",
"settingsNetworkOptionsOfflineMode",
"settingsNetworkOptionsOfflineModeOff",
"settingsNetworkOptionsOfflineModeOn",
@ -55,8 +53,6 @@
"resourcesSortByTitle",
"resourcesSortByUpdated",
"settingsAboutActionsSupport",
"settingsAboutShareLogs",
"settingsAboutChooseLog",
"settingsNetworkOptionsOfflineMode",
"settingsNetworkOptionsOfflineModeOff",
"settingsNetworkOptionsOfflineModeOn",
@ -66,12 +62,32 @@
],
"cs": [
"actionsCancel",
"actionsDelete",
"actionsDownload",
"actionsDownloadCancel",
"actionsDownloadDelete",
"actionsOk",
"controlsShuffle",
"resourcesAlbumCount",
"resourcesArtistCount",
"resourcesFilterAlbum",
"resourcesFilterArtist",
"resourcesFilterOwner",
"resourcesFilterYear",
"resourcesPlaylistCount",
"resourcesSongCount",
"settingsAboutShareLogs",
"settingsAboutChooseLog",
"resourcesSongListDeleteAllContent",
"resourcesSongListDeleteAllTitle",
"resourcesSortByAlbum",
"resourcesSortByAlbumCount",
"resourcesSortByTitle",
"resourcesSortByUpdated",
"settingsAboutActionsLicenses",
"settingsAboutActionsProjectHomepage",
"settingsAboutActionsSupport",
"settingsAboutName",
"settingsAboutVersion",
"settingsMusicName",
"settingsMusicOptionsScrobbleDescriptionOff",
"settingsMusicOptionsScrobbleDescriptionOn",
@ -80,7 +96,12 @@
"settingsNetworkOptionsMinBufferTitle",
"settingsNetworkOptionsOfflineMode",
"settingsNetworkOptionsOfflineModeOff",
"settingsNetworkOptionsOfflineModeOn"
"settingsNetworkOptionsOfflineModeOn",
"settingsNetworkOptionsStreamFormat",
"settingsNetworkOptionsStreamFormatServerDefault",
"settingsResetActionsClearImageCache",
"settingsResetName",
"settingsServersFieldsName"
],
"da": [
@ -112,8 +133,6 @@
"resourcesSortByTitle",
"resourcesSortByUpdated",
"settingsAboutActionsSupport",
"settingsAboutShareLogs",
"settingsAboutChooseLog",
"settingsMusicOptionsScrobbleDescriptionOff",
"settingsNetworkOptionsOfflineMode",
"settingsNetworkOptionsOfflineModeOff",
@ -127,11 +146,44 @@
],
"de": [
"settingsAboutShareLogs",
"settingsAboutChooseLog"
],
"es": [
"actionsCancel",
"actionsDelete",
"actionsDownload",
"actionsDownloadCancel",
"actionsDownloadDelete",
"actionsOk",
"controlsShuffle",
"resourcesAlbumCount",
"resourcesArtistCount",
"resourcesFilterAlbum",
"resourcesFilterArtist",
"resourcesFilterOwner",
"resourcesFilterYear",
"resourcesPlaylistCount",
"resourcesSongCount",
"resourcesSongListDeleteAllContent",
"resourcesSongListDeleteAllTitle",
"resourcesSortByAlbum",
"resourcesSortByAlbumCount",
"resourcesSortByTitle",
"resourcesSortByUpdated",
"settingsAboutActionsSupport",
"settingsNetworkOptionsOfflineMode",
"settingsNetworkOptionsOfflineModeOff",
"settingsNetworkOptionsOfflineModeOn",
"settingsNetworkOptionsStreamFormat",
"settingsNetworkOptionsStreamFormatServerDefault",
"settingsServersFieldsName"
],
"es": [
"actionsCancel",
"actionsDelete",
"actionsDownload",
"actionsDownloadCancel",
"actionsDownloadDelete",
"actionsOk",
"controlsShuffle",
"resourcesAlbumCount",
"resourcesArtistCount",
"resourcesFilterAlbum",
@ -147,8 +199,6 @@
"resourcesSortByTitle",
"resourcesSortByUpdated",
"settingsAboutActionsSupport",
"settingsAboutShareLogs",
"settingsAboutChooseLog",
"settingsNetworkOptionsOfflineMode",
"settingsNetworkOptionsOfflineModeOff",
"settingsNetworkOptionsOfflineModeOn",
@ -180,8 +230,37 @@
"resourcesSortByTitle",
"resourcesSortByUpdated",
"settingsAboutActionsSupport",
"settingsAboutShareLogs",
"settingsAboutChooseLog",
"settingsNetworkOptionsOfflineMode",
"settingsNetworkOptionsOfflineModeOff",
"settingsNetworkOptionsOfflineModeOn",
"settingsNetworkOptionsStreamFormat",
"settingsNetworkOptionsStreamFormatServerDefault",
"settingsServersFieldsName"
],
"gl": [
"actionsCancel",
"actionsDelete",
"actionsDownload",
"actionsDownloadCancel",
"actionsDownloadDelete",
"actionsOk",
"controlsShuffle",
"resourcesAlbumCount",
"resourcesArtistCount",
"resourcesFilterAlbum",
"resourcesFilterArtist",
"resourcesFilterOwner",
"resourcesFilterYear",
"resourcesPlaylistCount",
"resourcesSongCount",
"resourcesSongListDeleteAllContent",
"resourcesSongListDeleteAllTitle",
"resourcesSortByAlbum",
"resourcesSortByAlbumCount",
"resourcesSortByTitle",
"resourcesSortByUpdated",
"settingsAboutActionsSupport",
"settingsNetworkOptionsOfflineMode",
"settingsNetworkOptionsOfflineModeOff",
"settingsNetworkOptionsOfflineModeOn",
@ -213,8 +292,6 @@
"resourcesSortByTitle",
"resourcesSortByUpdated",
"settingsAboutActionsSupport",
"settingsAboutShareLogs",
"settingsAboutChooseLog",
"settingsNetworkOptionsOfflineMode",
"settingsNetworkOptionsOfflineModeOff",
"settingsNetworkOptionsOfflineModeOn",
@ -266,8 +343,6 @@
"settingsAboutActionsLicenses",
"settingsAboutActionsSupport",
"settingsAboutName",
"settingsAboutShareLogs",
"settingsAboutChooseLog",
"settingsAboutVersion",
"settingsMusicOptionsScrobbleDescriptionOff",
"settingsMusicOptionsScrobbleDescriptionOn",
@ -324,8 +399,6 @@
"resourcesSortByTitle",
"resourcesSortByUpdated",
"settingsAboutActionsSupport",
"settingsAboutShareLogs",
"settingsAboutChooseLog",
"settingsNetworkOptionsOfflineMode",
"settingsNetworkOptionsOfflineModeOff",
"settingsNetworkOptionsOfflineModeOn",
@ -357,8 +430,6 @@
"resourcesSortByTitle",
"resourcesSortByUpdated",
"settingsAboutActionsSupport",
"settingsAboutShareLogs",
"settingsAboutChooseLog",
"settingsNetworkOptionsOfflineMode",
"settingsNetworkOptionsOfflineModeOff",
"settingsNetworkOptionsOfflineModeOn",
@ -390,8 +461,6 @@
"resourcesSortByTitle",
"resourcesSortByUpdated",
"settingsAboutActionsSupport",
"settingsAboutShareLogs",
"settingsAboutChooseLog",
"settingsNetworkOptionsOfflineMode",
"settingsNetworkOptionsOfflineModeOff",
"settingsNetworkOptionsOfflineModeOn",
@ -401,17 +470,63 @@
],
"pt": [
"actionsCancel",
"actionsDelete",
"actionsDownload",
"actionsDownloadCancel",
"actionsDownloadDelete",
"actionsOk",
"controlsShuffle",
"resourcesAlbumCount",
"resourcesArtistCount",
"resourcesFilterAlbum",
"resourcesFilterArtist",
"resourcesFilterOwner",
"resourcesFilterYear",
"resourcesPlaylistCount",
"resourcesSongCount",
"resourcesSongListDeleteAllContent",
"resourcesSongListDeleteAllTitle",
"resourcesSortByAlbum",
"resourcesSortByAlbumCount",
"resourcesSortByTitle",
"resourcesSortByUpdated",
"settingsAboutShareLogs",
"settingsAboutChooseLog",
"settingsAboutActionsSupport",
"settingsNetworkOptionsOfflineMode",
"settingsNetworkOptionsOfflineModeOff",
"settingsNetworkOptionsOfflineModeOn",
"settingsNetworkOptionsStreamFormat",
"settingsNetworkOptionsStreamFormatServerDefault",
"settingsServersFieldsName"
],
"ru": [
"actionsCancel",
"actionsDelete",
"actionsDownload",
"actionsDownloadCancel",
"actionsDownloadDelete",
"actionsOk",
"controlsShuffle",
"resourcesAlbumCount",
"resourcesArtistCount",
"resourcesFilterAlbum",
"resourcesFilterArtist",
"resourcesFilterOwner",
"resourcesFilterYear",
"resourcesPlaylistCount",
"resourcesSongCount",
"resourcesSongListDeleteAllContent",
"resourcesSongListDeleteAllTitle",
"resourcesSortByAlbum",
"resourcesSortByAlbumCount",
"resourcesSortByTitle",
"resourcesSortByUpdated",
"settingsAboutActionsSupport",
"settingsNetworkOptionsOfflineMode",
"settingsNetworkOptionsOfflineModeOff",
"settingsNetworkOptionsOfflineModeOn",
"settingsNetworkOptionsStreamFormat",
"settingsNetworkOptionsStreamFormatServerDefault",
"settingsServersFieldsName"
],
@ -439,8 +554,6 @@
"resourcesSortByTitle",
"resourcesSortByUpdated",
"settingsAboutActionsSupport",
"settingsAboutShareLogs",
"settingsAboutChooseLog",
"settingsNetworkOptionsOfflineMode",
"settingsNetworkOptionsOfflineModeOff",
"settingsNetworkOptionsOfflineModeOn",
@ -472,8 +585,6 @@
"resourcesSortByTitle",
"resourcesSortByUpdated",
"settingsAboutActionsSupport",
"settingsAboutShareLogs",
"settingsAboutChooseLog",
"settingsNetworkOptionsOfflineMode",
"settingsNetworkOptionsOfflineModeOff",
"settingsNetworkOptionsOfflineModeOn",
@ -483,13 +594,28 @@
],
"zh": [
"actionsCancel",
"actionsDelete",
"actionsDownload",
"actionsDownloadCancel",
"actionsDownloadDelete",
"actionsOk",
"controlsShuffle",
"resourcesAlbumCount",
"resourcesArtistCount",
"resourcesFilterAlbum",
"resourcesFilterArtist",
"resourcesFilterOwner",
"resourcesFilterYear",
"resourcesPlaylistCount",
"resourcesSongCount",
"settingsAboutShareLogs",
"settingsAboutChooseLog",
"resourcesSongListDeleteAllContent",
"resourcesSongListDeleteAllTitle",
"resourcesSortByAlbum",
"resourcesSortByAlbumCount",
"resourcesSortByTitle",
"resourcesSortByUpdated",
"settingsAboutActionsSupport",
"settingsNetworkOptionsOfflineMode",
"settingsNetworkOptionsOfflineModeOff",
"settingsNetworkOptionsOfflineModeOn",

62
TODO.md
View File

@ -1,30 +1,34 @@
## To-do
- Star/unstar
- Context menus
- Download actions for song
- Playlist management
- Add to playlist (from context)
- Queue management
- View playing queue
- Re-order queue
- Add to queue (from context)
- Remove from queue
- Scrobbling
- Library filters (year/genre/etc)
- Library list display modes
- Search
- Individual "more" results pages
- Now playing gestures
- Swipe bar/album to skip
- Double-tap to seek forward/back (bar only)
- Settings
- Music
- Scrobble
- Downloads
- Used/available space
- Clear downloads
- Clear images
- About
- Licenses
- Welcome/setup flow
- Proper loading screen/animation
- [ ] Star/unstar
- [ ] Context menus
- [ ] Download actions for song
- [ ] Playlist management
- [ ] Add to playlist (from context)
- [ ] Queue management
- [ ] View playing queue
- [ ] Re-order queue
- [ ] Add to queue (from context)
- [ ] Remove from queue
- [ ] Scrobbling
- [ ] Library filters (year/genre/etc)
- [ ] Library list display modes
- [ ] Search
- [ ] Individual "more" results pages
- [ ] Radio modes
- [ ] Artist
- [ ] Now playing gestures
- [ ] Swipe bar/album to skip
- [ ] Double-tap to seek forward/back (bar only)
- [ ] Settings
- [ ] Sources
- [ ] Use plaintext password
- [ ] Music
- [ ] Scrobble
- [ ] Downloads
- [ ] Used/available space
- [ ] Clear downloads
- [ ] Clear images
- [ ] About
- [ ] Licenses
- [ ] Welcome/setup flow
- [ ] Proper loading screen/animation

View File

@ -1,4 +1,3 @@
import 'package:fast_immutable_collections/fast_immutable_collections.dart';
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
@ -78,8 +77,7 @@ class App extends HookConsumerWidget {
),
routeInformationParser: appRouter.defaultRouteParser(),
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: [...AppLocalizations.supportedLocales]
..moveToTheFront(const Locale('en')),
supportedLocales: AppLocalizations.supportedLocales,
);
}
}

View File

@ -4,7 +4,6 @@ import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart';
import '../services/sync_service.dart';
import 'items.dart';
import 'snackbars.dart';
class PagedListQueryView<T> extends HookConsumerWidget {
final PagingController<int, T> pagingController;
@ -123,13 +122,7 @@ class SyncAllRefresh extends HookConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
return RefreshIndicator(
onRefresh: () async {
try {
await ref.read(syncServiceProvider.notifier).syncAll();
} catch (e) {
showErrorSnackbar(context, e.toString());
}
},
onRefresh: () => ref.read(syncServiceProvider.notifier).syncAll(),
child: child,
);
}

View File

@ -1,19 +1,13 @@
import 'dart:math';
import 'package:auto_route/auto_route.dart';
import 'package:fast_immutable_collections/fast_immutable_collections.dart';
import 'package:flutter/material.dart';
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import '../../database/database.dart';
import '../../models/query.dart';
import '../../models/support.dart';
import '../../services/audio_service.dart';
import '../../state/music.dart';
import '../../state/settings.dart';
import '../app_router.dart';
import '../buttons.dart';
import '../images.dart';
import '../items.dart';
@ -33,26 +27,6 @@ class ArtistPage extends HookConsumerWidget {
final albums = ref.watch(albumsByArtistIdProvider(id));
return Scaffold(
floatingActionButton: RadioPlayFab(
onPressed: () => artist.hasValue
? ref.read(audioControlProvider).playRadio(
context: QueueContextType.artist,
contextId: artist.valueOrNull!.id,
query: ListQuery(
filters: IList([
FilterWith.equals(
column: 'artist_id',
value: artist.valueOrNull!.id,
)
]),
),
getSongs: (query) => ref
.read(databaseProvider)
.songsList(ref.read(sourceIdProvider), query)
.get(),
)
: null,
),
body: CustomScrollView(
slivers: [
SliverToBoxAdapter(

View File

@ -1,16 +1,11 @@
import 'dart:math';
import 'package:auto_route/auto_route.dart';
import 'package:fast_immutable_collections/fast_immutable_collections.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:path/path.dart' as p;
import 'package:share_plus/share_plus.dart';
import 'package:url_launcher/url_launcher.dart';
import '../../log.dart';
import '../../models/support.dart';
import '../../services/settings_service.dart';
import '../../state/init.dart';
@ -167,54 +162,6 @@ class _About extends HookConsumerWidget {
mode: LaunchMode.externalApplication,
),
),
const SizedBox(height: 12),
const _ShareLogsButton(),
],
);
}
}
class _ShareLogsButton extends StatelessWidget {
const _ShareLogsButton();
@override
Widget build(BuildContext context) {
final l = AppLocalizations.of(context);
return Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
OutlinedButton.icon(
icon: const Icon(Icons.share),
label: Text(l.settingsAboutShareLogs),
onPressed: () async {
final files = await logFiles();
if (files.isEmpty) return;
// ignore: use_build_context_synchronously
final value = await showDialog<String>(
context: context,
builder: (context) => MultipleChoiceDialog<String>(
title: l.settingsAboutChooseLog,
current: files.first.path,
options: files
.map((e) => MultiChoiceOption.string(
title: p.basename(e.path),
option: e.path,
))
.toIList(),
),
);
if (value == null) return;
Share.shareXFiles(
[XFile(value, mimeType: 'text/plain')],
subject: 'Logs from subtracks: ${String.fromCharCodes(
List.generate(8, (_) => Random().nextInt(26) + 65),
)}',
);
},
),
],
);
}

View File

@ -8,11 +8,9 @@ import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import '../../database/database.dart';
import '../../log.dart';
import '../../models/settings.dart';
import '../../services/settings_service.dart';
import '../items.dart';
import '../snackbars.dart';
class SourcePage extends HookConsumerWidget {
final int? id;
@ -43,10 +41,9 @@ class SourcePage extends HookConsumerWidget {
label: l.settingsServersFieldsAddress,
initialValue: source?.address.toString(),
keyboardType: TextInputType.url,
autofillHints: const [AutofillHints.url],
required: true,
validator: (value, label) {
if (!value!.contains(RegExp(r'https?:\/\/'))) {
if (Uri.tryParse(value!) == null) {
return '$label must be a valid URL';
}
return null;
@ -55,27 +52,15 @@ class SourcePage extends HookConsumerWidget {
final username = LabeledTextField(
label: l.settingsServersFieldsUsername,
initialValue: source?.username,
autofillHints: const [AutofillHints.username],
required: true,
);
final password = LabeledTextField(
label: l.settingsServersFieldsPassword,
initialValue: source?.password,
obscureText: true,
autofillHints: const [AutofillHints.password],
required: true,
);
final forcePlaintextPassword = useState(!(source?.useTokenAuth ?? true));
final forcePlaintextSwitch = SwitchListTile(
value: forcePlaintextPassword.value,
title: Text(l.settingsServersOptionsForcePlaintextPasswordTitle),
subtitle: forcePlaintextPassword.value
? Text(l.settingsServersOptionsForcePlaintextPasswordDescriptionOn)
: Text(l.settingsServersOptionsForcePlaintextPasswordDescriptionOff),
onChanged: (value) => forcePlaintextPassword.value = value,
);
return WillPopScope(
onWillPop: () async => !isSaving.value && !isDeleting.value,
child: Scaffold(
@ -143,7 +128,6 @@ class SourcePage extends HookConsumerWidget {
address: Uri.parse(address.value),
username: username.value,
password: password.value,
useTokenAuth: !forcePlaintextPassword.value,
),
);
} else {
@ -158,14 +142,12 @@ class SourcePage extends HookConsumerWidget {
features: IList(),
username: username.value,
password: password.value,
useTokenAuth:
Value(!forcePlaintextPassword.value),
useTokenAuth: const Value(true),
),
);
}
} catch (e, st) {
showErrorSnackbar(context, e.toString());
log.severe('Saving source', e, st);
} catch (err) {
// TOOD: toast the error or whatever
error = true;
} finally {
isSaving.value = false;
@ -181,25 +163,21 @@ class SourcePage extends HookConsumerWidget {
),
body: Form(
key: form,
child: AutofillGroup(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 24),
child: ListView(
children: [
const SizedBox(height: 96 - kToolbarHeight),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Text(
source == null
? l.settingsServersActionsAdd
: l.settingsServersActionsEdit,
style: theme.textTheme.displaySmall,
),
Text(
source == null
? l.settingsServersActionsAdd
: l.settingsServersActionsEdit,
style: theme.textTheme.displaySmall,
),
name,
address,
username,
password,
const SizedBox(height: 24),
forcePlaintextSwitch,
const FabPadding(),
],
),
@ -216,7 +194,6 @@ class LabeledTextField extends HookConsumerWidget {
final bool obscureText;
final bool required;
final TextInputType? keyboardType;
final Iterable<String>? autofillHints;
final String? Function(String? value, String label)? validator;
// ignore: prefer_const_constructors_in_immutables
@ -227,7 +204,6 @@ class LabeledTextField extends HookConsumerWidget {
this.obscureText = false,
this.keyboardType,
this.validator,
this.autofillHints,
this.required = false,
});
@ -248,36 +224,35 @@ class LabeledTextField extends HookConsumerWidget {
final theme = Theme.of(context);
_controller = useTextEditingController(text: initialValue);
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const SizedBox(height: 24),
Text(label, style: theme.textTheme.titleMedium),
TextFormField(
controller: _controller,
obscureText: obscureText,
keyboardType: keyboardType,
autofillHints: autofillHints,
validator: (value) {
String? error;
return Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const SizedBox(height: 24),
Text(
label,
style: theme.textTheme.titleMedium,
),
TextFormField(
controller: _controller,
obscureText: obscureText,
keyboardType: keyboardType,
validator: (value) {
String? error;
if (required) {
error = _requiredValidator(value);
if (error != null) {
return error;
}
if (required) {
error = _requiredValidator(value);
if (error != null) {
return error;
}
}
if (validator != null) {
return validator!(value, label);
}
return null;
},
),
],
),
if (validator != null) {
return validator!(value, label);
}
return null;
},
),
],
);
}
}

View File

@ -1,14 +0,0 @@
import 'package:flutter/material.dart';
void showErrorSnackbar(BuildContext context, String message) {
final colors = Theme.of(context).colorScheme;
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(message, style: TextStyle(color: colors.onErrorContainer)),
backgroundColor: colors.errorContainer,
showCloseIcon: true,
closeIconColor: colors.onErrorContainer,
behavior: SnackBarBehavior.floating,
duration: const Duration(seconds: 10),
));
}

View File

@ -9,20 +9,14 @@ import 'package:path/path.dart' as p;
import 'package:path_provider/path_provider.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import '../log.dart';
import '../models/music.dart';
import '../models/query.dart';
import '../models/settings.dart';
import '../models/support.dart';
import 'converters.dart';
import 'error_logging_database.dart';
part 'database.g.dart';
// don't exceed SQLITE_MAX_VARIABLE_NUMBER (32766 for version >= 3.32.0)
// https://www.sqlite.org/limits.html
const kSqliteMaxVariableNumber = 32766;
@DriftDatabase(include: {'tables.drift'})
class SubtracksDatabase extends _$SubtracksDatabase {
SubtracksDatabase() : super(_openConnection());
@ -175,27 +169,12 @@ class SubtracksDatabase extends _$SubtracksDatabase {
});
}
Future<void> deleteArtistsNotIn(int sourceId, Set<String> ids) {
return transaction(() async {
final allIds = (await (selectOnly(artists)
..addColumns([artists.id])
..where(artists.sourceId.equals(sourceId)))
.map((row) => row.read(artists.id))
.get())
.whereNotNull()
.toSet();
final downloadIds = (await artistIdsWithDownloadStatus(sourceId).get())
.whereNotNull()
.toSet();
final diff = allIds.difference(downloadIds).difference(ids);
for (var slice in diff.slices(kSqliteMaxVariableNumber)) {
await (delete(artists)
..where(
(tbl) => tbl.sourceId.equals(sourceId) & tbl.id.isIn(slice)))
.go();
}
});
Future<void> deleteArtistsNotIn(int sourceId, Iterable<String> ids) async {
await (delete(artists)
..where(
(tbl) => tbl.sourceId.equals(sourceId) & tbl.id.isNotIn(ids),
))
.go();
}
Future<void> saveAlbums(Iterable<AlbumsCompanion> albums) async {
@ -204,27 +183,15 @@ class SubtracksDatabase extends _$SubtracksDatabase {
});
}
Future<void> deleteAlbumsNotIn(int sourceId, Set<String> ids) {
return transaction(() async {
final allIds = (await (selectOnly(albums)
..addColumns([albums.id])
..where(albums.sourceId.equals(sourceId)))
.map((row) => row.read(albums.id))
.get())
.whereNotNull()
.toSet();
final downloadIds = (await albumIdsWithDownloadStatus(sourceId).get())
.whereNotNull()
.toSet();
Future<void> deleteAlbumsNotIn(int sourceId, Iterable<String> ids) async {
final alsoKeep = (await albumIdsWithDownloaded(sourceId).get()).toSet();
final diff = allIds.difference(downloadIds).difference(ids);
for (var slice in diff.slices(kSqliteMaxVariableNumber)) {
await (delete(albums)
..where(
(tbl) => tbl.sourceId.equals(sourceId) & tbl.id.isIn(slice)))
.go();
}
});
ids = ids.toList()..addAll(alsoKeep);
await (delete(albums)
..where(
(tbl) => tbl.sourceId.equals(sourceId) & tbl.id.isNotIn(ids),
))
.go();
}
Future<void> savePlaylists(
@ -248,31 +215,18 @@ class SubtracksDatabase extends _$SubtracksDatabase {
});
}
Future<void> deletePlaylistsNotIn(int sourceId, Set<String> ids) {
return transaction(() async {
final allIds = (await (selectOnly(playlists)
..addColumns([playlists.id])
..where(playlists.sourceId.equals(sourceId)))
.map((row) => row.read(playlists.id))
.get())
.whereNotNull()
.toSet();
final downloadIds = (await playlistIdsWithDownloadStatus(sourceId).get())
.whereNotNull()
.toSet();
final diff = allIds.difference(downloadIds).difference(ids);
for (var slice in diff.slices(kSqliteMaxVariableNumber)) {
await (delete(playlists)
..where(
(tbl) => tbl.sourceId.equals(sourceId) & tbl.id.isIn(slice)))
.go();
await (delete(playlistSongs)
..where((tbl) =>
tbl.sourceId.equals(sourceId) & tbl.playlistId.isIn(slice)))
.go();
}
});
Future<void> deletePlaylistsNotIn(int sourceId, Iterable<String> ids) async {
await (delete(playlists)
..where(
(tbl) => tbl.sourceId.equals(sourceId) & tbl.id.isNotIn(ids),
))
.go();
await (delete(playlistSongs)
..where(
(tbl) =>
tbl.sourceId.equals(sourceId) & tbl.playlistId.isNotIn(ids),
))
.go();
}
Future<void> savePlaylistSongs(
@ -296,33 +250,29 @@ class SubtracksDatabase extends _$SubtracksDatabase {
});
}
Future<void> deleteSongsNotIn(int sourceId, Set<String> ids) {
return transaction(() async {
final allIds = (await (selectOnly(songs)
..addColumns([songs.id])
..where(
songs.sourceId.equals(sourceId) &
songs.downloadFilePath.isNull() &
songs.downloadTaskId.isNull(),
))
.map((row) => row.read(songs.id))
.get())
.whereNotNull()
.toSet();
final diff = allIds.difference(ids);
for (var slice in diff.slices(kSqliteMaxVariableNumber)) {
await (delete(songs)
..where(
(tbl) => tbl.sourceId.equals(sourceId) & tbl.id.isIn(slice)))
.go();
await (delete(playlistSongs)
..where(
(tbl) => tbl.sourceId.equals(sourceId) & tbl.songId.isIn(slice),
))
.go();
}
});
Future<void> deleteSongsNotIn(int sourceId, Iterable<String> ids) async {
await (delete(songs)
..where(
(tbl) =>
tbl.sourceId.equals(sourceId) &
tbl.id.isNotIn(ids) &
tbl.downloadFilePath.isNull() &
tbl.downloadTaskId.isNull(),
))
.go();
final remainingIds = (await (selectOnly(songs)
..addColumns([songs.id])
..where(songs.sourceId.equals(sourceId)))
.map((row) => row.read(songs.id))
.get())
.whereNotNull();
await (delete(playlistSongs)
..where(
(tbl) =>
tbl.sourceId.equals(sourceId) &
tbl.songId.isNotIn(remainingIds),
))
.go();
}
Selectable<LastBottomNavStateData> getLastBottomNavState() {
@ -437,11 +387,7 @@ LazyDatabase _openConnection() {
final dbFolder = await getApplicationDocumentsDirectory();
final file = File(p.join(dbFolder.path, 'subtracks.sqlite'));
// return NativeDatabase.createInBackground(file, logStatements: true);
return ErrorLoggingDatabase(
NativeDatabase.createInBackground(file),
(e, s) => log.severe('SQL error', e, s),
);
return NativeDatabase.createInBackground(file);
});
}

View File

@ -4596,7 +4596,7 @@ abstract class _$SubtracksDatabase extends GeneratedDatabase {
));
}
Selectable<String> albumIdsWithDownloadStatus(int sourceId) {
Selectable<String> albumIdsWithDownloaded(int sourceId) {
return customSelect(
'SELECT albums.id FROM albums JOIN songs ON songs.source_id = albums.source_id AND songs.album_id = albums.id WHERE albums.source_id = ?1 AND(songs.download_file_path IS NOT NULL OR songs.download_task_id IS NOT NULL)GROUP BY albums.id',
variables: [
@ -4608,32 +4608,6 @@ abstract class _$SubtracksDatabase extends GeneratedDatabase {
}).map((QueryRow row) => row.read<String>('id'));
}
Selectable<String> artistIdsWithDownloadStatus(int sourceId) {
return customSelect(
'SELECT artists.id FROM artists LEFT JOIN albums ON artists.source_id = albums.source_id AND artists.id = albums.artist_id LEFT JOIN songs ON albums.source_id = songs.source_id AND albums.id = songs.album_id WHERE artists.source_id = ?1 AND(songs.download_file_path IS NOT NULL OR songs.download_task_id IS NOT NULL)GROUP BY artists.id',
variables: [
Variable<int>(sourceId)
],
readsFrom: {
artists,
albums,
songs,
}).map((QueryRow row) => row.read<String>('id'));
}
Selectable<String> playlistIdsWithDownloadStatus(int sourceId) {
return customSelect(
'SELECT playlists.id FROM playlists LEFT JOIN playlist_songs ON playlist_songs.source_id = playlists.source_id AND playlist_songs.playlist_id = playlists.id LEFT JOIN songs ON playlist_songs.source_id = songs.source_id AND playlist_songs.song_id = songs.id WHERE playlists.source_id = ?1 AND(songs.download_file_path IS NOT NULL OR songs.download_task_id IS NOT NULL)GROUP BY playlists.id',
variables: [
Variable<int>(sourceId)
],
readsFrom: {
playlists,
playlistSongs,
songs,
}).map((QueryRow row) => row.read<String>('id'));
}
Selectable<int> searchArtists(String query, int limit, int offset) {
return customSelect(
'SELECT "rowid" FROM artists_fts WHERE artists_fts MATCH ?1 ORDER BY rank LIMIT ?2 OFFSET ?3',

View File

@ -1,94 +0,0 @@
import 'dart:async';
import 'package:drift/drift.dart';
import 'package:drift/isolate.dart';
/// https://github.com/simolus3/drift/issues/2326#issuecomment-1445138730
class ErrorLoggingDatabase implements QueryExecutor {
final QueryExecutor inner;
final void Function(Object, StackTrace) onError;
ErrorLoggingDatabase(this.inner, this.onError);
Future<T> _handleErrors<T>(Future<T> Function() body) {
return Future.sync(body)
.onError<DriftWrappedException>((error, stackTrace) {
onError(error, error.trace ?? stackTrace);
throw error;
}).onError<DriftRemoteException>((error, stackTrace) {
onError(error, error.remoteStackTrace ?? stackTrace);
throw error;
});
}
@override
TransactionExecutor beginTransaction() {
return _ErrorLoggingTransactionExecutor(inner.beginTransaction(), onError);
}
@override
Future<void> close() {
return _handleErrors(inner.close);
}
@override
SqlDialect get dialect => inner.dialect;
@override
Future<bool> ensureOpen(QueryExecutorUser user) {
return _handleErrors(() => inner.ensureOpen(user));
}
@override
Future<void> runBatched(BatchedStatements statements) {
return _handleErrors(() => inner.runBatched(statements));
}
@override
Future<void> runCustom(String statement, [List<Object?>? args]) {
return _handleErrors(() => inner.runCustom(statement, args));
}
@override
Future<int> runDelete(String statement, List<Object?> args) {
return _handleErrors(() => inner.runDelete(statement, args));
}
@override
Future<int> runInsert(String statement, List<Object?> args) {
return _handleErrors(() => inner.runInsert(statement, args));
}
@override
Future<List<Map<String, Object?>>> runSelect(
String statement, List<Object?> args) {
return _handleErrors(() => inner.runSelect(statement, args));
}
@override
Future<int> runUpdate(String statement, List<Object?> args) {
return _handleErrors(() => inner.runUpdate(statement, args));
}
}
class _ErrorLoggingTransactionExecutor extends ErrorLoggingDatabase
implements TransactionExecutor {
final TransactionExecutor transaction;
_ErrorLoggingTransactionExecutor(
this.transaction, void Function(Object, StackTrace) onError)
: super(transaction, onError);
@override
Future<void> rollback() {
return _handleErrors(transaction.rollback);
}
@override
Future<void> send() {
return _handleErrors(transaction.send);
}
@override
bool get supportsNestedTransactions => transaction.supportsNestedTransactions;
}

View File

@ -244,7 +244,7 @@ allSubsonicSources WITH SubsonicSettings:
FROM sources
JOIN subsonic_sources ON subsonic_sources.source_id = sources.id;
albumIdsWithDownloadStatus:
albumIdsWithDownloaded:
SELECT albums.id
FROM albums
JOIN songs on songs.source_id = albums.source_id AND songs.album_id = albums.id
@ -253,26 +253,6 @@ albumIdsWithDownloadStatus:
AND (songs.download_file_path IS NOT NULL OR songs.download_task_id IS NOT NULL)
GROUP BY albums.id;
artistIdsWithDownloadStatus:
SELECT artists.id
FROM artists
LEFT JOIN albums ON artists.source_id = albums.source_id AND artists.id = albums.artist_id
LEFT JOIN songs ON albums.source_id = songs.source_id AND albums.id = songs.album_id
WHERE
artists.source_id = :source_id
AND (songs.download_file_path IS NOT NULL OR songs.download_task_id IS NOT NULL)
GROUP BY artists.id;
playlistIdsWithDownloadStatus:
SELECT playlists.id
FROM playlists
LEFT JOIN playlist_songs ON playlist_songs.source_id = playlists.source_id AND playlist_songs.playlist_id = playlists.id
LEFT JOIN songs ON playlist_songs.source_id = songs.source_id AND playlist_songs.song_id = songs.id
WHERE
playlists.source_id = :source_id
AND (songs.download_file_path IS NOT NULL OR songs.download_task_id IS NOT NULL)
GROUP BY playlists.id;
searchArtists:
SELECT rowid
FROM artists_fts

View File

@ -1,8 +1,7 @@
import 'package:flutter/foundation.dart';
import 'package:http/http.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import '../log.dart';
part 'client.g.dart';
const Map<String, String> subtracksHeaders = {
@ -15,14 +14,8 @@ class SubtracksHttpClient extends BaseClient {
@override
Future<StreamedResponse> send(BaseRequest request) {
request.headers.addAll(subtracksHeaders);
log.info('${request.method} ${request.url}');
try {
return request.send();
} catch (e, st) {
log.severe('HTTP client: ${request.method} ${request.url}', e, st);
rethrow;
}
if (kDebugMode) print('${request.method} ${request.url}');
return request.send();
}
}

View File

@ -1,226 +1,166 @@
{
"actionsStar": "Ohodnotit",
"@actionsStar": {},
"actionsUnstar": "Zrušit hodnocení",
"@actionsUnstar": {},
"messagesNothingHere": "Zde nic není…",
"@messagesNothingHere": {},
"navigationTabsHome": "Domů",
"@navigationTabsHome": {},
"navigationTabsLibrary": "Knihovna",
"@navigationTabsLibrary": {},
"navigationTabsSearch": "Hledat",
"@navigationTabsSearch": {},
"navigationTabsSettings": "Nastavení",
"@navigationTabsSettings": {},
"resourcesAlbumActionsPlay": "Přehrát album",
"@resourcesAlbumActionsPlay": {},
"resourcesAlbumActionsView": "Zobrazit album",
"@resourcesAlbumActionsView": {},
"resourcesAlbumListsSort": "Seřadit alba",
"@resourcesAlbumListsSort": {},
"resourcesAlbumName": "{count,plural, =1{Album} few{Alba} many{Alba} other{Alba}}",
"@resourcesAlbumName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesArtistActionsView": "Zobrazit umělce",
"@resourcesArtistActionsView": {},
"resourcesArtistListsSort": "Seřadit umělce",
"@resourcesArtistListsSort": {},
"resourcesArtistName": "{count,plural, =1{Umělec} few{Umělci} many{Umělci} other{Umělci}}",
"@resourcesArtistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesFilterGenre": "Podle žánru",
"@resourcesFilterGenre": {},
"resourcesFilterStarred": "Ohodnocené",
"@resourcesFilterStarred": {},
"resourcesPlaylistActionsPlay": "Přehrát seznam skladeb",
"@resourcesPlaylistActionsPlay": {},
"resourcesPlaylistName": "{count,plural, =1{Seznam skladeb} few{Seznamy skladeb} many{Seznamy skladeb} other{Seznamy skladeb}}",
"@resourcesPlaylistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesQueueName": "{count,plural, =1{Fronta} few{Fronty} many{Fronty} other{Fronty}}",
"@resourcesQueueName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSongListsArtistTopSongs": "Top skladby",
"@resourcesSongListsArtistTopSongs": {},
"resourcesSongName": "{count,plural, =1{Skladba} few{Skladby} many{Skladby} other{Skladby}}",
"@resourcesSongName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSortByAdded": "Nedávno přidané",
"@resourcesSortByAdded": {},
"resourcesSortByArtist": "Umělce",
"@resourcesSortByArtist": {},
"resourcesSortByFrequentlyPlayed": "Často přehrávané",
"@resourcesSortByFrequentlyPlayed": {},
"resourcesSortByName": "Názvu",
"@resourcesSortByName": {},
"resourcesSortByRandom": "Náhodně",
"@resourcesSortByRandom": {},
"resourcesSortByRecentlyPlayed": "Často přehrávané",
"@resourcesSortByRecentlyPlayed": {},
"resourcesSortByYear": "Roku",
"@resourcesSortByYear": {},
"searchHeaderTitle": "Hledat: {query}",
"@searchHeaderTitle": {
"placeholders": {
"query": {
"type": "String"
}
}
},
"searchInputPlaceholder": "Hledat",
"@searchInputPlaceholder": {},
"searchMoreResults": "Více…",
"@searchMoreResults": {},
"searchNowPlayingContext": "Výsledky hledání",
"@searchNowPlayingContext": {},
"settingsNetworkName": "Síť",
"@settingsNetworkName": {},
"settingsNetworkOptionsMaxBitrateMobileTitle": "Maximální datový tok (mobil)",
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
"settingsNetworkOptionsMaxBitrateWifiTitle": "Maximální datový tok (Wi-Fi)",
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
"settingsNetworkValuesKbps": "{value}kbps",
"@settingsNetworkValuesKbps": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesSeconds": "{value} sekund",
"@settingsNetworkValuesSeconds": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesUnlimitedKbps": "Neomezeno",
"@settingsNetworkValuesUnlimitedKbps": {},
"settingsServersActionsAdd": "Přidat server",
"@settingsServersActionsAdd": {},
"settingsServersActionsDelete": "Odstranit",
"@settingsServersActionsDelete": {},
"settingsServersActionsEdit": "Upravit server",
"@settingsServersActionsEdit": {},
"settingsServersActionsSave": "Uložit",
"@settingsServersActionsSave": {},
"settingsServersActionsTestConnection": "Otestovat spojení",
"@settingsServersActionsTestConnection": {},
"settingsServersFieldsAddress": "Adresa",
"@settingsServersFieldsAddress": {},
"settingsServersFieldsPassword": "Heslo",
"@settingsServersFieldsPassword": {},
"settingsServersFieldsUsername": "Uživ. jméno",
"@settingsServersFieldsUsername": {},
"settingsServersMessagesConnectionFailed": "Připojení k {address} selhalo, zkontrolujte nastavení nebo server",
"@settingsServersMessagesConnectionFailed": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersMessagesConnectionOk": "Připojení k {address} je OK!",
"@settingsServersMessagesConnectionOk": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersName": "Servery",
"@settingsServersName": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "Posílat heslo jako token + salt",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "Posílat heslo v prostém textu (zastaralé, ujistěte se, že je vaše připojení zabezpečené!)",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
"settingsServersOptionsForcePlaintextPasswordTitle": "Vynutit heslo ve formátu prostého textu",
"@settingsServersOptionsForcePlaintextPasswordTitle": {},
"actionsDownloadDelete": "Smazat stažené",
"@actionsDownloadDelete": {},
"actionsOk": "OK",
"@actionsOk": {},
"actionsCancel": "Zrušit",
"@actionsCancel": {},
"actionsDownload": "Stáhnout",
"@actionsDownload": {},
"controlsShuffle": "Náhodně",
"@controlsShuffle": {},
"resourcesFilterAlbum": "Album",
"@resourcesFilterAlbum": {},
"resourcesFilterArtist": "Umělec",
"@resourcesFilterArtist": {},
"resourcesFilterYear": "Rok",
"@resourcesFilterYear": {},
"resourcesFilterOwner": "Majitele",
"@resourcesFilterOwner": {},
"resourcesSongListDeleteAllTitle": "Smazat stažené?",
"@resourcesSongListDeleteAllTitle": {},
"resourcesSongListDeleteAllContent": "Toto odstraní všechny stažené soubory s hudbou.",
"@resourcesSongListDeleteAllContent": {},
"resourcesSortByUpdated": "Naposledy upravené",
"@resourcesSortByUpdated": {},
"resourcesSortByAlbum": "Alba",
"@resourcesSortByAlbum": {},
"resourcesSortByAlbumCount": "Počtu alb",
"@resourcesSortByAlbumCount": {},
"resourcesSortByTitle": "Názvu",
"@resourcesSortByTitle": {},
"settingsAboutActionsLicenses": "Licence",
"@settingsAboutActionsLicenses": {},
"settingsAboutActionsProjectHomepage": "Stránka projektu",
"@settingsAboutActionsProjectHomepage": {},
"settingsAboutActionsSupport": "Podpořit vývojáře 💜",
"@settingsAboutActionsSupport": {},
"settingsAboutVersion": "verze {version}",
"@settingsAboutVersion": {
"placeholders": {
"version": {
"type": "String"
}
}
},
"settingsNetworkOptionsStreamFormat": "Preferovaný formát pro streamování",
"@settingsNetworkOptionsStreamFormat": {},
"settingsNetworkOptionsStreamFormatServerDefault": "Použít nastavení serveru",
"@settingsNetworkOptionsStreamFormatServerDefault": {},
"settingsResetActionsClearImageCache": "Smazat mezipaměť obrázků",
"@settingsResetActionsClearImageCache": {},
"settingsResetName": "Resetovat",
"@settingsResetName": {},
"settingsServersFieldsName": "Jméno",
"@settingsServersFieldsName": {},
"settingsAboutName": "O aplikaci",
"@settingsAboutName": {},
"actionsDownloadCancel": "Zrušit stahování",
"@actionsDownloadCancel": {},
"actionsDelete": "Smazat",
"@actionsDelete": {}
}
"actionsStar": "Ohodnotit",
"@actionsStar": {},
"actionsUnstar": "Zrušit hodnocení",
"@actionsUnstar": {},
"messagesNothingHere": "Zde nic není…",
"@messagesNothingHere": {},
"navigationTabsHome": "Domů",
"@navigationTabsHome": {},
"navigationTabsLibrary": "Knihovna",
"@navigationTabsLibrary": {},
"navigationTabsSearch": "Hledat",
"@navigationTabsSearch": {},
"navigationTabsSettings": "Nastavení",
"@navigationTabsSettings": {},
"resourcesAlbumActionsPlay": "Přehrát album",
"@resourcesAlbumActionsPlay": {},
"resourcesAlbumActionsView": "Zobrazit album",
"@resourcesAlbumActionsView": {},
"resourcesAlbumListsSort": "Seřadit alba",
"@resourcesAlbumListsSort": {},
"resourcesAlbumName": "{count,plural, =1{Album} few{Alba} many{Alba} other{Alba}}",
"@resourcesAlbumName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesArtistActionsView": "Zobrazit umělce",
"@resourcesArtistActionsView": {},
"resourcesArtistListsSort": "Seřadit umělce",
"@resourcesArtistListsSort": {},
"resourcesArtistName": "{count,plural, =1{Umělec} few{Umělci} many{Umělci} other{Umělci}}",
"@resourcesArtistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesFilterGenre": "Podle žánru",
"@resourcesFilterGenre": {},
"resourcesFilterStarred": "Ohodnocené",
"@resourcesFilterStarred": {},
"resourcesPlaylistActionsPlay": "Přehrát seznam skladeb",
"@resourcesPlaylistActionsPlay": {},
"resourcesPlaylistName": "{count,plural, =1{Seznam skladeb} few{Seznamy skladeb} many{Seznamy skladeb} other{Seznamy skladeb}}",
"@resourcesPlaylistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesQueueName": "{count,plural, =1{Fronta} few{Fronty} many{Fronty} other{Fronty}}",
"@resourcesQueueName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSongListsArtistTopSongs": "Top skladby",
"@resourcesSongListsArtistTopSongs": {},
"resourcesSongName": "{count,plural, =1{Skladba} few{Skladby} many{Skladby} other{Skladby}}",
"@resourcesSongName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSortByAdded": "Nedávno přidané",
"@resourcesSortByAdded": {},
"resourcesSortByArtist": "Podle umělce",
"@resourcesSortByArtist": {},
"resourcesSortByFrequentlyPlayed": "Často přehrávané",
"@resourcesSortByFrequentlyPlayed": {},
"resourcesSortByName": "Podle názvu",
"@resourcesSortByName": {},
"resourcesSortByRandom": "Náhodně",
"@resourcesSortByRandom": {},
"resourcesSortByRecentlyPlayed": "Často přehrávané",
"@resourcesSortByRecentlyPlayed": {},
"resourcesSortByYear": "Podle roku",
"@resourcesSortByYear": {},
"searchHeaderTitle": "Hledat: {query}",
"@searchHeaderTitle": {
"placeholders": {
"query": {
"type": "String"
}
}
},
"searchInputPlaceholder": "Hledat",
"@searchInputPlaceholder": {},
"searchMoreResults": "Více…",
"@searchMoreResults": {},
"searchNowPlayingContext": "Výsledky hledání",
"@searchNowPlayingContext": {},
"settingsNetworkName": "Síť",
"@settingsNetworkName": {},
"settingsNetworkOptionsMaxBitrateMobileTitle": "Maximální datový tok (mobil)",
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
"settingsNetworkOptionsMaxBitrateWifiTitle": "Maximální datový tok (Wi-Fi)",
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
"settingsNetworkValuesKbps": "{value}kbps",
"@settingsNetworkValuesKbps": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesSeconds": "{value} sekund",
"@settingsNetworkValuesSeconds": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesUnlimitedKbps": "Neomezeno",
"@settingsNetworkValuesUnlimitedKbps": {},
"settingsServersActionsAdd": "Přidat server",
"@settingsServersActionsAdd": {},
"settingsServersActionsDelete": "Odstranit",
"@settingsServersActionsDelete": {},
"settingsServersActionsEdit": "Upravit server",
"@settingsServersActionsEdit": {},
"settingsServersActionsSave": "Uložit",
"@settingsServersActionsSave": {},
"settingsServersActionsTestConnection": "Otestovat spojení",
"@settingsServersActionsTestConnection": {},
"settingsServersFieldsAddress": "Adresa",
"@settingsServersFieldsAddress": {},
"settingsServersFieldsPassword": "Heslo",
"@settingsServersFieldsPassword": {},
"settingsServersFieldsUsername": "Uživ. jméno",
"@settingsServersFieldsUsername": {},
"settingsServersMessagesConnectionFailed": "Připojení k {address} selhalo, zkontrolujte nastavení nebo server",
"@settingsServersMessagesConnectionFailed": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersMessagesConnectionOk": "Připojení k {address} je OK!",
"@settingsServersMessagesConnectionOk": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersName": "Servery",
"@settingsServersName": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "Posílat heslo jako token + salt",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "Posílat heslo v prostém textu (zastaralé, ujistěte se, že je vaše připojení zabezpečené!)",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
"settingsServersOptionsForcePlaintextPasswordTitle": "Vynutit heslo ve formátu prostého textu",
"@settingsServersOptionsForcePlaintextPasswordTitle": {}
}

View File

@ -1,276 +1,196 @@
{
"actionsStar": "Markieren",
"@actionsStar": {},
"actionsUnstar": "Markierung entfernen",
"@actionsUnstar": {},
"messagesNothingHere": "Hier ist nichts…",
"@messagesNothingHere": {},
"navigationTabsHome": "Startseite",
"@navigationTabsHome": {},
"navigationTabsLibrary": "Bibliothek",
"@navigationTabsLibrary": {},
"navigationTabsSearch": "Suche",
"@navigationTabsSearch": {},
"navigationTabsSettings": "Einstellungen",
"@navigationTabsSettings": {},
"resourcesAlbumActionsPlay": "Album abspielen",
"@resourcesAlbumActionsPlay": {},
"resourcesAlbumActionsView": "Album anzeigen",
"@resourcesAlbumActionsView": {},
"resourcesAlbumListsSort": "Alben sortieren",
"@resourcesAlbumListsSort": {},
"resourcesAlbumName": "{count,plural, =1{Album} other{Alben}}",
"@resourcesAlbumName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesArtistActionsView": "Interpret anzeigen",
"@resourcesArtistActionsView": {},
"resourcesArtistListsSort": "Interpreten sortieren",
"@resourcesArtistListsSort": {},
"resourcesArtistName": "{count,plural, =1{Interpret} other{Interpreten}}",
"@resourcesArtistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesFilterGenre": "Nach Genre",
"@resourcesFilterGenre": {},
"resourcesFilterStarred": "Favoriten",
"@resourcesFilterStarred": {},
"resourcesPlaylistActionsPlay": "Wiedergabeliste abspielen",
"@resourcesPlaylistActionsPlay": {},
"resourcesPlaylistName": "{count,plural, =1{Wiedergabeliste} other{Wiedergabelisten}}",
"@resourcesPlaylistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesQueueName": "{count,plural, =1{Warteschlange} other{Warteschlangen}}",
"@resourcesQueueName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSongListsArtistTopSongs": "Top Lieder",
"@resourcesSongListsArtistTopSongs": {},
"resourcesSongName": "{count,plural, =1{Lied} other{Lieder}}",
"@resourcesSongName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSortByAdded": "Kürzlich hinzugefügt",
"@resourcesSortByAdded": {},
"resourcesSortByArtist": "Nach Interpreten",
"@resourcesSortByArtist": {},
"resourcesSortByFrequentlyPlayed": "Häufig abgespielt",
"@resourcesSortByFrequentlyPlayed": {},
"resourcesSortByName": "Nach Name",
"@resourcesSortByName": {},
"resourcesSortByRandom": "Zufällig",
"@resourcesSortByRandom": {},
"resourcesSortByRecentlyPlayed": "Kürzlich abgespielt",
"@resourcesSortByRecentlyPlayed": {},
"resourcesSortByYear": "Nach Jahr",
"@resourcesSortByYear": {},
"searchHeaderTitle": "Suche: {query}",
"@searchHeaderTitle": {
"placeholders": {
"query": {
"type": "String"
}
}
},
"searchInputPlaceholder": "Suche",
"@searchInputPlaceholder": {},
"searchMoreResults": "Mehr…",
"@searchMoreResults": {},
"searchNowPlayingContext": "Suchergebnis",
"@searchNowPlayingContext": {},
"settingsAboutActionsLicenses": "Lizenzen",
"@settingsAboutActionsLicenses": {},
"settingsAboutActionsProjectHomepage": "Projektseite",
"@settingsAboutActionsProjectHomepage": {},
"settingsAboutName": "Über",
"@settingsAboutName": {},
"settingsAboutVersion": "Version {version}",
"@settingsAboutVersion": {
"placeholders": {
"version": {
"type": "String"
}
}
},
"settingsMusicName": "Musik",
"@settingsMusicName": {},
"settingsMusicOptionsScrobbleDescriptionOff": "Kein Scrobble für Wiedergabeverlauf",
"@settingsMusicOptionsScrobbleDescriptionOff": {},
"settingsMusicOptionsScrobbleDescriptionOn": "Scrobble Wiedergabeverlauf",
"@settingsMusicOptionsScrobbleDescriptionOn": {},
"settingsMusicOptionsScrobbleTitle": "Scrobble Wiedergabe",
"@settingsMusicOptionsScrobbleTitle": {},
"settingsNetworkName": "Netzwerk",
"@settingsNetworkName": {},
"settingsNetworkOptionsMaxBitrateMobileTitle": "Maximale Bitrate (Mobil)",
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
"settingsNetworkOptionsMaxBitrateWifiTitle": "Maximale Bitrate (WLAN)",
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
"settingsNetworkOptionsMaxBufferTitle": "Maximale Pufferzeit",
"@settingsNetworkOptionsMaxBufferTitle": {},
"settingsNetworkOptionsMinBufferTitle": "Minimale Pufferzeit",
"@settingsNetworkOptionsMinBufferTitle": {},
"settingsNetworkValuesKbps": "{value}kbps",
"@settingsNetworkValuesKbps": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesSeconds": "{value} Sekunden",
"@settingsNetworkValuesSeconds": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesUnlimitedKbps": "Unbegrenzt",
"@settingsNetworkValuesUnlimitedKbps": {},
"settingsResetActionsClearImageCache": "Bildzwischenspeicher löschen",
"@settingsResetActionsClearImageCache": {},
"settingsResetName": "Zurücksetzen",
"@settingsResetName": {},
"settingsServersActionsAdd": "Server hinzufügen",
"@settingsServersActionsAdd": {},
"settingsServersActionsDelete": "Löschen",
"@settingsServersActionsDelete": {},
"settingsServersActionsEdit": "Server bearbeiten",
"@settingsServersActionsEdit": {},
"settingsServersActionsSave": "Speichern",
"@settingsServersActionsSave": {},
"settingsServersActionsTestConnection": "Verbindung testen",
"@settingsServersActionsTestConnection": {},
"settingsServersFieldsAddress": "Adresse",
"@settingsServersFieldsAddress": {},
"settingsServersFieldsPassword": "Passwort",
"@settingsServersFieldsPassword": {},
"settingsServersFieldsUsername": "Nutzername",
"@settingsServersFieldsUsername": {},
"settingsServersMessagesConnectionFailed": "Verbindung zu {address} fehlgeschlagen, überprüfe Einstellungen oder Server",
"@settingsServersMessagesConnectionFailed": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersMessagesConnectionOk": "Verbindung zu {address} ist OK!",
"@settingsServersMessagesConnectionOk": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersName": "Server",
"@settingsServersName": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "Sende Passwort als Token + Salt",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "Passwort als Klartext senden (Veraltet, stellen Sie sicher, dass Ihre Verbindung sicher ist!)",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
"settingsServersOptionsForcePlaintextPasswordTitle": "Erzwinge Klartextpasswort",
"@settingsServersOptionsForcePlaintextPasswordTitle": {},
"actionsDelete": "Löschen",
"@actionsDelete": {},
"actionsDownload": "Herunterladen",
"@actionsDownload": {},
"actionsDownloadCancel": "Download abbrechen",
"@actionsDownloadCancel": {},
"controlsShuffle": "Zufall",
"@controlsShuffle": {},
"actionsCancel": "Abbrechen",
"@actionsCancel": {},
"actionsDownloadDelete": "Heruntergeladene Inhalte löschen",
"@actionsDownloadDelete": {},
"actionsOk": "OK",
"@actionsOk": {},
"resourcesAlbumCount": "{count,plural, =1{{count} Album} other{{count} Alben}}",
"@resourcesAlbumCount": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesFilterAlbum": "Album",
"@resourcesFilterAlbum": {},
"resourcesArtistCount": "{count,plural, =1{{count} Künstler} other{{count} Künstler}}",
"@resourcesArtistCount": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesFilterArtist": "Künstler",
"@resourcesFilterArtist": {},
"resourcesFilterOwner": "Besitzer",
"@resourcesFilterOwner": {},
"resourcesFilterYear": "Jahr",
"@resourcesFilterYear": {},
"resourcesPlaylistCount": "{count,plural, =1{{count} Playlist} other{{count} Playlists}}",
"@resourcesPlaylistCount": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSongCount": "{count,plural, =1{{count} Song} other{{count} Songs}}",
"@resourcesSongCount": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSongListDeleteAllContent": "Hierdurch werden alle heruntergeladenen Inhalte entfernt.",
"@resourcesSongListDeleteAllContent": {},
"resourcesSortByAlbum": "Album",
"@resourcesSortByAlbum": {},
"resourcesSortByAlbumCount": "Albenanzahl",
"@resourcesSortByAlbumCount": {},
"resourcesSortByTitle": "Titel",
"@resourcesSortByTitle": {},
"resourcesSortByUpdated": "Kürzlich hinzugefügt",
"@resourcesSortByUpdated": {},
"settingsAboutActionsSupport": "Den Entwickler unterstützen",
"@settingsAboutActionsSupport": {},
"settingsNetworkOptionsOfflineMode": "Offline Modus",
"@settingsNetworkOptionsOfflineMode": {},
"settingsNetworkOptionsOfflineModeOff": "Nutze das Internet um Musik zu synchronisieren.",
"@settingsNetworkOptionsOfflineModeOff": {},
"settingsNetworkOptionsOfflineModeOn": "Nutze nicht das Internet um Musik zu synchronisieren.",
"@settingsNetworkOptionsOfflineModeOn": {},
"settingsNetworkOptionsStreamFormat": "Bevorzugtes Streaming-Format",
"@settingsNetworkOptionsStreamFormat": {},
"settingsServersFieldsName": "Name",
"@settingsServersFieldsName": {},
"resourcesSongListDeleteAllTitle": "Downloads löschen?",
"@resourcesSongListDeleteAllTitle": {},
"settingsNetworkOptionsStreamFormatServerDefault": "Server-Standard verwenden",
"@settingsNetworkOptionsStreamFormatServerDefault": {}
}
"actionsStar": "Markieren",
"@actionsStar": {},
"actionsUnstar": "Markierung entfernen",
"@actionsUnstar": {},
"messagesNothingHere": "Hier ist nichts…",
"@messagesNothingHere": {},
"navigationTabsHome": "Startseite",
"@navigationTabsHome": {},
"navigationTabsLibrary": "Bibliothek",
"@navigationTabsLibrary": {},
"navigationTabsSearch": "Suche",
"@navigationTabsSearch": {},
"navigationTabsSettings": "Einstellungen",
"@navigationTabsSettings": {},
"resourcesAlbumActionsPlay": "Album abspielen",
"@resourcesAlbumActionsPlay": {},
"resourcesAlbumActionsView": "Album anzeigen",
"@resourcesAlbumActionsView": {},
"resourcesAlbumListsSort": "Alben sortieren",
"@resourcesAlbumListsSort": {},
"resourcesAlbumName": "{count,plural, =1{Album} other{Alben}}",
"@resourcesAlbumName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesArtistActionsView": "Interpret anzeigen",
"@resourcesArtistActionsView": {},
"resourcesArtistListsSort": "Interpreten sortieren",
"@resourcesArtistListsSort": {},
"resourcesArtistName": "{count,plural, =1{Interpret} other{Interpreten}}",
"@resourcesArtistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesFilterGenre": "Nach Genre",
"@resourcesFilterGenre": {},
"resourcesFilterStarred": "Favoriten",
"@resourcesFilterStarred": {},
"resourcesPlaylistActionsPlay": "Wiedergabeliste abspielen",
"@resourcesPlaylistActionsPlay": {},
"resourcesPlaylistName": "{count,plural, =1{Wiedergabeliste} other{Wiedergabelisten}}",
"@resourcesPlaylistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesQueueName": "{count,plural, =1{Warteschlange} other{Warteschlangen}}",
"@resourcesQueueName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSongListsArtistTopSongs": "Top Lieder",
"@resourcesSongListsArtistTopSongs": {},
"resourcesSongName": "{count,plural, =1{Lied} other{Lieder}}",
"@resourcesSongName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSortByAdded": "Kürzlich hinzugefügt",
"@resourcesSortByAdded": {},
"resourcesSortByArtist": "Nach Interpreten",
"@resourcesSortByArtist": {},
"resourcesSortByFrequentlyPlayed": "Häufig abgespielt",
"@resourcesSortByFrequentlyPlayed": {},
"resourcesSortByName": "Nach Name",
"@resourcesSortByName": {},
"resourcesSortByRandom": "Zufällig",
"@resourcesSortByRandom": {},
"resourcesSortByRecentlyPlayed": "Kürzlich abgespielt",
"@resourcesSortByRecentlyPlayed": {},
"resourcesSortByYear": "Nach Jahr",
"@resourcesSortByYear": {},
"searchHeaderTitle": "Suche: {query}",
"@searchHeaderTitle": {
"placeholders": {
"query": {
"type": "String"
}
}
},
"searchInputPlaceholder": "Suche",
"@searchInputPlaceholder": {},
"searchMoreResults": "Mehr…",
"@searchMoreResults": {},
"searchNowPlayingContext": "Suchergebnis",
"@searchNowPlayingContext": {},
"settingsAboutActionsLicenses": "Lizenzen",
"@settingsAboutActionsLicenses": {},
"settingsAboutActionsProjectHomepage": "Projektseite",
"@settingsAboutActionsProjectHomepage": {},
"settingsAboutName": "Über",
"@settingsAboutName": {},
"settingsAboutVersion": "Version {version}",
"@settingsAboutVersion": {
"placeholders": {
"version": {
"type": "String"
}
}
},
"settingsMusicName": "Musik",
"@settingsMusicName": {},
"settingsMusicOptionsScrobbleDescriptionOff": "Kein Scrobble für Wiedergabeverlauf",
"@settingsMusicOptionsScrobbleDescriptionOff": {},
"settingsMusicOptionsScrobbleDescriptionOn": "Scrobble Wiedergabeverlauf",
"@settingsMusicOptionsScrobbleDescriptionOn": {},
"settingsMusicOptionsScrobbleTitle": "Scrobble Wiedergabe",
"@settingsMusicOptionsScrobbleTitle": {},
"settingsNetworkName": "Netzwerk",
"@settingsNetworkName": {},
"settingsNetworkOptionsMaxBitrateMobileTitle": "Maximale Bitrate (Mobil)",
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
"settingsNetworkOptionsMaxBitrateWifiTitle": "Maximale Bitrate (WLAN)",
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
"settingsNetworkOptionsMaxBufferTitle": "Maximale Pufferzeit",
"@settingsNetworkOptionsMaxBufferTitle": {},
"settingsNetworkOptionsMinBufferTitle": "Minimale Pufferzeit",
"@settingsNetworkOptionsMinBufferTitle": {},
"settingsNetworkValuesKbps": "{value}kbps",
"@settingsNetworkValuesKbps": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesSeconds": "{value} Sekunden",
"@settingsNetworkValuesSeconds": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesUnlimitedKbps": "Unbegrenzt",
"@settingsNetworkValuesUnlimitedKbps": {},
"settingsResetActionsClearImageCache": "Bildzwischenspeicher löschen",
"@settingsResetActionsClearImageCache": {},
"settingsResetName": "Zurücksetzen",
"@settingsResetName": {},
"settingsServersActionsAdd": "Server hinzufügen",
"@settingsServersActionsAdd": {},
"settingsServersActionsDelete": "Löschen",
"@settingsServersActionsDelete": {},
"settingsServersActionsEdit": "Server bearbeiten",
"@settingsServersActionsEdit": {},
"settingsServersActionsSave": "Speichern",
"@settingsServersActionsSave": {},
"settingsServersActionsTestConnection": "Verbindung testen",
"@settingsServersActionsTestConnection": {},
"settingsServersFieldsAddress": "Adresse",
"@settingsServersFieldsAddress": {},
"settingsServersFieldsPassword": "Passwort",
"@settingsServersFieldsPassword": {},
"settingsServersFieldsUsername": "Nutzername",
"@settingsServersFieldsUsername": {},
"settingsServersMessagesConnectionFailed": "Verbindung zu {address} fehlgeschlagen, überprüfe Einstellungen oder Server",
"@settingsServersMessagesConnectionFailed": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersMessagesConnectionOk": "Verbindung zu {address} ist OK!",
"@settingsServersMessagesConnectionOk": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersName": "Server",
"@settingsServersName": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "Sende Passwort als Token + Salt",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "Passwort als Klartext senden (Veraltet, stellen Sie sicher, dass Ihre Verbindung sicher ist!)",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
"settingsServersOptionsForcePlaintextPasswordTitle": "Erzwinge Klartextpasswort",
"@settingsServersOptionsForcePlaintextPasswordTitle": {}
}

View File

@ -173,10 +173,6 @@
"@settingsAboutActionsSupport": {},
"settingsAboutName": "About",
"@settingsAboutName": {},
"settingsAboutShareLogs": "Share logs",
"@settingsAboutShareLogs": {},
"settingsAboutChooseLog": "Choose a log file",
"@settingsAboutChooseLog": {},
"settingsAboutVersion": "version {version}",
"@settingsAboutVersion": {
"placeholders": {

View File

@ -1,210 +1,196 @@
{
"actionsStar": "Favorito",
"@actionsStar": {},
"actionsUnstar": "Retirar favorito",
"@actionsUnstar": {},
"messagesNothingHere": "Nada aquí…",
"@messagesNothingHere": {},
"navigationTabsHome": "Casa",
"@navigationTabsHome": {},
"navigationTabsLibrary": "Biblioteca",
"@navigationTabsLibrary": {},
"navigationTabsSearch": "Buscar",
"@navigationTabsSearch": {},
"navigationTabsSettings": "Entorno",
"@navigationTabsSettings": {},
"resourcesAlbumActionsPlay": "Reproducir Álbum",
"@resourcesAlbumActionsPlay": {},
"resourcesAlbumActionsView": "Ver Álbum",
"@resourcesAlbumActionsView": {},
"resourcesAlbumListsSort": "Ordenar Álbumes",
"@resourcesAlbumListsSort": {},
"resourcesAlbumName": "{count,plural, =1{Álbum} other{Álbumes}}",
"@resourcesAlbumName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesArtistActionsView": "Ver Artista",
"@resourcesArtistActionsView": {},
"resourcesArtistListsSort": "Oredenar Artistas",
"@resourcesArtistListsSort": {},
"resourcesArtistName": "{count,plural, =1{Artista} other{Artistas}}",
"@resourcesArtistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesFilterGenre": "Por Género",
"@resourcesFilterGenre": {},
"resourcesFilterStarred": "Estrellas",
"@resourcesFilterStarred": {},
"resourcesPlaylistActionsPlay": "Reproducir Lista de reproducción",
"@resourcesPlaylistActionsPlay": {},
"resourcesPlaylistName": "{count,plural, =1{Lista de reproducción} other{Listas de reproducción}}",
"@resourcesPlaylistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesQueueName": "{count,plural, =1{Cola} other{Colas}}",
"@resourcesQueueName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSongListsArtistTopSongs": "Mejores Canciones",
"@resourcesSongListsArtistTopSongs": {},
"resourcesSongName": "{count,plural, =1{Cancion} other{Canciones}}",
"@resourcesSongName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSortByAdded": "Recientemente Añadido",
"@resourcesSortByAdded": {},
"resourcesSortByArtist": "Por Artista",
"@resourcesSortByArtist": {},
"resourcesSortByFrequentlyPlayed": "Jugado Frecuentemente",
"@resourcesSortByFrequentlyPlayed": {},
"resourcesSortByName": "Por Nombre",
"@resourcesSortByName": {},
"resourcesSortByRandom": "Aleatorio",
"@resourcesSortByRandom": {},
"resourcesSortByRecentlyPlayed": "Recientemente Jugado",
"@resourcesSortByRecentlyPlayed": {},
"resourcesSortByYear": "Por Año",
"@resourcesSortByYear": {},
"searchHeaderTitle": "Buscar: {query}",
"@searchHeaderTitle": {
"placeholders": {
"query": {
"type": "String"
}
}
},
"searchInputPlaceholder": "Buscar",
"@searchInputPlaceholder": {},
"searchMoreResults": "Más…",
"@searchMoreResults": {},
"searchNowPlayingContext": "Resultados de la búsqueda",
"@searchNowPlayingContext": {},
"settingsAboutActionsLicenses": "Licencias",
"@settingsAboutActionsLicenses": {},
"settingsAboutActionsProjectHomepage": "Página de inicio del proyecto",
"@settingsAboutActionsProjectHomepage": {},
"settingsAboutName": "Información",
"@settingsAboutName": {},
"settingsAboutVersion": "versión {version}",
"@settingsAboutVersion": {
"placeholders": {
"version": {
"type": "String"
}
}
},
"settingsMusicName": "Música",
"@settingsMusicName": {},
"settingsMusicOptionsScrobbleDescriptionOff": "No hagas historial de reproducción de scrobble",
"@settingsMusicOptionsScrobbleDescriptionOff": {},
"settingsMusicOptionsScrobbleDescriptionOn": "Historial de reproducción de scrobble",
"@settingsMusicOptionsScrobbleDescriptionOn": {},
"settingsMusicOptionsScrobbleTitle": "Obras de teatro de Scrobble",
"@settingsMusicOptionsScrobbleTitle": {},
"settingsNetworkName": "Sitio",
"@settingsNetworkName": {},
"settingsNetworkOptionsMaxBitrateMobileTitle": "Tasa de bits máxima (mobile)",
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
"settingsNetworkOptionsMaxBitrateWifiTitle": "Tasa de bits máxima (Wi-Fi)",
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
"settingsNetworkOptionsMaxBufferTitle": "Máxima de buffer tiempo",
"@settingsNetworkOptionsMaxBufferTitle": {},
"settingsNetworkOptionsMinBufferTitle": "Mínimo de buffer tiempo",
"@settingsNetworkOptionsMinBufferTitle": {},
"settingsNetworkValuesKbps": "{value} kilobytes por segundo",
"@settingsNetworkValuesKbps": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesSeconds": "{value} segundos",
"@settingsNetworkValuesSeconds": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesUnlimitedKbps": "Ilimitados",
"@settingsNetworkValuesUnlimitedKbps": {},
"settingsResetActionsClearImageCache": "Caché de imágenes claras",
"@settingsResetActionsClearImageCache": {},
"settingsResetName": "Reinicializar",
"@settingsResetName": {},
"settingsServersActionsAdd": "Agregar Servidor",
"@settingsServersActionsAdd": {},
"settingsServersActionsDelete": "Supr",
"@settingsServersActionsDelete": {},
"settingsServersActionsEdit": "Editar Servidor",
"@settingsServersActionsEdit": {},
"settingsServersActionsSave": "Enviar",
"@settingsServersActionsSave": {},
"settingsServersActionsTestConnection": "Conexión de prueba",
"@settingsServersActionsTestConnection": {},
"settingsServersFieldsAddress": "Alocución",
"@settingsServersFieldsAddress": {},
"settingsServersFieldsPassword": "La contraseña",
"@settingsServersFieldsPassword": {},
"settingsServersFieldsUsername": "Nombre de usuario",
"@settingsServersFieldsUsername": {},
"settingsServersMessagesConnectionFailed": "La conexión a {address} falló, verifique la configuracón o el servidor",
"@settingsServersMessagesConnectionFailed": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersMessagesConnectionOk": "¡Conexión con {address} Ok!",
"@settingsServersMessagesConnectionOk": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersName": "Servidores",
"@settingsServersName": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "Enviar contraseña como token + sal",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "Enviar contraseña en texto plano (¡legado, asegúrese de que su conexión sea segura!)",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
"settingsServersOptionsForcePlaintextPasswordTitle": "Forzar contraseña de texto sin formato",
"@settingsServersOptionsForcePlaintextPasswordTitle": {},
"actionsDelete": "Borrar",
"@actionsDelete": {},
"actionsOk": "Ok",
"@actionsOk": {},
"actionsDownload": "Descargar",
"@actionsDownload": {},
"actionsDownloadCancel": "Anular descargar",
"@actionsDownloadCancel": {},
"controlsShuffle": "Reproducir aleatoriamente",
"@controlsShuffle": {},
"actionsCancel": "Cancelar",
"@actionsCancel": {},
"actionsDownloadDelete": "Eliminar descargado",
"@actionsDownloadDelete": {}
}
"actionsStar": "Estrella",
"@actionsStar": {},
"actionsUnstar": "Retirar estrella",
"@actionsUnstar": {},
"messagesNothingHere": "Nada aquí…",
"@messagesNothingHere": {},
"navigationTabsHome": "Casa",
"@navigationTabsHome": {},
"navigationTabsLibrary": "Biblioteca",
"@navigationTabsLibrary": {},
"navigationTabsSearch": "Buscar",
"@navigationTabsSearch": {},
"navigationTabsSettings": "Entorno",
"@navigationTabsSettings": {},
"resourcesAlbumActionsPlay": "Reproducir Álbum",
"@resourcesAlbumActionsPlay": {},
"resourcesAlbumActionsView": "Ver Álbum",
"@resourcesAlbumActionsView": {},
"resourcesAlbumListsSort": "Ordenar Álbumes",
"@resourcesAlbumListsSort": {},
"resourcesAlbumName": "{count,plural, =1{Álbum} other{Álbumes}}",
"@resourcesAlbumName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesArtistActionsView": "Ver Artista",
"@resourcesArtistActionsView": {},
"resourcesArtistListsSort": "Oredenar Artistas",
"@resourcesArtistListsSort": {},
"resourcesArtistName": "{count,plural, =1{Artista} other{Artistas}}",
"@resourcesArtistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesFilterGenre": "Por Género",
"@resourcesFilterGenre": {},
"resourcesFilterStarred": "Estrellas",
"@resourcesFilterStarred": {},
"resourcesPlaylistActionsPlay": "Reproducir Lista de reproducción",
"@resourcesPlaylistActionsPlay": {},
"resourcesPlaylistName": "{count,plural, =1{Lista de reproducción} other{Listas de reproducción}}",
"@resourcesPlaylistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesQueueName": "{count,plural, =1{Cola} other{Colas}}",
"@resourcesQueueName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSongListsArtistTopSongs": "Mejores Canciones",
"@resourcesSongListsArtistTopSongs": {},
"resourcesSongName": "{count,plural, =1{Cancion} other{Canciones}}",
"@resourcesSongName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSortByAdded": "Recientemente Añadido",
"@resourcesSortByAdded": {},
"resourcesSortByArtist": "Por Artista",
"@resourcesSortByArtist": {},
"resourcesSortByFrequentlyPlayed": "Jugado Frecuentemente",
"@resourcesSortByFrequentlyPlayed": {},
"resourcesSortByName": "Por Nombre",
"@resourcesSortByName": {},
"resourcesSortByRandom": "Aleatorio",
"@resourcesSortByRandom": {},
"resourcesSortByRecentlyPlayed": "Recientemente Jugado",
"@resourcesSortByRecentlyPlayed": {},
"resourcesSortByYear": "Por Año",
"@resourcesSortByYear": {},
"searchHeaderTitle": "Buscar: {query}",
"@searchHeaderTitle": {
"placeholders": {
"query": {
"type": "String"
}
}
},
"searchInputPlaceholder": "Buscar",
"@searchInputPlaceholder": {},
"searchMoreResults": "Más…",
"@searchMoreResults": {},
"searchNowPlayingContext": "Resultados de la búsqueda",
"@searchNowPlayingContext": {},
"settingsAboutActionsLicenses": "Licencias",
"@settingsAboutActionsLicenses": {},
"settingsAboutActionsProjectHomepage": "Página de inicio del proyecto",
"@settingsAboutActionsProjectHomepage": {},
"settingsAboutName": "Información",
"@settingsAboutName": {},
"settingsAboutVersion": "versión {version}",
"@settingsAboutVersion": {
"placeholders": {
"version": {
"type": "String"
}
}
},
"settingsMusicName": "Música",
"@settingsMusicName": {},
"settingsMusicOptionsScrobbleDescriptionOff": "No hagas historial de reproducción de scrobble",
"@settingsMusicOptionsScrobbleDescriptionOff": {},
"settingsMusicOptionsScrobbleDescriptionOn": "Historial de reproducción de scrobble",
"@settingsMusicOptionsScrobbleDescriptionOn": {},
"settingsMusicOptionsScrobbleTitle": "Obras de teatro de Scrobble",
"@settingsMusicOptionsScrobbleTitle": {},
"settingsNetworkName": "Sitio",
"@settingsNetworkName": {},
"settingsNetworkOptionsMaxBitrateMobileTitle": "Tasa de bits máxima (mobile)",
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
"settingsNetworkOptionsMaxBitrateWifiTitle": "Tasa de bits máxima (Wi-Fi)",
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
"settingsNetworkOptionsMaxBufferTitle": "Máxima de buffer tiempo",
"@settingsNetworkOptionsMaxBufferTitle": {},
"settingsNetworkOptionsMinBufferTitle": "Mínimo de buffer tiempo",
"@settingsNetworkOptionsMinBufferTitle": {},
"settingsNetworkValuesKbps": "{value} kilobytes por segundo",
"@settingsNetworkValuesKbps": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesSeconds": "{value} segundos",
"@settingsNetworkValuesSeconds": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesUnlimitedKbps": "Ilimitados",
"@settingsNetworkValuesUnlimitedKbps": {},
"settingsResetActionsClearImageCache": "Caché de imágenes claras",
"@settingsResetActionsClearImageCache": {},
"settingsResetName": "Reinicializar",
"@settingsResetName": {},
"settingsServersActionsAdd": "Agregar Servidor",
"@settingsServersActionsAdd": {},
"settingsServersActionsDelete": "Supr",
"@settingsServersActionsDelete": {},
"settingsServersActionsEdit": "Editar Servidor",
"@settingsServersActionsEdit": {},
"settingsServersActionsSave": "Enviar",
"@settingsServersActionsSave": {},
"settingsServersActionsTestConnection": "Conexión de prueba",
"@settingsServersActionsTestConnection": {},
"settingsServersFieldsAddress": "Alocución",
"@settingsServersFieldsAddress": {},
"settingsServersFieldsPassword": "La contraseña",
"@settingsServersFieldsPassword": {},
"settingsServersFieldsUsername": "Nombre de usuario",
"@settingsServersFieldsUsername": {},
"settingsServersMessagesConnectionFailed": "La conexión a {address} falló, verifique la configuracón o el servidor",
"@settingsServersMessagesConnectionFailed": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersMessagesConnectionOk": "¡Conexión con {address} Ok!",
"@settingsServersMessagesConnectionOk": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersName": "Servidores",
"@settingsServersName": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "Enviar contraseña como token + sal",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "Enviar contraseña en texto plano (¡legado, asegúrese de que su conexión sea segura!)",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
"settingsServersOptionsForcePlaintextPasswordTitle": "Forzar contraseña de texto sin formato",
"@settingsServersOptionsForcePlaintextPasswordTitle": {}
}

View File

@ -1,280 +1,196 @@
{
"actionsStar": "Estrela",
"@actionsStar": {},
"actionsUnstar": "Retirar",
"@actionsUnstar": {},
"messagesNothingHere": "Nada por aquí…",
"@messagesNothingHere": {},
"navigationTabsHome": "Inicio",
"@navigationTabsHome": {},
"navigationTabsLibrary": "Biblioteca",
"@navigationTabsLibrary": {},
"navigationTabsSearch": "Buscar",
"@navigationTabsSearch": {},
"navigationTabsSettings": "Axustes",
"@navigationTabsSettings": {},
"resourcesAlbumActionsPlay": "Reproducir",
"@resourcesAlbumActionsPlay": {},
"resourcesAlbumActionsView": "Ver Álbum",
"@resourcesAlbumActionsView": {},
"resourcesAlbumListsSort": "Ordenar Álbums",
"@resourcesAlbumListsSort": {},
"resourcesAlbumName": "{count,plural, =1{Álbum} other{Álbums}}",
"@resourcesAlbumName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesArtistActionsView": "Ver Artista",
"@resourcesArtistActionsView": {},
"resourcesArtistListsSort": "Ordenar Artistas",
"@resourcesArtistListsSort": {},
"resourcesArtistName": "{count,plural, =1{Artista} other{Artistas}}",
"@resourcesArtistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesFilterGenre": "Por xénero",
"@resourcesFilterGenre": {},
"resourcesFilterStarred": "Favoritas",
"@resourcesFilterStarred": {},
"resourcesPlaylistActionsPlay": "Reproducir lista",
"@resourcesPlaylistActionsPlay": {},
"resourcesPlaylistName": "{count,plural, =1{Listaxe} other{Listaxes}}",
"@resourcesPlaylistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesQueueName": "{count,plural, =1{Fila} other{Filas}}",
"@resourcesQueueName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSongListsArtistTopSongs": "Máis reproducidas",
"@resourcesSongListsArtistTopSongs": {},
"resourcesSongName": "{count,plural, =1{Canción} other{Cancións}}",
"@resourcesSongName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSortByAdded": "Últimas engadidas",
"@resourcesSortByAdded": {},
"resourcesSortByArtist": "Por artista",
"@resourcesSortByArtist": {},
"resourcesSortByFrequentlyPlayed": "Reproducidas a miúdo",
"@resourcesSortByFrequentlyPlayed": {},
"resourcesSortByName": "Por nome",
"@resourcesSortByName": {},
"resourcesSortByRandom": "Ao chou",
"@resourcesSortByRandom": {},
"resourcesSortByRecentlyPlayed": "Reproducidas a miúdo",
"@resourcesSortByRecentlyPlayed": {},
"resourcesSortByYear": "Por ano",
"@resourcesSortByYear": {},
"searchHeaderTitle": "Buscar: {query}",
"@searchHeaderTitle": {
"placeholders": {
"query": {
"type": "String"
}
}
},
"searchInputPlaceholder": "Buscar",
"@searchInputPlaceholder": {},
"searchMoreResults": "Máis…",
"@searchMoreResults": {},
"searchNowPlayingContext": "Resultados",
"@searchNowPlayingContext": {},
"settingsAboutActionsLicenses": "Licenzas",
"@settingsAboutActionsLicenses": {},
"settingsAboutActionsProjectHomepage": "Web do Proxecto",
"@settingsAboutActionsProjectHomepage": {},
"settingsAboutName": "Acerca de",
"@settingsAboutName": {},
"settingsAboutVersion": "versión {version}",
"@settingsAboutVersion": {
"placeholders": {
"version": {
"type": "String"
}
}
},
"settingsMusicName": "Música",
"@settingsMusicName": {},
"settingsMusicOptionsScrobbleDescriptionOff": "Non rexistrar o historial de reprodución",
"@settingsMusicOptionsScrobbleDescriptionOff": {},
"settingsMusicOptionsScrobbleDescriptionOn": "Rexistrar o historial de reprodución",
"@settingsMusicOptionsScrobbleDescriptionOn": {},
"settingsMusicOptionsScrobbleTitle": "Rexistrar reprodución",
"@settingsMusicOptionsScrobbleTitle": {},
"settingsNetworkName": "Rede",
"@settingsNetworkName": {},
"settingsNetworkOptionsMaxBitrateMobileTitle": "Bitrate máx. (móbil)",
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
"settingsNetworkOptionsMaxBitrateWifiTitle": "Bitrate máx. (Wi-Fi)",
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
"settingsNetworkOptionsMaxBufferTitle": "Tempo máximo na memoria",
"@settingsNetworkOptionsMaxBufferTitle": {},
"settingsNetworkOptionsMinBufferTitle": "Tempo mínimo na memoria",
"@settingsNetworkOptionsMinBufferTitle": {},
"settingsNetworkValuesKbps": "{value}kbps",
"@settingsNetworkValuesKbps": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesSeconds": "{value} segundos",
"@settingsNetworkValuesSeconds": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesUnlimitedKbps": "Sen límite",
"@settingsNetworkValuesUnlimitedKbps": {},
"settingsResetActionsClearImageCache": "Limpar a caché de imaxes",
"@settingsResetActionsClearImageCache": {},
"settingsResetName": "Restablecer",
"@settingsResetName": {},
"settingsServersActionsAdd": "Engadir Servidor",
"@settingsServersActionsAdd": {},
"settingsServersActionsDelete": "Eliminar",
"@settingsServersActionsDelete": {},
"settingsServersActionsEdit": "Editar Servidor",
"@settingsServersActionsEdit": {},
"settingsServersActionsSave": "Gardar",
"@settingsServersActionsSave": {},
"settingsServersActionsTestConnection": "Comprobar Conexión",
"@settingsServersActionsTestConnection": {},
"settingsServersFieldsAddress": "Enderezo",
"@settingsServersFieldsAddress": {},
"settingsServersFieldsPassword": "Contrasinal",
"@settingsServersFieldsPassword": {},
"settingsServersFieldsUsername": "Identificador",
"@settingsServersFieldsUsername": {},
"settingsServersMessagesConnectionFailed": "Fallou a conexión a {address}, comproba os axustes",
"@settingsServersMessagesConnectionFailed": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersMessagesConnectionOk": "Conexión con {address} OK!",
"@settingsServersMessagesConnectionOk": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersName": "Servidores",
"@settingsServersName": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "Enviar contrasinal como token + salt",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "Enviar contrasinal en texto plano (herdado, pon coidado en que a conexión sexa segura!)",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
"settingsServersOptionsForcePlaintextPasswordTitle": "Forzar contrasinal en texto plano",
"@settingsServersOptionsForcePlaintextPasswordTitle": {},
"actionsCancel": "Cancelar",
"@actionsCancel": {},
"actionsDelete": "Eliminar",
"@actionsDelete": {},
"actionsDownload": "Descargar",
"@actionsDownload": {},
"actionsDownloadCancel": "Cancelar a descarga",
"@actionsDownloadCancel": {},
"actionsDownloadDelete": "Eliminar o descargado",
"@actionsDownloadDelete": {},
"actionsOk": "OK",
"@actionsOk": {},
"controlsShuffle": "Barallar",
"@controlsShuffle": {},
"resourcesAlbumCount": "{count,plural, =1{{count} álbum} other{{count} álbums}}",
"@resourcesAlbumCount": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesArtistCount": "{count,plural, =1{{count} artista} other{{count} artistas}}",
"@resourcesArtistCount": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesFilterAlbum": "Álbum",
"@resourcesFilterAlbum": {},
"resourcesFilterArtist": "Artista",
"@resourcesFilterArtist": {},
"resourcesFilterOwner": "Dono",
"@resourcesFilterOwner": {},
"resourcesFilterYear": "Ano",
"@resourcesFilterYear": {},
"resourcesPlaylistCount": "{count,plural, =1{{count} lista} other{{count} listas}}",
"@resourcesPlaylistCount": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSongCount": "{count,plural, =1{{count} canción} other{{count} cancións}}",
"@resourcesSongCount": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSongListDeleteAllContent": "Vas eliminar todas as cancións descargadas.",
"@resourcesSongListDeleteAllContent": {},
"resourcesSongListDeleteAllTitle": "Eliminar descargas?",
"@resourcesSongListDeleteAllTitle": {},
"resourcesSortByAlbum": "Álbum",
"@resourcesSortByAlbum": {},
"resourcesSortByAlbumCount": "Número de álbums",
"@resourcesSortByAlbumCount": {},
"settingsAboutActionsSupport": "Axuda ao desenvolvemento 💜",
"@settingsAboutActionsSupport": {},
"settingsNetworkOptionsOfflineMode": "Modo sen conexión",
"@settingsNetworkOptionsOfflineMode": {},
"settingsNetworkOptionsOfflineModeOff": "Usa internet para sincr. música.",
"@settingsNetworkOptionsOfflineModeOff": {},
"settingsNetworkOptionsOfflineModeOn": "Non usar internet para sincr. ou reproducir música.",
"@settingsNetworkOptionsOfflineModeOn": {},
"settingsNetworkOptionsStreamFormat": "Modo de reprodución preferido",
"@settingsNetworkOptionsStreamFormat": {},
"settingsNetworkOptionsStreamFormatServerDefault": "Usar por defecto do servidor",
"@settingsNetworkOptionsStreamFormatServerDefault": {},
"settingsServersFieldsName": "Nome",
"@settingsServersFieldsName": {},
"resourcesSortByTitle": "Título",
"@resourcesSortByTitle": {},
"resourcesSortByUpdated": "Actualizado recentemente",
"@resourcesSortByUpdated": {},
"settingsAboutShareLogs": "Compartir rexistros",
"@settingsAboutShareLogs": {},
"settingsAboutChooseLog": "Escolle un ficheiro de rexistro",
"@settingsAboutChooseLog": {}
}
"actionsStar": "Estrela",
"@actionsStar": {},
"actionsUnstar": "Retirar",
"@actionsUnstar": {},
"messagesNothingHere": "Nada por aquí…",
"@messagesNothingHere": {},
"navigationTabsHome": "Inicio",
"@navigationTabsHome": {},
"navigationTabsLibrary": "Biblioteca",
"@navigationTabsLibrary": {},
"navigationTabsSearch": "Buscar",
"@navigationTabsSearch": {},
"navigationTabsSettings": "Axustes",
"@navigationTabsSettings": {},
"resourcesAlbumActionsPlay": "Reproducir",
"@resourcesAlbumActionsPlay": {},
"resourcesAlbumActionsView": "Ver Álbum",
"@resourcesAlbumActionsView": {},
"resourcesAlbumListsSort": "Ordenar Álbums",
"@resourcesAlbumListsSort": {},
"resourcesAlbumName": "{count,plural, =1{Álbum} other{Álbums}}",
"@resourcesAlbumName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesArtistActionsView": "Ver Artista",
"@resourcesArtistActionsView": {},
"resourcesArtistListsSort": "Ordenar Artistas",
"@resourcesArtistListsSort": {},
"resourcesArtistName": "{count,plural, =1{Artista} other{Artistas}}",
"@resourcesArtistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesFilterGenre": "Por xénero",
"@resourcesFilterGenre": {},
"resourcesFilterStarred": "Favoritas",
"@resourcesFilterStarred": {},
"resourcesPlaylistActionsPlay": "Reproducir lista",
"@resourcesPlaylistActionsPlay": {},
"resourcesPlaylistName": "{count,plural, =1{Listaxe} other{Listaxes}}",
"@resourcesPlaylistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesQueueName": "{count,plural, =1{Fila} other{Filas}}",
"@resourcesQueueName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSongListsArtistTopSongs": "Máis reproducidas",
"@resourcesSongListsArtistTopSongs": {},
"resourcesSongName": "{count,plural, =1{Canción} other{Cancións}}",
"@resourcesSongName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSortByAdded": "Últimas engadidas",
"@resourcesSortByAdded": {},
"resourcesSortByArtist": "Por artista",
"@resourcesSortByArtist": {},
"resourcesSortByFrequentlyPlayed": "Reproducidas a miúdo",
"@resourcesSortByFrequentlyPlayed": {},
"resourcesSortByName": "Por nome",
"@resourcesSortByName": {},
"resourcesSortByRandom": "Ao chou",
"@resourcesSortByRandom": {},
"resourcesSortByRecentlyPlayed": "Reproducidas a miúdo",
"@resourcesSortByRecentlyPlayed": {},
"resourcesSortByYear": "Por ano",
"@resourcesSortByYear": {},
"searchHeaderTitle": "Buscar: {query}",
"@searchHeaderTitle": {
"placeholders": {
"query": {
"type": "String"
}
}
},
"searchInputPlaceholder": "Buscar",
"@searchInputPlaceholder": {},
"searchMoreResults": "Máis…",
"@searchMoreResults": {},
"searchNowPlayingContext": "Resultados",
"@searchNowPlayingContext": {},
"settingsAboutActionsLicenses": "Licenzas",
"@settingsAboutActionsLicenses": {},
"settingsAboutActionsProjectHomepage": "Web do Proxecto",
"@settingsAboutActionsProjectHomepage": {},
"settingsAboutName": "Acerca de",
"@settingsAboutName": {},
"settingsAboutVersion": "versión {version}",
"@settingsAboutVersion": {
"placeholders": {
"version": {
"type": "String"
}
}
},
"settingsMusicName": "Música",
"@settingsMusicName": {},
"settingsMusicOptionsScrobbleDescriptionOff": "Non rexistrar o historial de reprodución",
"@settingsMusicOptionsScrobbleDescriptionOff": {},
"settingsMusicOptionsScrobbleDescriptionOn": "Rexistrar o historial de reprodución",
"@settingsMusicOptionsScrobbleDescriptionOn": {},
"settingsMusicOptionsScrobbleTitle": "Rexistrar reprodución",
"@settingsMusicOptionsScrobbleTitle": {},
"settingsNetworkName": "Rede",
"@settingsNetworkName": {},
"settingsNetworkOptionsMaxBitrateMobileTitle": "Bitrate máx. (móbil)",
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
"settingsNetworkOptionsMaxBitrateWifiTitle": "Bitrate máx. (Wi-Fi)",
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
"settingsNetworkOptionsMaxBufferTitle": "Tempo máximo na memoria",
"@settingsNetworkOptionsMaxBufferTitle": {},
"settingsNetworkOptionsMinBufferTitle": "Tempo mínimo na memoria",
"@settingsNetworkOptionsMinBufferTitle": {},
"settingsNetworkValuesKbps": "{value}kbps",
"@settingsNetworkValuesKbps": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesSeconds": "{value} segundos",
"@settingsNetworkValuesSeconds": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesUnlimitedKbps": "Sen límite",
"@settingsNetworkValuesUnlimitedKbps": {},
"settingsResetActionsClearImageCache": "Limpar a caché de imaxes",
"@settingsResetActionsClearImageCache": {},
"settingsResetName": "Restablecer",
"@settingsResetName": {},
"settingsServersActionsAdd": "Engadir Servidor",
"@settingsServersActionsAdd": {},
"settingsServersActionsDelete": "Eliminar",
"@settingsServersActionsDelete": {},
"settingsServersActionsEdit": "Editar Servidor",
"@settingsServersActionsEdit": {},
"settingsServersActionsSave": "Gardar",
"@settingsServersActionsSave": {},
"settingsServersActionsTestConnection": "Comprobar Conexión",
"@settingsServersActionsTestConnection": {},
"settingsServersFieldsAddress": "Enderezo",
"@settingsServersFieldsAddress": {},
"settingsServersFieldsPassword": "Contrasinal",
"@settingsServersFieldsPassword": {},
"settingsServersFieldsUsername": "Identificador",
"@settingsServersFieldsUsername": {},
"settingsServersMessagesConnectionFailed": "Fallou a conexión a {address}, comproba os axustes",
"@settingsServersMessagesConnectionFailed": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersMessagesConnectionOk": "Conexión con {address} OK!",
"@settingsServersMessagesConnectionOk": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersName": "Servidores",
"@settingsServersName": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "Enviar contrasinal como token + salt",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "Enviar contrasinal en texto plano (herdado, pon coidado en que a conexión sexa segura!)",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
"settingsServersOptionsForcePlaintextPasswordTitle": "Forzar contrasinal en texto plano",
"@settingsServersOptionsForcePlaintextPasswordTitle": {}
}

View File

@ -1,230 +1,196 @@
{
"actionsStar": "Favorito",
"@actionsStar": {},
"actionsUnstar": "Remover favorito",
"@actionsUnstar": {},
"messagesNothingHere": "Não existe nada…",
"@messagesNothingHere": {},
"navigationTabsHome": "Início",
"@navigationTabsHome": {},
"navigationTabsLibrary": "Biblioteca",
"@navigationTabsLibrary": {},
"navigationTabsSearch": "Procurar",
"@navigationTabsSearch": {},
"navigationTabsSettings": "Definições",
"@navigationTabsSettings": {},
"resourcesAlbumActionsPlay": "Tocar Álbum",
"@resourcesAlbumActionsPlay": {},
"resourcesAlbumActionsView": "Ver Álbum",
"@resourcesAlbumActionsView": {},
"resourcesAlbumListsSort": "Ordenar Álbuns",
"@resourcesAlbumListsSort": {},
"resourcesAlbumName": "{count,plural, =1{Álbum} other{Álbuns}}",
"@resourcesAlbumName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesArtistActionsView": "Ver Artista",
"@resourcesArtistActionsView": {},
"resourcesArtistListsSort": "Ordenar Artistas",
"@resourcesArtistListsSort": {},
"resourcesArtistName": "{count,plural, =1{Artista} other{Artistas}}",
"@resourcesArtistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesFilterGenre": "Por Género",
"@resourcesFilterGenre": {},
"resourcesFilterStarred": "Favoritos",
"@resourcesFilterStarred": {},
"resourcesPlaylistActionsPlay": "Tocar Playlist",
"@resourcesPlaylistActionsPlay": {},
"resourcesPlaylistName": "{count,plural, =1{Lista} other{Listas}}",
"@resourcesPlaylistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesQueueName": "{count,plural, =1{Fila} other{Filas}}",
"@resourcesQueueName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSongListsArtistTopSongs": "Top Músicas",
"@resourcesSongListsArtistTopSongs": {},
"resourcesSongName": "{count,plural, =1{Música} other{Músicas}}",
"@resourcesSongName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSortByAdded": "Adicionado recentemente",
"@resourcesSortByAdded": {},
"resourcesSortByArtist": "Por Artista",
"@resourcesSortByArtist": {},
"resourcesSortByFrequentlyPlayed": "Mais Tocado",
"@resourcesSortByFrequentlyPlayed": {},
"resourcesSortByName": "Por Nome",
"@resourcesSortByName": {},
"resourcesSortByRandom": "Aleatório",
"@resourcesSortByRandom": {},
"resourcesSortByRecentlyPlayed": "Ouviu recentemente",
"@resourcesSortByRecentlyPlayed": {},
"resourcesSortByYear": "Por Ano",
"@resourcesSortByYear": {},
"searchHeaderTitle": "Procurar: {query}",
"@searchHeaderTitle": {
"placeholders": {
"query": {
"type": "String"
}
}
},
"searchInputPlaceholder": "Procurar",
"@searchInputPlaceholder": {},
"searchMoreResults": "Mais…",
"@searchMoreResults": {},
"searchNowPlayingContext": "Resultados da Pesquisa",
"@searchNowPlayingContext": {},
"settingsAboutActionsLicenses": "Licenças",
"@settingsAboutActionsLicenses": {},
"settingsAboutActionsProjectHomepage": "Página do Projeto",
"@settingsAboutActionsProjectHomepage": {},
"settingsAboutName": "Acerca",
"@settingsAboutName": {},
"settingsAboutVersion": "versão {version}",
"@settingsAboutVersion": {
"placeholders": {
"version": {
"type": "String"
}
}
},
"settingsMusicName": "Música",
"@settingsMusicName": {},
"settingsMusicOptionsScrobbleDescriptionOff": "Não enviar histórico de reproduções por scrobble",
"@settingsMusicOptionsScrobbleDescriptionOff": {},
"settingsMusicOptionsScrobbleDescriptionOn": "Enviar histórico de reproduções por scrobble",
"@settingsMusicOptionsScrobbleDescriptionOn": {},
"settingsMusicOptionsScrobbleTitle": "Enviar reproduções por scrobble",
"@settingsMusicOptionsScrobbleTitle": {},
"settingsNetworkName": "Rede",
"@settingsNetworkName": {},
"settingsNetworkOptionsMaxBitrateMobileTitle": "Bitrate Máximo (móvel)",
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
"settingsNetworkOptionsMaxBitrateWifiTitle": "Bitrate Máximo (Wi-Fi)",
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
"settingsNetworkOptionsMaxBufferTitle": "Tempo de buffer máximo",
"@settingsNetworkOptionsMaxBufferTitle": {},
"settingsNetworkOptionsMinBufferTitle": "Tempo de buffer mínimo",
"@settingsNetworkOptionsMinBufferTitle": {},
"settingsNetworkValuesKbps": "{value}kbps",
"@settingsNetworkValuesKbps": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesSeconds": "{value} segundos",
"@settingsNetworkValuesSeconds": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesUnlimitedKbps": "Ilimitado",
"@settingsNetworkValuesUnlimitedKbps": {},
"settingsResetActionsClearImageCache": "Limpar cache de Imagens",
"@settingsResetActionsClearImageCache": {},
"settingsResetName": "Redefinir",
"@settingsResetName": {},
"settingsServersActionsAdd": "Adicionar Servidor",
"@settingsServersActionsAdd": {},
"settingsServersActionsDelete": "Apagar",
"@settingsServersActionsDelete": {},
"settingsServersActionsEdit": "Editar Servidor",
"@settingsServersActionsEdit": {},
"settingsServersActionsSave": "Guardar",
"@settingsServersActionsSave": {},
"settingsServersActionsTestConnection": "Testar Ligação",
"@settingsServersActionsTestConnection": {},
"settingsServersFieldsAddress": "Endereço",
"@settingsServersFieldsAddress": {},
"settingsServersFieldsPassword": "Senha",
"@settingsServersFieldsPassword": {},
"settingsServersFieldsUsername": "Nome de utilizador",
"@settingsServersFieldsUsername": {},
"settingsServersMessagesConnectionFailed": "Ligação a {address} falhou, verifique definições ou servidor",
"@settingsServersMessagesConnectionFailed": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersMessagesConnectionOk": "Ligação a {address} OK!",
"@settingsServersMessagesConnectionOk": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersName": "Servidores",
"@settingsServersName": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "Enviar senha como token + sal",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "Enviar senha em texto simples (antigo, certifique-se que a sua ligação é segura!)",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
"settingsServersOptionsForcePlaintextPasswordTitle": "Forçar password em texto simples",
"@settingsServersOptionsForcePlaintextPasswordTitle": {},
"actionsCancel": "Cancelar",
"@actionsCancel": {},
"actionsDelete": "Apagar",
"@actionsDelete": {},
"actionsDownload": "Descarregar",
"@actionsDownload": {},
"actionsDownloadCancel": "Cancelar descarga",
"@actionsDownloadCancel": {},
"actionsDownloadDelete": "Apagar descarga",
"@actionsDownloadDelete": {},
"resourcesFilterAlbum": "Álbum",
"@resourcesFilterAlbum": {},
"resourcesFilterArtist": "Artista",
"@resourcesFilterArtist": {},
"resourcesFilterYear": "Ano",
"@resourcesFilterYear": {},
"resourcesSortByAlbum": "Álbum",
"@resourcesSortByAlbum": {},
"settingsAboutActionsSupport": "Apoie o programador 💜",
"@settingsAboutActionsSupport": {},
"settingsNetworkOptionsOfflineMode": "Modo offline",
"@settingsNetworkOptionsOfflineMode": {},
"settingsNetworkOptionsOfflineModeOff": "Usar a internet para sincronizar música.",
"@settingsNetworkOptionsOfflineModeOff": {},
"settingsNetworkOptionsOfflineModeOn": "Não usar a internet para sincronizar ou tocar música.",
"@settingsNetworkOptionsOfflineModeOn": {},
"settingsNetworkOptionsStreamFormat": "Formato preferido de streaming",
"@settingsNetworkOptionsStreamFormat": {},
"resourcesSortByTitle": "Título",
"@resourcesSortByTitle": {},
"actionsOk": "OK",
"@actionsOk": {},
"controlsShuffle": "Aleatório",
"@controlsShuffle": {}
}
"actionsStar": "Favorito",
"@actionsStar": {},
"actionsUnstar": "Remover favorito",
"@actionsUnstar": {},
"messagesNothingHere": "Não existe nada…",
"@messagesNothingHere": {},
"navigationTabsHome": "Início",
"@navigationTabsHome": {},
"navigationTabsLibrary": "Biblioteca",
"@navigationTabsLibrary": {},
"navigationTabsSearch": "Procurar",
"@navigationTabsSearch": {},
"navigationTabsSettings": "Definições",
"@navigationTabsSettings": {},
"resourcesAlbumActionsPlay": "Tocar Álbum",
"@resourcesAlbumActionsPlay": {},
"resourcesAlbumActionsView": "Ver Álbum",
"@resourcesAlbumActionsView": {},
"resourcesAlbumListsSort": "Ordenar Álbuns",
"@resourcesAlbumListsSort": {},
"resourcesAlbumName": "{count,plural, =1{Álbum} other{Álbuns}}",
"@resourcesAlbumName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesArtistActionsView": "Ver Artista",
"@resourcesArtistActionsView": {},
"resourcesArtistListsSort": "Ordenar Artistas",
"@resourcesArtistListsSort": {},
"resourcesArtistName": "{count,plural, =1{Artista} other{Artistas}}",
"@resourcesArtistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesFilterGenre": "Por Género",
"@resourcesFilterGenre": {},
"resourcesFilterStarred": "Favoritos",
"@resourcesFilterStarred": {},
"resourcesPlaylistActionsPlay": "Tocar Playlist",
"@resourcesPlaylistActionsPlay": {},
"resourcesPlaylistName": "{count,plural, =1{Lista} other{Listas}}",
"@resourcesPlaylistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesQueueName": "{count,plural, =1{Fila} other{Filas}}",
"@resourcesQueueName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSongListsArtistTopSongs": "Top Músicas",
"@resourcesSongListsArtistTopSongs": {},
"resourcesSongName": "{count,plural, =1{Música} other{Músicas}}",
"@resourcesSongName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSortByAdded": "Adicionado recentemente",
"@resourcesSortByAdded": {},
"resourcesSortByArtist": "Por Artista",
"@resourcesSortByArtist": {},
"resourcesSortByFrequentlyPlayed": "Mais Tocado",
"@resourcesSortByFrequentlyPlayed": {},
"resourcesSortByName": "Por Nome",
"@resourcesSortByName": {},
"resourcesSortByRandom": "Aleatório",
"@resourcesSortByRandom": {},
"resourcesSortByRecentlyPlayed": "Ouviu recentemente",
"@resourcesSortByRecentlyPlayed": {},
"resourcesSortByYear": "Por Ano",
"@resourcesSortByYear": {},
"searchHeaderTitle": "Procurar: {query}",
"@searchHeaderTitle": {
"placeholders": {
"query": {
"type": "String"
}
}
},
"searchInputPlaceholder": "Procurar",
"@searchInputPlaceholder": {},
"searchMoreResults": "Mais…",
"@searchMoreResults": {},
"searchNowPlayingContext": "Resultados da Pesquisa",
"@searchNowPlayingContext": {},
"settingsAboutActionsLicenses": "Licenças",
"@settingsAboutActionsLicenses": {},
"settingsAboutActionsProjectHomepage": "Página do Projeto",
"@settingsAboutActionsProjectHomepage": {},
"settingsAboutName": "Acerca",
"@settingsAboutName": {},
"settingsAboutVersion": "versão {version}",
"@settingsAboutVersion": {
"placeholders": {
"version": {
"type": "String"
}
}
},
"settingsMusicName": "Música",
"@settingsMusicName": {},
"settingsMusicOptionsScrobbleDescriptionOff": "Não enviar histórico de reproduções por scrobble",
"@settingsMusicOptionsScrobbleDescriptionOff": {},
"settingsMusicOptionsScrobbleDescriptionOn": "Enviar histórico de reproduções por scrobble",
"@settingsMusicOptionsScrobbleDescriptionOn": {},
"settingsMusicOptionsScrobbleTitle": "Enviar reproduções por scrobble",
"@settingsMusicOptionsScrobbleTitle": {},
"settingsNetworkName": "Rede",
"@settingsNetworkName": {},
"settingsNetworkOptionsMaxBitrateMobileTitle": "Bitrate Máximo (móvel)",
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
"settingsNetworkOptionsMaxBitrateWifiTitle": "Bitrate Máximo (Wi-Fi)",
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
"settingsNetworkOptionsMaxBufferTitle": "Tempo de buffer máximo",
"@settingsNetworkOptionsMaxBufferTitle": {},
"settingsNetworkOptionsMinBufferTitle": "Tempo de buffer mínimo",
"@settingsNetworkOptionsMinBufferTitle": {},
"settingsNetworkValuesKbps": "{value}kbps",
"@settingsNetworkValuesKbps": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesSeconds": "{value} segundos",
"@settingsNetworkValuesSeconds": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesUnlimitedKbps": "Ilimitado",
"@settingsNetworkValuesUnlimitedKbps": {},
"settingsResetActionsClearImageCache": "Limpar cache de Imagens",
"@settingsResetActionsClearImageCache": {},
"settingsResetName": "Redefinir",
"@settingsResetName": {},
"settingsServersActionsAdd": "Adicionar Servidor",
"@settingsServersActionsAdd": {},
"settingsServersActionsDelete": "Apagar",
"@settingsServersActionsDelete": {},
"settingsServersActionsEdit": "Editar Servidor",
"@settingsServersActionsEdit": {},
"settingsServersActionsSave": "Guardar",
"@settingsServersActionsSave": {},
"settingsServersActionsTestConnection": "Testar Ligação",
"@settingsServersActionsTestConnection": {},
"settingsServersFieldsAddress": "Endereço",
"@settingsServersFieldsAddress": {},
"settingsServersFieldsPassword": "Senha",
"@settingsServersFieldsPassword": {},
"settingsServersFieldsUsername": "Nome de utilizador",
"@settingsServersFieldsUsername": {},
"settingsServersMessagesConnectionFailed": "Ligação a {address} falhou, verifique definições ou servidor",
"@settingsServersMessagesConnectionFailed": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersMessagesConnectionOk": "Ligação a {address} OK!",
"@settingsServersMessagesConnectionOk": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersName": "Servidores",
"@settingsServersName": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "Enviar senha como token + sal",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "Enviar senha em texto simples (antigo, certifique-se que a sua ligação é segura!)",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
"settingsServersOptionsForcePlaintextPasswordTitle": "Forçar password em texto simples",
"@settingsServersOptionsForcePlaintextPasswordTitle": {}
}

View File

@ -1,280 +1,196 @@
{
"actionsStar": "Избранное",
"@actionsStar": {},
"actionsUnstar": "Убрать из избранного",
"@actionsUnstar": {},
"messagesNothingHere": "Здесь ничего нет…",
"@messagesNothingHere": {},
"navigationTabsHome": "Главная",
"@navigationTabsHome": {},
"navigationTabsLibrary": "Библиотека",
"@navigationTabsLibrary": {},
"navigationTabsSearch": "Поиск",
"@navigationTabsSearch": {},
"navigationTabsSettings": "Настройки",
"@navigationTabsSettings": {},
"resourcesAlbumActionsPlay": "Воспроизвести альбом",
"@resourcesAlbumActionsPlay": {},
"resourcesAlbumActionsView": "Посмотреть альбом",
"@resourcesAlbumActionsView": {},
"resourcesAlbumListsSort": "Сортировка альбомов",
"@resourcesAlbumListsSort": {},
"resourcesAlbumName": "{count,plural, =1{Альбом} few{Альбомы} many{Альбомов} other{Альбомов}}",
"@resourcesAlbumName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesArtistActionsView": "Посмотреть исполнителя",
"@resourcesArtistActionsView": {},
"resourcesArtistListsSort": "Сортировать исполнителей",
"@resourcesArtistListsSort": {},
"resourcesArtistName": "{count,plural, =1{Исполнитель} few{Исполнители} many{Исполнителей} other{Исполнителей}}",
"@resourcesArtistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesFilterGenre": "По жанру",
"@resourcesFilterGenre": {},
"resourcesFilterStarred": "Избранные",
"@resourcesFilterStarred": {},
"resourcesPlaylistActionsPlay": "Воспроизвести плейлист",
"@resourcesPlaylistActionsPlay": {},
"resourcesPlaylistName": "{count,plural, =1{Плейлист} few{Плейлисты} many{Плейлистов} other{Плейлистов}}",
"@resourcesPlaylistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesQueueName": "{count,plural, =1{Очередь} few{Очереди} many{Очередей} other{Очередей}}",
"@resourcesQueueName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSongListsArtistTopSongs": "Лучшие треки",
"@resourcesSongListsArtistTopSongs": {},
"resourcesSongName": "{count,plural, =1{Трек} few{Трека} many{Треков} other{Треков}}",
"@resourcesSongName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSortByAdded": "Недавно добавленные",
"@resourcesSortByAdded": {},
"resourcesSortByArtist": "По исполнителям",
"@resourcesSortByArtist": {},
"resourcesSortByFrequentlyPlayed": "Часто проигрываемые",
"@resourcesSortByFrequentlyPlayed": {},
"resourcesSortByName": "По имени",
"@resourcesSortByName": {},
"resourcesSortByRandom": "Случайно",
"@resourcesSortByRandom": {},
"resourcesSortByRecentlyPlayed": "Недавно проигранные",
"@resourcesSortByRecentlyPlayed": {},
"resourcesSortByYear": "По году",
"@resourcesSortByYear": {},
"searchHeaderTitle": "Поиск: {query}",
"@searchHeaderTitle": {
"placeholders": {
"query": {
"type": "String"
}
}
},
"searchInputPlaceholder": "Поиск",
"@searchInputPlaceholder": {},
"searchMoreResults": "Больше…",
"@searchMoreResults": {},
"searchNowPlayingContext": "Результаты поиска",
"@searchNowPlayingContext": {},
"settingsAboutActionsLicenses": "Лицензии",
"@settingsAboutActionsLicenses": {},
"settingsAboutActionsProjectHomepage": "Сайт проекта",
"@settingsAboutActionsProjectHomepage": {},
"settingsAboutName": "О Subtracks",
"@settingsAboutName": {},
"settingsAboutVersion": "версия {version}",
"@settingsAboutVersion": {
"placeholders": {
"version": {
"type": "String"
}
}
},
"settingsMusicName": "Музыка",
"@settingsMusicName": {},
"settingsMusicOptionsScrobbleDescriptionOff": "Не отправлять историю воспроизведений",
"@settingsMusicOptionsScrobbleDescriptionOff": {},
"settingsMusicOptionsScrobbleDescriptionOn": "Скробблинг истории воспроизведения",
"@settingsMusicOptionsScrobbleDescriptionOn": {},
"settingsMusicOptionsScrobbleTitle": "Скробблинг",
"@settingsMusicOptionsScrobbleTitle": {},
"settingsNetworkName": "Сеть",
"@settingsNetworkName": {},
"settingsNetworkOptionsMaxBitrateMobileTitle": "Максимальный битрейт (мобильный интернет)",
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
"settingsNetworkOptionsMaxBitrateWifiTitle": "Максимальный битрейт (Wi-Fi)",
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
"settingsNetworkOptionsMaxBufferTitle": "Максимальное время буферизации",
"@settingsNetworkOptionsMaxBufferTitle": {},
"settingsNetworkOptionsMinBufferTitle": "Минимальное время буферизации",
"@settingsNetworkOptionsMinBufferTitle": {},
"settingsNetworkValuesKbps": "{value} кбит/с",
"@settingsNetworkValuesKbps": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesSeconds": "{value} секунд",
"@settingsNetworkValuesSeconds": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesUnlimitedKbps": "Без ограничений",
"@settingsNetworkValuesUnlimitedKbps": {},
"settingsResetActionsClearImageCache": "Очистить кэш изображения",
"@settingsResetActionsClearImageCache": {},
"settingsResetName": "Сброс",
"@settingsResetName": {},
"settingsServersActionsAdd": "Добавить сервер",
"@settingsServersActionsAdd": {},
"settingsServersActionsDelete": "Удалить",
"@settingsServersActionsDelete": {},
"settingsServersActionsEdit": "Редактировать сервер",
"@settingsServersActionsEdit": {},
"settingsServersActionsSave": "Сохранить",
"@settingsServersActionsSave": {},
"settingsServersActionsTestConnection": "Проверить подключение",
"@settingsServersActionsTestConnection": {},
"settingsServersFieldsAddress": "Адрес",
"@settingsServersFieldsAddress": {},
"settingsServersFieldsPassword": "Пароль",
"@settingsServersFieldsPassword": {},
"settingsServersFieldsUsername": "Имя пользователя",
"@settingsServersFieldsUsername": {},
"settingsServersMessagesConnectionFailed": "Не удалось подключиться к {address}, проверьте настройки или сервер",
"@settingsServersMessagesConnectionFailed": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersMessagesConnectionOk": "Подключение к {address} установлено!",
"@settingsServersMessagesConnectionOk": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersName": "Серверы",
"@settingsServersName": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "Отправить пароль в виде токена",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "Отправить пароль в виде текста (устарело, убедитесь, что ваше соединение безопасно!)",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
"settingsServersOptionsForcePlaintextPasswordTitle": "Принудительно использовать текстовой пароль",
"@settingsServersOptionsForcePlaintextPasswordTitle": {},
"settingsAboutShareLogs": "Поделиться журналами",
"@settingsAboutShareLogs": {},
"settingsAboutChooseLog": "Выбрать файл журнала",
"@settingsAboutChooseLog": {},
"settingsNetworkOptionsStreamFormatServerDefault": "Использовать сервер по умолчанию",
"@settingsNetworkOptionsStreamFormatServerDefault": {},
"actionsDownload": "Скачать",
"@actionsDownload": {},
"actionsDownloadCancel": "Отменить загрузку",
"@actionsDownloadCancel": {},
"actionsCancel": "Отменить",
"@actionsCancel": {},
"resourcesSongCount": "{count,plural, =1{{count} трек} other{{count} треки}}",
"@resourcesSongCount": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSortByAlbum": "По альбомам",
"@resourcesSortByAlbum": {},
"resourcesSortByTitle": "По заголовку",
"@resourcesSortByTitle": {},
"resourcesSortByUpdated": "По недавно обновленному",
"@resourcesSortByUpdated": {},
"resourcesSortByAlbumCount": "По количеству альбомов",
"@resourcesSortByAlbumCount": {},
"settingsNetworkOptionsOfflineMode": "Автономный режим",
"@settingsNetworkOptionsOfflineMode": {},
"settingsNetworkOptionsOfflineModeOff": "Использовать интернет для синхронизации музыки.",
"@settingsNetworkOptionsOfflineModeOff": {},
"settingsServersFieldsName": "Имя",
"@settingsServersFieldsName": {},
"actionsDelete": "Удалить",
"@actionsDelete": {},
"actionsDownloadDelete": "Удалить загруженное",
"@actionsDownloadDelete": {},
"actionsOk": "ОК",
"@actionsOk": {},
"controlsShuffle": "Перемешать",
"@controlsShuffle": {},
"resourcesFilterArtist": "По исполнителю",
"@resourcesFilterArtist": {},
"resourcesFilterAlbum": "По альбомам",
"@resourcesFilterAlbum": {},
"resourcesFilterYear": "По годам",
"@resourcesFilterYear": {},
"resourcesFilterOwner": "По владельцу",
"@resourcesFilterOwner": {},
"resourcesSongListDeleteAllContent": "Это удалит все загруженные файлы песен.",
"@resourcesSongListDeleteAllContent": {},
"settingsNetworkOptionsStreamFormat": "Предпочтительный формат потока",
"@settingsNetworkOptionsStreamFormat": {},
"resourcesSongListDeleteAllTitle": "Удалить загрузки?",
"@resourcesSongListDeleteAllTitle": {},
"settingsNetworkOptionsOfflineModeOn": "Не использовать интернет для синхронизации или воспроизведения музыки.",
"@settingsNetworkOptionsOfflineModeOn": {},
"settingsAboutActionsSupport": "Поддержать разработчика",
"@settingsAboutActionsSupport": {},
"resourcesArtistCount": "{count,plural, =1{{count} исполнитель} other{{count} исполнители}}",
"@resourcesArtistCount": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesPlaylistCount": "{count,plural, =1{{count} плейлист} other{{count} плейлисты}}",
"@resourcesPlaylistCount": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesAlbumCount": "{count,plural, =1{{count} альбом} other{{count} альбомы}}",
"@resourcesAlbumCount": {
"placeholders": {
"count": {
"type": "int"
}
}
}
}
"actionsStar": "Избранное",
"@actionsStar": {},
"actionsUnstar": "Убрать из избранного",
"@actionsUnstar": {},
"messagesNothingHere": "Здесь ничего нет…",
"@messagesNothingHere": {},
"navigationTabsHome": "Главная",
"@navigationTabsHome": {},
"navigationTabsLibrary": "Библиотека",
"@navigationTabsLibrary": {},
"navigationTabsSearch": "Поиск",
"@navigationTabsSearch": {},
"navigationTabsSettings": "Настройки",
"@navigationTabsSettings": {},
"resourcesAlbumActionsPlay": "Воспроизвести альбом",
"@resourcesAlbumActionsPlay": {},
"resourcesAlbumActionsView": "Посмотреть альбом",
"@resourcesAlbumActionsView": {},
"resourcesAlbumListsSort": "Сортировка альбомов",
"@resourcesAlbumListsSort": {},
"resourcesAlbumName": "{count,plural, =1{Альбом} few{Альбомы} many{Альбомов} other{Альбомов}}",
"@resourcesAlbumName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesArtistActionsView": "Посмотреть исполнителя",
"@resourcesArtistActionsView": {},
"resourcesArtistListsSort": "Сортировать исполнителей",
"@resourcesArtistListsSort": {},
"resourcesArtistName": "{count,plural, =1{Исполнитель} few{Исполнители} many{Исполнителей} other{Исполнителей}}",
"@resourcesArtistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesFilterGenre": "По жанру",
"@resourcesFilterGenre": {},
"resourcesFilterStarred": "Избранные",
"@resourcesFilterStarred": {},
"resourcesPlaylistActionsPlay": "Воспроизвести плейлист",
"@resourcesPlaylistActionsPlay": {},
"resourcesPlaylistName": "{count,plural, =1{Плейлист} few{Плейлисты} many{Плейлистов} other{Плейлистов}}",
"@resourcesPlaylistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesQueueName": "{count,plural, =1{Очередь} few{Очереди} many{Очередей} other{Очередей}}",
"@resourcesQueueName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSongListsArtistTopSongs": "Лучшие треки",
"@resourcesSongListsArtistTopSongs": {},
"resourcesSongName": "{count,plural, =1{Трек} few{Трека} many{Треков} other{Треков}}",
"@resourcesSongName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSortByAdded": "Недавно добавленные",
"@resourcesSortByAdded": {},
"resourcesSortByArtist": "По исполнителю",
"@resourcesSortByArtist": {},
"resourcesSortByFrequentlyPlayed": "Часто проигрываемые",
"@resourcesSortByFrequentlyPlayed": {},
"resourcesSortByName": "По имени",
"@resourcesSortByName": {},
"resourcesSortByRandom": "Случайно",
"@resourcesSortByRandom": {},
"resourcesSortByRecentlyPlayed": "Недавно проигранные",
"@resourcesSortByRecentlyPlayed": {},
"resourcesSortByYear": "По году",
"@resourcesSortByYear": {},
"searchHeaderTitle": "Поиск: {query}",
"@searchHeaderTitle": {
"placeholders": {
"query": {
"type": "String"
}
}
},
"searchInputPlaceholder": "Поиск",
"@searchInputPlaceholder": {},
"searchMoreResults": "Больше…",
"@searchMoreResults": {},
"searchNowPlayingContext": "Результаты поиска",
"@searchNowPlayingContext": {},
"settingsAboutActionsLicenses": "Лицензии",
"@settingsAboutActionsLicenses": {},
"settingsAboutActionsProjectHomepage": "Сайт проекта",
"@settingsAboutActionsProjectHomepage": {},
"settingsAboutName": "О Subtracks",
"@settingsAboutName": {},
"settingsAboutVersion": "версия {version}",
"@settingsAboutVersion": {
"placeholders": {
"version": {
"type": "String"
}
}
},
"settingsMusicName": "Музыка",
"@settingsMusicName": {},
"settingsMusicOptionsScrobbleDescriptionOff": "Не отправлять историю воспроизведений",
"@settingsMusicOptionsScrobbleDescriptionOff": {},
"settingsMusicOptionsScrobbleDescriptionOn": "Скробблинг истории воспроизведения",
"@settingsMusicOptionsScrobbleDescriptionOn": {},
"settingsMusicOptionsScrobbleTitle": "Скробблинг",
"@settingsMusicOptionsScrobbleTitle": {},
"settingsNetworkName": "Сеть",
"@settingsNetworkName": {},
"settingsNetworkOptionsMaxBitrateMobileTitle": "Максимальный битрейт (мобильный интернет)",
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
"settingsNetworkOptionsMaxBitrateWifiTitle": "Максимальный битрейт (Wi-Fi)",
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
"settingsNetworkOptionsMaxBufferTitle": "Максимальное время буферизации",
"@settingsNetworkOptionsMaxBufferTitle": {},
"settingsNetworkOptionsMinBufferTitle": "Минимальное время буферизации",
"@settingsNetworkOptionsMinBufferTitle": {},
"settingsNetworkValuesKbps": "{value} кбит/с",
"@settingsNetworkValuesKbps": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesSeconds": "{value} секунд",
"@settingsNetworkValuesSeconds": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesUnlimitedKbps": "Без ограничений",
"@settingsNetworkValuesUnlimitedKbps": {},
"settingsResetActionsClearImageCache": "Очистить кэш изображения",
"@settingsResetActionsClearImageCache": {},
"settingsResetName": "Сброс",
"@settingsResetName": {},
"settingsServersActionsAdd": "Добавить сервер",
"@settingsServersActionsAdd": {},
"settingsServersActionsDelete": "Удалить",
"@settingsServersActionsDelete": {},
"settingsServersActionsEdit": "Редактировать сервер",
"@settingsServersActionsEdit": {},
"settingsServersActionsSave": "Сохранить",
"@settingsServersActionsSave": {},
"settingsServersActionsTestConnection": "Проверить подключение",
"@settingsServersActionsTestConnection": {},
"settingsServersFieldsAddress": "Адрес",
"@settingsServersFieldsAddress": {},
"settingsServersFieldsPassword": "Пароль",
"@settingsServersFieldsPassword": {},
"settingsServersFieldsUsername": "Имя пользователя",
"@settingsServersFieldsUsername": {},
"settingsServersMessagesConnectionFailed": "Не удалось подключиться к {address}, проверьте настройки или сервер",
"@settingsServersMessagesConnectionFailed": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersMessagesConnectionOk": "Подключение к {address} установлено!",
"@settingsServersMessagesConnectionOk": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersName": "Серверы",
"@settingsServersName": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "Отправить пароль в виде токена",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "Отправить пароль в виде текста (устарело, убедитесь, что ваше соединение безопасно!)",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
"settingsServersOptionsForcePlaintextPasswordTitle": "Принудительно использовать текстовой пароль",
"@settingsServersOptionsForcePlaintextPasswordTitle": {}
}

View File

@ -1,230 +1,196 @@
{
"actionsStar": "收藏",
"@actionsStar": {},
"actionsUnstar": "移除收藏",
"@actionsUnstar": {},
"messagesNothingHere": "什么都没有…",
"@messagesNothingHere": {},
"navigationTabsHome": "首页",
"@navigationTabsHome": {},
"navigationTabsLibrary": "所有",
"@navigationTabsLibrary": {},
"navigationTabsSearch": "搜索",
"@navigationTabsSearch": {},
"navigationTabsSettings": "设置",
"@navigationTabsSettings": {},
"resourcesAlbumActionsPlay": "播放专辑",
"@resourcesAlbumActionsPlay": {},
"resourcesAlbumActionsView": "查看专辑",
"@resourcesAlbumActionsView": {},
"resourcesAlbumListsSort": "专辑排序",
"@resourcesAlbumListsSort": {},
"resourcesAlbumName": "{count,plural, other{专辑}}",
"@resourcesAlbumName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesArtistActionsView": "查看歌手",
"@resourcesArtistActionsView": {},
"resourcesArtistListsSort": "歌手排序",
"@resourcesArtistListsSort": {},
"resourcesArtistName": "{count,plural, other{歌手}}",
"@resourcesArtistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesFilterGenre": "根据类型",
"@resourcesFilterGenre": {},
"resourcesFilterStarred": "已收藏",
"@resourcesFilterStarred": {},
"resourcesPlaylistActionsPlay": "全部播放",
"@resourcesPlaylistActionsPlay": {},
"resourcesPlaylistName": "{count,plural, other{播放列表}}",
"@resourcesPlaylistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesQueueName": "{count,plural, other{队列}}",
"@resourcesQueueName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSongListsArtistTopSongs": "热门歌曲",
"@resourcesSongListsArtistTopSongs": {},
"resourcesSongName": "{count,plural, other{歌曲}}",
"@resourcesSongName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSortByAdded": "最近添加",
"@resourcesSortByAdded": {},
"resourcesSortByArtist": "根据歌手",
"@resourcesSortByArtist": {},
"resourcesSortByFrequentlyPlayed": "播放最多",
"@resourcesSortByFrequentlyPlayed": {},
"resourcesSortByName": "根据名称",
"@resourcesSortByName": {},
"resourcesSortByRandom": "随机",
"@resourcesSortByRandom": {},
"resourcesSortByRecentlyPlayed": "最近播放",
"@resourcesSortByRecentlyPlayed": {},
"resourcesSortByYear": "根据年份",
"@resourcesSortByYear": {},
"searchHeaderTitle": "搜索: {query}",
"@searchHeaderTitle": {
"placeholders": {
"query": {
"type": "String"
}
}
},
"searchInputPlaceholder": "搜索",
"@searchInputPlaceholder": {},
"searchMoreResults": "更多…",
"@searchMoreResults": {},
"searchNowPlayingContext": "搜索结果",
"@searchNowPlayingContext": {},
"settingsAboutActionsLicenses": "许可",
"@settingsAboutActionsLicenses": {},
"settingsAboutActionsProjectHomepage": "项目地址",
"@settingsAboutActionsProjectHomepage": {},
"settingsAboutName": "关于",
"@settingsAboutName": {},
"settingsAboutVersion": "版本 {version}",
"@settingsAboutVersion": {
"placeholders": {
"version": {
"type": "String"
}
}
},
"settingsMusicName": "音乐",
"@settingsMusicName": {},
"settingsMusicOptionsScrobbleDescriptionOff": "不记录scrobble历史",
"@settingsMusicOptionsScrobbleDescriptionOff": {},
"settingsMusicOptionsScrobbleDescriptionOn": "Scrobble播放历史",
"@settingsMusicOptionsScrobbleDescriptionOn": {},
"settingsMusicOptionsScrobbleTitle": "Scrobble模式",
"@settingsMusicOptionsScrobbleTitle": {},
"settingsNetworkName": "网络",
"@settingsNetworkName": {},
"settingsNetworkOptionsMaxBitrateMobileTitle": "最大比特率 (3G/4G/5G)",
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
"settingsNetworkOptionsMaxBitrateWifiTitle": "最大比特率 (Wi-Fi)",
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
"settingsNetworkOptionsMaxBufferTitle": "最大缓冲时间",
"@settingsNetworkOptionsMaxBufferTitle": {},
"settingsNetworkOptionsMinBufferTitle": "最小缓冲时间",
"@settingsNetworkOptionsMinBufferTitle": {},
"settingsNetworkValuesKbps": "{value}kbps",
"@settingsNetworkValuesKbps": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesSeconds": "{value} 秒",
"@settingsNetworkValuesSeconds": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesUnlimitedKbps": "不限制",
"@settingsNetworkValuesUnlimitedKbps": {},
"settingsResetActionsClearImageCache": "清除图片缓存",
"@settingsResetActionsClearImageCache": {},
"settingsResetName": "重置",
"@settingsResetName": {},
"settingsServersActionsAdd": "添加服务器",
"@settingsServersActionsAdd": {},
"settingsServersActionsDelete": "删除",
"@settingsServersActionsDelete": {},
"settingsServersActionsEdit": "编辑服务器",
"@settingsServersActionsEdit": {},
"settingsServersActionsSave": "保存",
"@settingsServersActionsSave": {},
"settingsServersActionsTestConnection": "测试连接",
"@settingsServersActionsTestConnection": {},
"settingsServersFieldsAddress": "地址",
"@settingsServersFieldsAddress": {},
"settingsServersFieldsPassword": "密码",
"@settingsServersFieldsPassword": {},
"settingsServersFieldsUsername": "用户名",
"@settingsServersFieldsUsername": {},
"settingsServersMessagesConnectionFailed": "连接到 {address} 失败,检查设置或服务器",
"@settingsServersMessagesConnectionFailed": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersMessagesConnectionOk": "连接到 {address} 正常!",
"@settingsServersMessagesConnectionOk": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersName": "服务器",
"@settingsServersName": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "密码以 token + salt 加密发送",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "密码以明文发送(不推荐,注意链接安全!)",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
"settingsServersOptionsForcePlaintextPasswordTitle": "强制使用明文密码",
"@settingsServersOptionsForcePlaintextPasswordTitle": {},
"actionsDownload": "下载",
"@actionsDownload": {},
"actionsDownloadCancel": "取消下载",
"@actionsDownloadCancel": {},
"actionsDownloadDelete": "删除已下载",
"@actionsDownloadDelete": {},
"actionsOk": "确定",
"@actionsOk": {},
"resourcesFilterArtist": "歌手",
"@resourcesFilterArtist": {},
"resourcesFilterOwner": "所有者",
"@resourcesFilterOwner": {},
"resourcesSongListDeleteAllTitle": "删除下载?",
"@resourcesSongListDeleteAllTitle": {},
"resourcesSortByAlbum": "专辑",
"@resourcesSortByAlbum": {},
"resourcesSortByAlbumCount": "专辑数量",
"@resourcesSortByAlbumCount": {},
"resourcesSortByUpdated": "最近添加",
"@resourcesSortByUpdated": {},
"settingsAboutActionsSupport": "支持开发者",
"@settingsAboutActionsSupport": {},
"resourcesFilterAlbum": "专辑",
"@resourcesFilterAlbum": {},
"resourcesSortByTitle": "标题",
"@resourcesSortByTitle": {},
"actionsCancel": "取消",
"@actionsCancel": {},
"actionsDelete": "删除",
"@actionsDelete": {},
"resourcesFilterYear": "年份",
"@resourcesFilterYear": {},
"resourcesSongListDeleteAllContent": "该操作会删除所有已下载的歌曲文件。",
"@resourcesSongListDeleteAllContent": {}
}
"actionsStar": "收藏",
"@actionsStar": {},
"actionsUnstar": "移除收藏",
"@actionsUnstar": {},
"messagesNothingHere": "什么都没有…",
"@messagesNothingHere": {},
"navigationTabsHome": "首页",
"@navigationTabsHome": {},
"navigationTabsLibrary": "所有",
"@navigationTabsLibrary": {},
"navigationTabsSearch": "搜索",
"@navigationTabsSearch": {},
"navigationTabsSettings": "设置",
"@navigationTabsSettings": {},
"resourcesAlbumActionsPlay": "播放专辑",
"@resourcesAlbumActionsPlay": {},
"resourcesAlbumActionsView": "查看专辑",
"@resourcesAlbumActionsView": {},
"resourcesAlbumListsSort": "专辑排序",
"@resourcesAlbumListsSort": {},
"resourcesAlbumName": "{count,plural, other{专辑}}",
"@resourcesAlbumName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesArtistActionsView": "查看歌手",
"@resourcesArtistActionsView": {},
"resourcesArtistListsSort": "歌手排序",
"@resourcesArtistListsSort": {},
"resourcesArtistName": "{count,plural, other{歌手}}",
"@resourcesArtistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesFilterGenre": "根据类型",
"@resourcesFilterGenre": {},
"resourcesFilterStarred": "已收藏",
"@resourcesFilterStarred": {},
"resourcesPlaylistActionsPlay": "全部播放",
"@resourcesPlaylistActionsPlay": {},
"resourcesPlaylistName": "{count,plural, other{播放列表}}",
"@resourcesPlaylistName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesQueueName": "{count,plural, other{队列}}",
"@resourcesQueueName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSongListsArtistTopSongs": "热门歌曲",
"@resourcesSongListsArtistTopSongs": {},
"resourcesSongName": "{count,plural, other{歌曲}}",
"@resourcesSongName": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"resourcesSortByAdded": "最近添加",
"@resourcesSortByAdded": {},
"resourcesSortByArtist": "根据歌手",
"@resourcesSortByArtist": {},
"resourcesSortByFrequentlyPlayed": "播放最多",
"@resourcesSortByFrequentlyPlayed": {},
"resourcesSortByName": "根据名称",
"@resourcesSortByName": {},
"resourcesSortByRandom": "随机",
"@resourcesSortByRandom": {},
"resourcesSortByRecentlyPlayed": "最近播放",
"@resourcesSortByRecentlyPlayed": {},
"resourcesSortByYear": "根据年份",
"@resourcesSortByYear": {},
"searchHeaderTitle": "搜索: {query}",
"@searchHeaderTitle": {
"placeholders": {
"query": {
"type": "String"
}
}
},
"searchInputPlaceholder": "搜索",
"@searchInputPlaceholder": {},
"searchMoreResults": "更多…",
"@searchMoreResults": {},
"searchNowPlayingContext": "搜索结果",
"@searchNowPlayingContext": {},
"settingsAboutActionsLicenses": "许可",
"@settingsAboutActionsLicenses": {},
"settingsAboutActionsProjectHomepage": "项目地址",
"@settingsAboutActionsProjectHomepage": {},
"settingsAboutName": "关于",
"@settingsAboutName": {},
"settingsAboutVersion": "版本 {version}",
"@settingsAboutVersion": {
"placeholders": {
"version": {
"type": "String"
}
}
},
"settingsMusicName": "音乐",
"@settingsMusicName": {},
"settingsMusicOptionsScrobbleDescriptionOff": "不记录scrobble历史",
"@settingsMusicOptionsScrobbleDescriptionOff": {},
"settingsMusicOptionsScrobbleDescriptionOn": "Scrobble播放历史",
"@settingsMusicOptionsScrobbleDescriptionOn": {},
"settingsMusicOptionsScrobbleTitle": "Scrobble模式",
"@settingsMusicOptionsScrobbleTitle": {},
"settingsNetworkName": "网络",
"@settingsNetworkName": {},
"settingsNetworkOptionsMaxBitrateMobileTitle": "最大比特率 (3G/4G/5G)",
"@settingsNetworkOptionsMaxBitrateMobileTitle": {},
"settingsNetworkOptionsMaxBitrateWifiTitle": "最大比特率 (Wi-Fi)",
"@settingsNetworkOptionsMaxBitrateWifiTitle": {},
"settingsNetworkOptionsMaxBufferTitle": "最大缓冲时间",
"@settingsNetworkOptionsMaxBufferTitle": {},
"settingsNetworkOptionsMinBufferTitle": "最小缓冲时间",
"@settingsNetworkOptionsMinBufferTitle": {},
"settingsNetworkValuesKbps": "{value}kbps",
"@settingsNetworkValuesKbps": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesSeconds": "{value} 秒",
"@settingsNetworkValuesSeconds": {
"placeholders": {
"value": {
"type": "String"
}
}
},
"settingsNetworkValuesUnlimitedKbps": "不限制",
"@settingsNetworkValuesUnlimitedKbps": {},
"settingsResetActionsClearImageCache": "清除图片缓存",
"@settingsResetActionsClearImageCache": {},
"settingsResetName": "重置",
"@settingsResetName": {},
"settingsServersActionsAdd": "添加服务器",
"@settingsServersActionsAdd": {},
"settingsServersActionsDelete": "删除",
"@settingsServersActionsDelete": {},
"settingsServersActionsEdit": "编辑服务器",
"@settingsServersActionsEdit": {},
"settingsServersActionsSave": "保存",
"@settingsServersActionsSave": {},
"settingsServersActionsTestConnection": "测试连接",
"@settingsServersActionsTestConnection": {},
"settingsServersFieldsAddress": "地址",
"@settingsServersFieldsAddress": {},
"settingsServersFieldsPassword": "密码",
"@settingsServersFieldsPassword": {},
"settingsServersFieldsUsername": "用户名",
"@settingsServersFieldsUsername": {},
"settingsServersMessagesConnectionFailed": "连接到 {address} 失败,检查设置或服务器",
"@settingsServersMessagesConnectionFailed": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersMessagesConnectionOk": "连接到 {address} 正常!",
"@settingsServersMessagesConnectionOk": {
"placeholders": {
"address": {
"type": "String"
}
}
},
"settingsServersName": "服务器",
"@settingsServersName": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOff": "密码以 token + salt 加密发送",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOff": {},
"settingsServersOptionsForcePlaintextPasswordDescriptionOn": "密码以明文发送(不推荐,注意链接安全!)",
"@settingsServersOptionsForcePlaintextPasswordDescriptionOn": {},
"settingsServersOptionsForcePlaintextPasswordTitle": "强制使用明文密码",
"@settingsServersOptionsForcePlaintextPasswordTitle": {}
}

View File

@ -1,209 +0,0 @@
// import 'dart:convert';
import 'dart:io';
import 'package:collection/collection.dart';
import 'package:flutter/foundation.dart';
import 'package:logging/logging.dart';
import 'package:path/path.dart' as p;
import 'package:path_provider/path_provider.dart';
class AnsiColor {
/// ANSI Control Sequence Introducer, signals the terminal for new settings.
static const ansiEsc = '\x1B[';
/// Reset all colors and options for current SGRs to terminal defaults.
static const ansiDefault = '${ansiEsc}0m';
final int? fg;
final int? bg;
final bool color;
AnsiColor.none()
: fg = null,
bg = null,
color = false;
AnsiColor.fg(this.fg)
: bg = null,
color = true;
AnsiColor.bg(this.bg)
: fg = null,
color = true;
@override
String toString() {
if (fg != null) {
return '${ansiEsc}38;5;${fg}m';
} else if (bg != null) {
return '${ansiEsc}48;5;${bg}m';
} else {
return '';
}
}
String call(String msg) {
if (color) {
// ignore: unnecessary_brace_in_string_interps
return '${this}$msg$ansiDefault';
} else {
return msg;
}
}
AnsiColor toFg() => AnsiColor.fg(bg);
AnsiColor toBg() => AnsiColor.bg(fg);
/// Defaults the terminal's foreground color without altering the background.
String get resetForeground => color ? '${ansiEsc}39m' : '';
/// Defaults the terminal's background color without altering the foreground.
String get resetBackground => color ? '${ansiEsc}49m' : '';
static int grey(double level) => 232 + (level.clamp(0.0, 1.0) * 23).round();
}
final levelColors = {
Level.FINEST: AnsiColor.fg(AnsiColor.grey(0.5)),
Level.FINER: AnsiColor.fg(AnsiColor.grey(0.5)),
Level.FINE: AnsiColor.fg(AnsiColor.grey(0.5)),
Level.CONFIG: AnsiColor.fg(81),
Level.INFO: AnsiColor.fg(12),
Level.WARNING: AnsiColor.fg(208),
Level.SEVERE: AnsiColor.fg(196),
Level.SHOUT: AnsiColor.fg(199),
};
class LogData {
final String? message;
final Object? data;
const LogData(this.message, this.data);
}
String _format(
LogRecord event, {
bool color = false,
bool time = true,
bool level = true,
bool redact = true,
}) {
var message = '';
if (time) message += '${event.time.toIso8601String()} ';
if (level) message += '${event.level.name} ';
final object = event.object;
if (object is LogData) {
message += '${object.message}';
message += '\n${object.data}';
} else if (object != null) {
message += 'Object';
message += '\n$object';
} else {
message += event.message;
}
if (event.error != null) {
message += '\n${event.error}';
}
if (redact) {
message = _redactUrl(message);
}
if (event.stackTrace != null) {
message += '\n${event.stackTrace}';
}
return color
? message.split('\n').map((e) => levelColors[event.level]!(e)).join('\n')
: message;
}
String _redactUrl(String message) {
if (!_queryReplace('u').hasMatch(message)) {
return message;
}
message = _redactParam(message, 'u');
message = _redactParam(message, 'p');
message = _redactParam(message, 's');
message = _redactParam(message, 't');
return message;
}
RegExp _queryReplace(String key) => RegExp('$key=([^&|\\n|\\t\\s]+)');
String _redactParam(String url, String key) =>
url.replaceAll(_queryReplace(key), '$key=REDACTED');
Future<Directory> logDirectory() async {
return Directory(
p.join((await getApplicationDocumentsDirectory()).path, 'logs'),
);
}
Future<List<File>> logFiles() async {
final dir = await logDirectory();
return dir.listSync().whereType<File>().toList()
..sort(
(a, b) => b.statSync().modified.compareTo(a.statSync().modified),
);
}
File _currentLogFile(String logDir) {
final now = DateTime.now();
return File(p.join(logDir, '${now.year}-${now.month}-${now.day}.txt'));
}
Future<void> _printFile(String event, String logDir) async {
final file = _currentLogFile(logDir);
if (!event.endsWith('\n')) {
event += '\n';
}
await file.writeAsString(event, mode: FileMode.writeOnlyAppend, flush: true);
}
void _printDebug(LogRecord event) {
// ignore: avoid_print
print(_format(event, color: true, time: false, level: false, redact: false));
}
Future<void> _printRelease(LogRecord event, String logDir) async {
await _printFile(
_format(event, color: false, time: true, level: true, redact: true),
logDir,
);
}
final log = Logger('default');
Future<void> initLogging() async {
final dir = (await logDirectory())..create();
final file = _currentLogFile(dir.path);
if (!(await file.exists())) {
await file.create();
}
final files = await logFiles();
if (files.length > 7) {
for (var file in files.slice(7)) {
await file.delete();
}
}
Logger.root.level = kDebugMode ? Level.ALL : Level.INFO;
Logger.root.onRecord.asyncMap((event) async {
if (kDebugMode) {
_printDebug(event);
} else {
await _printRelease(event, dir.path);
}
}).listen((_) {}, cancelOnError: false);
}

View File

@ -4,7 +4,6 @@ import 'package:stack_trace/stack_trace.dart' as stack_trace;
import 'package:worker_manager/worker_manager.dart';
import 'app/app.dart';
import 'log.dart';
void main() async {
// TOOD: probably remove before live
@ -19,8 +18,5 @@ void main() async {
await Executor().warmUp();
WidgetsFlutterBinding.ensureInitialized();
await initLogging();
runApp(const ProviderScope(child: MyApp()));
}

View File

@ -68,8 +68,7 @@ enum QueueContextType {
album('album'),
playlist('playlist'),
library('library'),
genre('genre'),
artist('artist');
genre('genre');
const QueueContextType(this.value);
final String value;

View File

@ -28,7 +28,6 @@ const _$QueueContextTypeEnumMap = {
QueueContextType.playlist: 'playlist',
QueueContextType.library: 'library',
QueueContextType.genre: 'genre',
QueueContextType.artist: 'artist',
};
_$_MediaItemData _$$_MediaItemDataFromJson(Map<String, dynamic> json) =>

View File

@ -4,6 +4,7 @@ import 'dart:math';
import 'package:audio_service/audio_service.dart';
import 'package:collection/collection.dart';
import 'package:drift/drift.dart' show Value;
import 'package:flutter/foundation.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:just_audio/just_audio.dart';
import 'package:pool/pool.dart';
@ -13,7 +14,6 @@ import 'package:synchronized/synchronized.dart';
import '../cache/image_cache.dart';
import '../database/database.dart';
import '../log.dart';
import '../models/music.dart';
import '../models/query.dart';
import '../models/support.dart';
@ -122,10 +122,6 @@ class AudioControl extends BaseAudioHandler with QueueHandler, SeekHandler {
));
});
_player.playbackEventStream.doOnError((e, st) async {
log.warning('playbackEventStream', e, st);
});
shuffleIndicies.listen((value) {
playbackState.add(playbackState.value.copyWith(
shuffleMode: value != null
@ -141,7 +137,7 @@ class AudioControl extends BaseAudioHandler with QueueHandler, SeekHandler {
_player.processingStateStream.listen((event) async {
if (event == ProcessingState.completed) {
if (_audioSource.length > 0) {
log.fine('completed');
yell('completed');
await stop();
await seek(Duration.zero);
}
@ -390,7 +386,7 @@ class AudioControl extends BaseAudioHandler with QueueHandler, SeekHandler {
mediaItem.add(slice.current!.mediaItem);
queue.add(list.map((e) => e.mediaItem).toList());
log.fine('addAll');
yell('addAll');
await _audioSource.addAll(list.map((e) => e.audioSource).toList());
await _player.seek(Duration.zero, index: list.indexOf(slice.current!));
}
@ -414,7 +410,7 @@ class AudioControl extends BaseAudioHandler with QueueHandler, SeekHandler {
final sourceNeedsPrev = sourceIndex == 0;
if (sourceNeedsNext && slice.next != null) {
log.fine('add');
yell('add');
await _audioSource.add(slice.next!.audioSource);
}
if (sourceNeedsPrev && slice.prev != null) {
@ -501,7 +497,7 @@ class AudioControl extends BaseAudioHandler with QueueHandler, SeekHandler {
}
Future<void> _insertFirstAudioSource(AudioSource source) {
log.fine('insert');
yell('insert');
final wait = _audioSource.insert(0, source);
_currentIndexIgnore.add(1);
return wait;
@ -509,20 +505,20 @@ class AudioControl extends BaseAudioHandler with QueueHandler, SeekHandler {
Future<void> _pruneAudioSources(int keepIndex) async {
if (keepIndex > 0) {
log.fine('removeRange 0');
yell('removeRange 0');
final wait = _audioSource.removeRange(0, keepIndex);
_currentIndexIgnore.add(0);
await wait;
}
if (_audioSource.length > 1) {
log.fine('removeRange 1');
yell('removeRange 1');
await _audioSource.removeRange(1, _audioSource.length);
}
}
Future<void> _clearAudioSource([bool clearMetadata = false]) async {
// await _player.stop();
log.fine('_clearAudioSource');
yell('_clearAudioSource');
await _audioSource.clear();
if (clearMetadata) {
@ -701,3 +697,11 @@ class AudioControl extends BaseAudioHandler with QueueHandler, SeekHandler {
}
}
}
void yell(String msg) {
if (kDebugMode) {
print('=================================================================<');
print(msg);
print('=================================================================>');
}
}

View File

@ -214,7 +214,7 @@ class DownloadService extends _$DownloadService {
Future<void> deleteAll(int sourceId) async {
final db = ref.read(databaseProvider);
final albumIds = await db.albumIdsWithDownloadStatus(sourceId).get();
final albumIds = await db.albumIdsWithDownloaded(sourceId).get();
for (var id in albumIds) {
await deleteAlbum(await (db.albumById(sourceId, id)).getSingle());
}

View File

@ -6,7 +6,7 @@ part of 'download_service.dart';
// RiverpodGenerator
// **************************************************************************
String _$downloadServiceHash() => r'c72c49f980e307f3013467e76b6564d14a34a736';
String _$downloadServiceHash() => r'92e963b5c070f4d1edb0cd81899b16393c2b9a70';
/// See also [DownloadService].
@ProviderFor(DownloadService)

View File

@ -46,15 +46,13 @@ class SettingsService extends _$SettingsService {
features: IList(),
username: subsonic.username.value,
password: subsonic.password.value,
useTokenAuth: subsonic.useTokenAuth.value,
useTokenAuth: true,
isActive: true,
createdAt: DateTime.now(),
),
ref.read(httpClientProvider),
);
await client.test();
final features = IList([
if (await client.testFeature(SubsonicFeature.emptyQuerySearch))
SubsonicFeature.emptyQuerySearch,
@ -68,10 +66,6 @@ class SettingsService extends _$SettingsService {
}
Future<void> updateSource(SubsonicSettings source) async {
final client = SubsonicClient(source, ref.read(httpClientProvider));
await client.test();
await _db.updateSource(source);
await init();
}

View File

@ -31,7 +31,7 @@ class SyncService extends _$SyncService {
final source = ref.read(musicSourceProvider);
final db = ref.read(databaseProvider);
final ids = <String>{};
final ids = <String>[];
await for (var artists in source.allArtists()) {
ids.addAll(artists.map((e) => e.id.value));
await db.saveArtists(artists);
@ -44,7 +44,7 @@ class SyncService extends _$SyncService {
final source = ref.read(musicSourceProvider);
final db = ref.read(databaseProvider);
final ids = <String>{};
final ids = <String>[];
await for (var albums in source.allAlbums()) {
ids.addAll(albums.map((e) => e.id.value));
await db.saveAlbums(albums);
@ -57,7 +57,7 @@ class SyncService extends _$SyncService {
final source = ref.read(musicSourceProvider);
final db = ref.read(databaseProvider);
final ids = <String>{};
final ids = <String>[];
await for (var playlists in source.allPlaylists()) {
ids.addAll(playlists.map((e) => e.playist.id.value));
await db.savePlaylists(playlists);
@ -70,7 +70,7 @@ class SyncService extends _$SyncService {
final source = ref.read(musicSourceProvider);
final db = ref.read(databaseProvider);
final ids = <String>{};
final ids = <String>[];
await for (var songs in source.allSongs()) {
ids.addAll(songs.map((e) => e.id.value));
await db.saveSongs(songs);

View File

@ -6,7 +6,7 @@ part of 'sync_service.dart';
// RiverpodGenerator
// **************************************************************************
String _$syncServiceHash() => r'58ebee4e6f055b64ee6789ae43d63c0e15c679e0';
String _$syncServiceHash() => r'2b8da374c3143bc56f17115440d57bc70468a17e';
/// See also [SyncService].
@ProviderFor(SyncService)

View File

@ -1,8 +1,6 @@
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:rxdart/rxdart.dart';
import '../database/database.dart';
import '../log.dart';
import '../state/settings.dart';
abstract class BaseMusicSource {
@ -42,33 +40,25 @@ class MusicSource implements BaseMusicSource {
@override
Stream<Iterable<AlbumsCompanion>> allAlbums() {
_testOnline();
return _source
.allAlbums()
.doOnError((e, st) => log.severe('allAlbums', e, st));
return _source.allAlbums();
}
@override
Stream<Iterable<ArtistsCompanion>> allArtists() {
_testOnline();
return _source
.allArtists()
.doOnError((e, st) => log.severe('allArtists', e, st));
return _source.allArtists();
}
@override
Stream<Iterable<PlaylistWithSongsCompanion>> allPlaylists() {
_testOnline();
return _source
.allPlaylists()
.doOnError((e, st) => log.severe('allPlaylists', e, st));
return _source.allPlaylists();
}
@override
Stream<Iterable<SongsCompanion>> allSongs() {
_testOnline();
return _source
.allSongs()
.doOnError((e, st) => log.severe('allSongs', e, st));
return _source.allSongs();
}
@override
@ -92,4 +82,10 @@ class MusicSource implements BaseMusicSource {
@override
Uri streamUri(String songId) => _source.streamUri(songId);
@override
bool operator ==(other) => other is BaseMusicSource && (other.id == id);
@override
int get hashCode => id;
}

View File

@ -6,7 +6,6 @@ import 'package:crypto/crypto.dart';
import 'package:http/http.dart';
import 'package:xml/xml.dart';
import '../../log.dart';
import '../../models/settings.dart';
import 'xml.dart';
@ -90,16 +89,12 @@ class SubsonicClient {
final subsonicResponse =
SubsonicResponse(XmlDocument.parse(utf8.decode(res.bodyBytes)));
if (subsonicResponse.status == Status.failed) {
final error = SubsonicException(subsonicResponse.xml);
log.severe('Subsonic error', error);
throw error;
throw SubsonicException(subsonicResponse.xml);
}
return subsonicResponse;
}
Future<void> test() => get('ping');
Future<bool> testFeature(SubsonicFeature feature) async {
switch (feature) {
case SubsonicFeature.emptyQuerySearch:

View File

@ -290,14 +290,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.6.3"
cross_file:
dependency: transitive
description:
name: cross_file
sha256: "0b0036e8cccbfbe0555fd83c1d31a6f30b77a96b598b35a5d36dd41f718695e9"
url: "https://pub.dev"
source: hosted
version: "0.3.3+4"
crypto:
dependency: "direct main"
description:
@ -687,7 +679,7 @@ packages:
source: hosted
version: "2.0.1"
logging:
dependency: "direct main"
dependency: transitive
description:
name: logging
sha256: "04094f2eb032cbb06c6f6e8d3607edcfcb0455e2bb6cbc010cb01171dcb64e6d"
@ -842,10 +834,10 @@ packages:
dependency: transitive
description:
name: path_provider_windows
sha256: d3f80b32e83ec208ac95253e0cd4d298e104fbc63cb29c5c69edaed43b0c69d6
sha256: f53720498d5a543f9607db4b0e997c4b5438884de25b0f73098cc2671a51b130
url: "https://pub.dev"
source: hosted
version: "2.1.6"
version: "2.1.5"
pedantic:
dependency: transitive
description:
@ -958,22 +950,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.27.7"
share_plus:
dependency: "direct main"
description:
name: share_plus
sha256: "322a1ec9d9fe07e2e2252c098ce93d12dbd06133cc4c00ffe6a4ef505c295c17"
url: "https://pub.dev"
source: hosted
version: "7.0.0"
share_plus_platform_interface:
dependency: transitive
description:
name: share_plus_platform_interface
sha256: "0c6e61471bd71b04a138b8b588fa388e66d8b005e6f2deda63371c5c505a0981"
url: "https://pub.dev"
source: hosted
version: "3.2.1"
shelf:
dependency: transitive
description:
@ -1343,10 +1319,10 @@ packages:
dependency: transitive
description:
name: win32
sha256: "5a751eddf9db89b3e5f9d50c20ab8612296e4e8db69009788d6c8b060a84191c"
sha256: a6f0236dbda0f63aa9a25ad1ff9a9d8a4eaaa5012da0dc59d21afdb1dc361ca4
url: "https://pub.dev"
source: hosted
version: "4.1.4"
version: "3.1.4"
worker_manager:
dependency: "direct main"
description:

View File

@ -4,7 +4,7 @@ homepage: https://github.com/austinried/subtracks
repository: https://github.com/austinried/subtracks
issue_tracker: https://github.com/austinried/subtracks/issues
publish_to: 'none'
version: 2.0.0-alpha.3+12
version: 2.0.0-alpha.1+10
environment:
sdk: '>=2.19.2 <3.0.0'
@ -57,8 +57,6 @@ dependencies:
connectivity_plus: ^3.0.4
package_info_plus: ^3.1.1
url_launcher: ^6.1.10
logging: ^1.1.1
share_plus: ^7.0.0
# https://github.com/dart-lang/intl/issues/522#issuecomment-1469961807
dependency_overrides: