🎨 Prefer single quote

This commit is contained in:
2024-08-27 14:48:31 +08:00
parent e7ea852725
commit 95b04adede
31 changed files with 470 additions and 630 deletions

View File

@ -2,7 +2,7 @@ import 'package:rhythm_box/services/sourced_track/models/source_info.dart';
import 'package:rhythm_box/services/sourced_track/models/source_map.dart';
enum SourceCodecs {
m4a._("M4a (Best for downloaded music)"),
m4a._('M4a (Best for downloaded music)'),
weba._("WebA (Best for streamed music)\nDoesn't support audio metadata");
final String label;

View File

@ -1,6 +1,6 @@
enum SearchMode {
youtube._("YouTube"),
youtubeMusic._("YouTube Music");
youtube._('YouTube'),
youtubeMusic._('YouTube Music');
final String label;

View File

@ -87,7 +87,7 @@ class YoutubeVideoInfo {
dislikes: 0,
views: searchItem.views,
channelName: searchItem.uploaderName,
channelId: searchItem.uploaderUrl ?? "",
channelId: searchItem.uploaderUrl ?? '',
publishedAt: searchItem.uploadedDate != null
? DateTime.tryParse(searchItem.uploadedDate!) ?? DateTime(2003, 9, 9)
: DateTime(2003, 9, 9),

View File

@ -41,18 +41,18 @@ abstract class SourcedTrack extends Track {
static SourcedTrack fromJson(Map<String, dynamic> json) {
// TODO Follow user preferences
const audioSource = "youtube";
const audioSource = 'youtube';
final sourceInfo = SourceInfo.fromJson(json);
final source = SourceMap.fromJson(json);
final track = Track.fromJson(json);
final siblings = (json["siblings"] as List)
final siblings = (json['siblings'] as List)
.map((sibling) => SourceInfo.fromJson(sibling))
.toList()
.cast<SourceInfo>();
return switch (audioSource) {
"piped" => PipedSourcedTrack(
'piped' => PipedSourcedTrack(
source: source,
siblings: siblings,
sourceInfo: sourceInfo,
@ -87,11 +87,11 @@ abstract class SourcedTrack extends Track {
required Track track,
}) async {
// TODO Follow user preferences
const audioSource = "youtube";
const audioSource = 'youtube';
try {
return switch (audioSource) {
"piped" => await PipedSourcedTrack.fetchFromTrack(track: track),
'piped' => await PipedSourcedTrack.fetchFromTrack(track: track),
_ => await YoutubeSourcedTrack.fetchFromTrack(track: track),
};
} on TrackNotFoundError catch (_) {
@ -111,10 +111,10 @@ abstract class SourcedTrack extends Track {
required Track track,
}) {
// TODO Follow user preferences
const audioSource = "youtube";
const audioSource = 'youtube';
return switch (audioSource) {
"piped" => PipedSourcedTrack.fetchSiblings(track: track),
'piped' => PipedSourcedTrack.fetchSiblings(track: track),
_ => YoutubeSourcedTrack.fetchSiblings(track: track),
};
}

View File

@ -97,8 +97,8 @@ class PipedSourcedTrack extends SourcedTrack {
info: PipedSourceInfo(
id: item.id,
artist: item.channelName,
artistUrl: "https://www.youtube.com/${item.channelId}",
pageUrl: "https://www.youtube.com/watch?v=${item.id}",
artistUrl: 'https://www.youtube.com/${item.channelId}',
pageUrl: 'https://www.youtube.com/watch?v=${item.id}',
thumbnail: item.thumbnailUrl,
title: item.title,
duration: item.duration,
@ -118,7 +118,7 @@ class PipedSourcedTrack extends SourcedTrack {
// TODO Allow user search with normal youtube video (`youtube`)
const searchMode = SearchMode.youtubeMusic;
// TODO Follow user preferences
const audioSource = "youtube";
const audioSource = 'youtube';
final query = SourcedTrack.getSearchTerm(track);
@ -131,7 +131,7 @@ class PipedSourcedTrack extends SourcedTrack {
// when falling back to piped API make sure to use the YouTube mode
const isYouTubeMusic =
audioSource != "piped" ? false : searchMode == SearchMode.youtubeMusic;
audioSource != 'piped' ? false : searchMode == SearchMode.youtubeMusic;
if (isYouTubeMusic) {
final artists = (track.artists ?? [])

View File

@ -15,7 +15,7 @@ import 'package:youtube_explode_dart/youtube_explode_dart.dart';
final youtubeClient = YoutubeExplode();
final officialMusicRegex = RegExp(
r"official\s(video|audio|music\svideo|lyric\svideo|visualizer)",
r'official\s(video|audio|music\svideo|lyric\svideo|visualizer)',
caseSensitive: false,
);
@ -62,11 +62,11 @@ class YoutubeSourcedTrack extends SourcedTrack {
static SourceMap toSourceMap(StreamManifest manifest) {
var m4a = manifest.audioOnly
.where((audio) => audio.codec.mimeType == "audio/mp4")
.where((audio) => audio.codec.mimeType == 'audio/mp4')
.sortByBitrate();
var weba = manifest.audioOnly
.where((audio) => audio.codec.mimeType == "audio/webm")
.where((audio) => audio.codec.mimeType == 'audio/webm')
.sortByBitrate();
m4a = m4a.isEmpty ? weba.toList() : m4a;
@ -96,7 +96,7 @@ class YoutubeSourcedTrack extends SourcedTrack {
final manifest =
await youtubeClient.videos.streamsClient.getManifest(item.id).timeout(
const Duration(seconds: 5),
onTimeout: () => throw ClientException("Timeout"),
onTimeout: () => throw ClientException('Timeout'),
);
sourceMap = toSourceMap(manifest);
}
@ -105,8 +105,8 @@ class YoutubeSourcedTrack extends SourcedTrack {
info: YoutubeSourceInfo(
id: item.id,
artist: item.channelName,
artistUrl: "https://www.youtube.com/channel/${item.channelId}",
pageUrl: "https://www.youtube.com/watch?v=${item.id}",
artistUrl: 'https://www.youtube.com/channel/${item.channelId}',
pageUrl: 'https://www.youtube.com/watch?v=${item.id}',
thumbnail: item.thumbnailUrl,
title: item.title,
duration: item.duration,
@ -179,7 +179,7 @@ class YoutubeSourcedTrack extends SourcedTrack {
required Track track,
}) async {
final links = await SongLinkService.links(track.id!);
final ytLink = links.firstWhereOrNull((link) => link.platform == "youtube");
final ytLink = links.firstWhereOrNull((link) => link.platform == 'youtube');
if (ytLink?.url != null
// allows to fetch siblings more results for already sourced track
@ -203,7 +203,7 @@ class YoutubeSourcedTrack extends SourcedTrack {
final query = SourcedTrack.getSearchTerm(track);
final searchResults = await youtubeClient.search.search(
"$query - Topic",
'$query - Topic',
filter: TypeFilters.video,
);
@ -240,7 +240,7 @@ class YoutubeSourcedTrack extends SourcedTrack {
.getManifest(newSourceInfo.id)
.timeout(
const Duration(seconds: 5),
onTimeout: () => throw ClientException("Timeout"),
onTimeout: () => throw ClientException('Timeout'),
);
// TODO Save to cache here