actually fix them + fix same tracks in queue view
This commit is contained in:
parent
2e67b50332
commit
ae6a1efd4e
|
|
@ -477,6 +477,7 @@ class DeezerAPI {
|
||||||
Future<List<Playlist>> getPlaylists() async {
|
Future<List<Playlist>> getPlaylists() async {
|
||||||
Map data = await callApi('deezer.pageProfile',
|
Map data = await callApi('deezer.pageProfile',
|
||||||
params: {'nb': 2000, 'tab': 'playlists', 'user_id': userId});
|
params: {'nb': 2000, 'tab': 'playlists', 'user_id': userId});
|
||||||
|
print(data);
|
||||||
return data['results']['TAB']['playlists']['data']
|
return data['results']['TAB']['playlists']['data']
|
||||||
.map<Playlist>((json) => Playlist.fromPrivateJson(json, library: true))
|
.map<Playlist>((json) => Playlist.fromPrivateJson(json, library: true))
|
||||||
.toList();
|
.toList();
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,6 @@ class ServiceInterface {
|
||||||
return service!.invoke(method, args);
|
return service!.invoke(method, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
sendPort!.send({'_': method, if (args != null) ...args});
|
sendPort.send({'_': method, if (args != null) ...args});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,5 @@
|
||||||
|
import 'dart:math';
|
||||||
|
|
||||||
import 'package:audio_service/audio_service.dart';
|
import 'package:audio_service/audio_service.dart';
|
||||||
import 'package:audio_session/audio_session.dart';
|
import 'package:audio_session/audio_session.dart';
|
||||||
import 'package:freezer/api/cache.dart';
|
import 'package:freezer/api/cache.dart';
|
||||||
|
|
@ -480,7 +482,6 @@ class AudioPlayerTask extends BaseAudioHandler {
|
||||||
if (queue.value.isNotEmpty) favoriteControl(),
|
if (queue.value.isNotEmpty) favoriteControl(),
|
||||||
if (_queueIndex != 0) MediaControl.skipToPrevious,
|
if (_queueIndex != 0) MediaControl.skipToPrevious,
|
||||||
_player.playing ? MediaControl.pause : MediaControl.play,
|
_player.playing ? MediaControl.pause : MediaControl.play,
|
||||||
MediaControl.stop,
|
|
||||||
if (queue.hasValue && _queueIndex != queue.value.length - 1)
|
if (queue.hasValue && _queueIndex != queue.value.length - 1)
|
||||||
MediaControl.skipToNext,
|
MediaControl.skipToNext,
|
||||||
]
|
]
|
||||||
|
|
@ -491,7 +492,6 @@ class AudioPlayerTask extends BaseAudioHandler {
|
||||||
action: MediaAction.rewind,
|
action: MediaAction.rewind,
|
||||||
), // acts as prev-30
|
), // acts as prev-30
|
||||||
_player.playing ? MediaControl.pause : MediaControl.play,
|
_player.playing ? MediaControl.pause : MediaControl.play,
|
||||||
MediaControl.stop,
|
|
||||||
const MediaControl(
|
const MediaControl(
|
||||||
androidIcon: 'drawable/ic_forward_30',
|
androidIcon: 'drawable/ic_forward_30',
|
||||||
label: 'forward 30',
|
label: 'forward 30',
|
||||||
|
|
@ -518,8 +518,8 @@ class AudioPlayerTask extends BaseAudioHandler {
|
||||||
speed: _player.speed,
|
speed: _player.speed,
|
||||||
queueIndex: _queueIndex,
|
queueIndex: _queueIndex,
|
||||||
androidCompactActionIndices: List.generate(controls.length, (i) => i)
|
androidCompactActionIndices: List.generate(controls.length, (i) => i)
|
||||||
.whereNot((i) => controls[i].action == MediaAction.stop)
|
.toList(growable: false)
|
||||||
.toList(growable: false),
|
.sublist(max(0, controls.length - 3)),
|
||||||
repeatMode: _repeatMode,
|
repeatMode: _repeatMode,
|
||||||
shuffleMode: _originalQueue == null
|
shuffleMode: _originalQueue == null
|
||||||
? AudioServiceShuffleMode.none
|
? AudioServiceShuffleMode.none
|
||||||
|
|
@ -657,7 +657,6 @@ class AudioPlayerTask extends BaseAudioHandler {
|
||||||
Future customAction(String name, [Map<String, dynamic>? extras]) async {
|
Future customAction(String name, [Map<String, dynamic>? extras]) async {
|
||||||
switch (name) {
|
switch (name) {
|
||||||
case 'updateQuality':
|
case 'updateQuality':
|
||||||
print('updateQuality($extras)');
|
|
||||||
//Pass wifi & mobile quality by custom action
|
//Pass wifi & mobile quality by custom action
|
||||||
//Isolate can't access globals
|
//Isolate can't access globals
|
||||||
wifiQuality = extras!['wifiQuality'] as AudioQuality;
|
wifiQuality = extras!['wifiQuality'] as AudioQuality;
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:audio_service/audio_service.dart';
|
|
||||||
import 'package:cookie_jar/cookie_jar.dart';
|
import 'package:cookie_jar/cookie_jar.dart';
|
||||||
import 'package:dynamic_color/dynamic_color.dart';
|
import 'package:dynamic_color/dynamic_color.dart';
|
||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@ import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:freezer/api/definitions.dart';
|
import 'package:freezer/api/definitions.dart';
|
||||||
import 'package:freezer/api/download.dart';
|
import 'package:freezer/api/download.dart';
|
||||||
import 'package:freezer/api/player/audio_handler.dart';
|
|
||||||
import 'package:google_fonts/google_fonts.dart';
|
import 'package:google_fonts/google_fonts.dart';
|
||||||
import 'package:hive_flutter/hive_flutter.dart';
|
import 'package:hive_flutter/hive_flutter.dart';
|
||||||
import 'package:json_annotation/json_annotation.dart';
|
import 'package:json_annotation/json_annotation.dart';
|
||||||
|
|
|
||||||
|
|
@ -218,8 +218,8 @@ class MenuSheet {
|
||||||
title: option.label,
|
title: option.label,
|
||||||
leading: option.icon,
|
leading: option.icon,
|
||||||
onTap: () {
|
onTap: () {
|
||||||
option.onTap.call();
|
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
|
option.onTap.call();
|
||||||
},
|
},
|
||||||
))
|
))
|
||||||
.toList(growable: false))),
|
.toList(growable: false))),
|
||||||
|
|
@ -804,8 +804,7 @@ class _SleepTimerDialogState extends State<SleepTimerDialog> {
|
||||||
class SelectPlaylistDialog extends StatefulWidget {
|
class SelectPlaylistDialog extends StatefulWidget {
|
||||||
final Track? track;
|
final Track? track;
|
||||||
final Function? callback;
|
final Function? callback;
|
||||||
const SelectPlaylistDialog({this.track, this.callback, Key? key})
|
const SelectPlaylistDialog({this.track, this.callback, super.key});
|
||||||
: super(key: key);
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<SelectPlaylistDialog> createState() => _SelectPlaylistDialogState();
|
State<SelectPlaylistDialog> createState() => _SelectPlaylistDialogState();
|
||||||
|
|
@ -835,7 +834,7 @@ class _SelectPlaylistDialogState extends State<SelectPlaylistDialog> {
|
||||||
child: ErrorScreen(),
|
child: ErrorScreen(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (snapshot.connectionState != ConnectionState.done) {
|
if (snapshot.data == null) {
|
||||||
return const SizedBox(
|
return const SizedBox(
|
||||||
height: 100,
|
height: 100,
|
||||||
child: Center(
|
child: Center(
|
||||||
|
|
@ -882,8 +881,7 @@ class CreatePlaylistDialog extends StatefulWidget {
|
||||||
final List<Track?>? tracks;
|
final List<Track?>? tracks;
|
||||||
//If playlist not null, update
|
//If playlist not null, update
|
||||||
final Playlist? playlist;
|
final Playlist? playlist;
|
||||||
const CreatePlaylistDialog({this.tracks, this.playlist, Key? key})
|
const CreatePlaylistDialog({this.tracks, this.playlist, super.key});
|
||||||
: super(key: key);
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<CreatePlaylistDialog> createState() => _CreatePlaylistDialogState();
|
State<CreatePlaylistDialog> createState() => _CreatePlaylistDialogState();
|
||||||
|
|
|
||||||
|
|
@ -135,7 +135,7 @@ class _QueueListWidgetState extends State<QueueListWidget> {
|
||||||
final mediaItem = _queueCache[index];
|
final mediaItem = _queueCache[index];
|
||||||
final int itemId = mediaItem.extras!['id'] ?? 0;
|
final int itemId = mediaItem.extras!['id'] ?? 0;
|
||||||
return Dismissible(
|
return Dismissible(
|
||||||
key: ValueKey(mediaItem.id.hashCode | itemId),
|
key: ValueKey(mediaItem.id.hashCode ^ itemId),
|
||||||
background: _dismissibleBackground,
|
background: _dismissibleBackground,
|
||||||
secondaryBackground: _dismissibleSecondaryBackground,
|
secondaryBackground: _dismissibleSecondaryBackground,
|
||||||
onDismissed: (_) {
|
onDismissed: (_) {
|
||||||
|
|
|
||||||
|
|
@ -294,7 +294,8 @@ class _SearchScreenState extends State<SearchScreen> {
|
||||||
),
|
),
|
||||||
...List.generate(min(cache.searchHistory.length, 10),
|
...List.generate(min(cache.searchHistory.length, 10),
|
||||||
(int i) {
|
(int i) {
|
||||||
switch (cache.searchHistory[i]) {
|
switch (cache
|
||||||
|
.searchHistory[cache.searchHistory.length - i]) {
|
||||||
case final Track data:
|
case final Track data:
|
||||||
return TrackTile.fromTrack(
|
return TrackTile.fromTrack(
|
||||||
data,
|
data,
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,6 @@ import 'package:freezer/ui/login_on_other_device.dart';
|
||||||
import 'package:freezer/ui/login_screen.dart';
|
import 'package:freezer/ui/login_screen.dart';
|
||||||
import 'package:package_info_plus/package_info_plus.dart';
|
import 'package:package_info_plus/package_info_plus.dart';
|
||||||
import 'package:scrobblenaut/scrobblenaut.dart';
|
import 'package:scrobblenaut/scrobblenaut.dart';
|
||||||
import 'package:url_launcher/url_launcher.dart';
|
|
||||||
|
|
||||||
import 'package:freezer/api/cache.dart';
|
import 'package:freezer/api/cache.dart';
|
||||||
import 'package:freezer/api/deezer.dart';
|
import 'package:freezer/api/deezer.dart';
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue