Compare commits

...

7 Commits

Author SHA1 Message Date
Richard Hajek
6063eaa430
Merge 42e954428b into 412f3dd81c 2025-08-29 19:10:12 +06:00
Kingkor Roy Tirtho
412f3dd81c chore: optimize assets and app size 2025-08-29 17:33:54 +06:00
Kingkor Roy Tirtho
7f30ae8d31 chore: disable caching of plugin download file 2025-08-29 15:05:29 +06:00
Richard Hajek
42e954428b feat: added filtering duplicates in recent 2025-01-18 18:01:26 +01:00
Kingkor Roy Tirtho
8c1337d1fc
Merge pull request #2118 from KRTirtho/dev
chore: release 3.9.0
2024-12-09 00:04:29 +06:00
Kingkor Roy Tirtho
94e704087f Merge branch 'dev' 2024-10-09 16:38:23 +06:00
Kingkor Roy Tirtho
8e287ab1e5
Merge pull request #1981 from KRTirtho/dev
Release 3.8.3
2024-10-09 15:39:31 +06:00
101 changed files with 227 additions and 680 deletions

View File

@ -8,7 +8,7 @@ tar:
mkdir -p $(TEMP_DIR)\
&& cp -r $(BUNDLE_DIR)/* $(TEMP_DIR)\
&& cp linux/spotube.desktop $(TEMP_DIR)\
&& cp assets/spotube-logo.png $(TEMP_DIR)\
&& cp assets/branding/spotube-logo.png $(TEMP_DIR)\
&& cp linux/com.github.KRTirtho.Spotube.appdata.xml $(TEMP_DIR)\
&& tar -cJf build/spotube-linux-${VERSION}-${PKG_ARCH}.tar.xz -C $(TEMP_DIR) .\
&& rm -rf $(TEMP_DIR)

View File

@ -38,7 +38,7 @@ That means, in the upcoming new versions, you will no longer be able to login wi
> Spotube has no affiliation with Spotify™ or any of its subsidiaries.
<div align="center">
<img width="600" src="assets/spotube_banner.png" alt="Spotube Logo">
<img width="600" src="assets/branding/spotube_banner.png" alt="Spotube Logo">
An open source, cross-platform music client<br />
utilizing selected music provider API and YouTube®, Piped.video or JioSaavn as an audio source

View File

@ -33,7 +33,7 @@ def composeVersion = "1.4.8"
android {
namespace "oss.krtirtho.spotube"
compileSdkVersion 35
compileSdkVersion 36
ndkVersion = "27.0.12077973"

View File

@ -1,6 +1,6 @@
{
"title": "Spotube",
"icon": "assets/spotube-logo-macos.png",
"icon": "assets/branding/spotube-logo-macos.png",
"contents": [
{
"x": 448,
@ -15,4 +15,4 @@
"path": "build/macos/Build/Products/Release/Spotube.app"
}
]
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 689 KiB

View File

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View File

Before

Width:  |  Height:  |  Size: 70 KiB

After

Width:  |  Height:  |  Size: 70 KiB

View File

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 54 KiB

View File

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 44 KiB

View File

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 44 KiB

View File

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 39 KiB

View File

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

View File

Before

Width:  |  Height:  |  Size: 790 KiB

After

Width:  |  Height:  |  Size: 790 KiB

View File

Before

Width:  |  Height:  |  Size: 771 KiB

After

Width:  |  Height:  |  Size: 771 KiB

View File

Before

Width:  |  Height:  |  Size: 191 KiB

After

Width:  |  Height:  |  Size: 191 KiB

View File

Before

Width:  |  Height:  |  Size: 1.4 MiB

After

Width:  |  Height:  |  Size: 1.4 MiB

View File

Before

Width:  |  Height:  |  Size: 94 KiB

After

Width:  |  Height:  |  Size: 94 KiB

View File

Before

Width:  |  Height:  |  Size: 435 KiB

After

Width:  |  Height:  |  Size: 435 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 9.4 KiB

After

Width:  |  Height:  |  Size: 9.4 KiB

View File

Before

Width:  |  Height:  |  Size: 144 KiB

After

Width:  |  Height:  |  Size: 144 KiB

View File

Before

Width:  |  Height:  |  Size: 351 KiB

After

Width:  |  Height:  |  Size: 351 KiB

View File

Before

Width:  |  Height:  |  Size: 1.4 MiB

After

Width:  |  Height:  |  Size: 1.4 MiB

View File

Before

Width:  |  Height:  |  Size: 241 KiB

After

Width:  |  Height:  |  Size: 241 KiB

View File

Before

Width:  |  Height:  |  Size: 531 KiB

After

Width:  |  Height:  |  Size: 531 KiB

View File

Before

Width:  |  Height:  |  Size: 158 KiB

After

Width:  |  Height:  |  Size: 158 KiB

View File

Before

Width:  |  Height:  |  Size: 396 KiB

After

Width:  |  Height:  |  Size: 396 KiB

View File

Before

Width:  |  Height:  |  Size: 1006 KiB

After

Width:  |  Height:  |  Size: 1006 KiB

View File

Before

Width:  |  Height:  |  Size: 156 KiB

After

Width:  |  Height:  |  Size: 156 KiB

View File

Before

Width:  |  Height:  |  Size: 137 KiB

After

Width:  |  Height:  |  Size: 137 KiB

View File

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

View File

Before

Width:  |  Height:  |  Size: 383 KiB

After

Width:  |  Height:  |  Size: 383 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 167 KiB

View File

Before

Width:  |  Height:  |  Size: 94 KiB

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 285 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

View File

Before

Width:  |  Height:  |  Size: 8.7 KiB

After

Width:  |  Height:  |  Size: 8.7 KiB

View File

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 336 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 498 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 180 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 167 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

View File

@ -15,7 +15,7 @@ enclosed in quotation marks, you should use an editor that supports UTF-8, not t
<authors>Kingkor Roy Tirtho</authors>
<projectUrl>https://spotube.krtirtho.dev</projectUrl>
<iconUrl>
https://rawcdn.githack.com/KRTirtho/spotube/7edb0bb834eb18c05551e30a891720a6abf53dbe/assets/spotube-logo.png</iconUrl>
https://rawcdn.githack.com/KRTirtho/spotube/7edb0bb834eb18c05551e30a891720a6abf53dbe/assets/branding/spotube-logo.png</iconUrl>
<copyright>2022 Spotube</copyright>
<!-- If there is a license Url available, it is required for the community feed -->
<licenseUrl>https://github.com/KRTirtho/spotube/blob/master/LICENSE</licenseUrl>

View File

@ -74,7 +74,7 @@ class LinuxBuildCommand extends Command with BuildCommandCommonSteps {
).copy(
join(tempDir, "com.github.KRTirtho.Spotube.appdata.xml"),
);
await File(join(cwd.path, "assets", "spotube-logo.png")).copy(
await File(join(cwd.path, "assets", "branding", "spotube-logo.png")).copy(
join(tempDir, "spotube-logo.png"),
);

View File

@ -1,6 +1,6 @@
flutter_launcher_icons:
android: true
ios: true
image_path: "assets/spotube-nightly-logo.png"
adaptive_icon_foreground: "assets/spotube-nightly-logo-foreground.png"
image_path: "assets/branding/spotube-nightly-logo.png"
adaptive_icon_foreground: "assets/branding/spotube-nightly-logo-foreground.png"
adaptive_icon_background: "#242832"

View File

@ -1,19 +1,19 @@
# flutter pub run flutter_launcher_icons
flutter_launcher_icons:
image_path: "assets/spotube-logo.png"
image_path: "assets/branding/spotube-logo.png"
android: true
# image_path_android: "assets/icon/icon.png"
# image_path_android: "assets/branding/icon/icon.png"
min_sdk_android: 21 # android min sdk min:16, default 21
adaptive_icon_background: "#242832"
adaptive_icon_foreground: "assets/spotube-logo-foreground.png"
# adaptive_icon_monochrome: "assets/icon/monochrome.png"
adaptive_icon_foreground: "assets/branding/spotube-logo-foreground.png"
# adaptive_icon_monochrome: "assets/branding/icon/monochrome.png"
ios: true
# image_path_ios: "assets/icon/icon.png"
# image_path_ios: "assets/branding/icon/icon.png"
remove_alpha_channel_ios: true
# image_path_ios_dark_transparent: "assets/icon/icon_dark.png"
# image_path_ios_tinted_grayscale: "assets/icon/icon_tinted.png"
# image_path_ios_dark_transparent: "assets/branding/icon/icon_dark.png"
# image_path_ios_tinted_grayscale: "assets/branding/icon/icon_tinted.png"
# desaturate_tinted_to_grayscale_ios: true
web:
@ -21,9 +21,9 @@ flutter_launcher_icons:
windows:
generate: true
image_path: "assets/spotube-logo.png"
image_path: "assets/branding/spotube-logo.png"
icon_size: 48 # min:48, max:256, default: 48
macos:
generate: true
image_path: "assets/spotube-logo-macos.png"
image_path: "assets/branding/spotube-logo-macos.png"

View File

@ -1,9 +1,9 @@
flutter_native_splash:
background_image: assets/bengali-patterns-bg.jpg
image: assets/spotube-nightly-logo.png
branding: assets/branding.png
background_image: assets/images/bengali-patterns-bg.jpg
image: assets/branding/spotube-nightly-logo.png
branding: assets/branding/branding.png
android_12:
image: assets/spotube-nightly-logo_android12.png
branding: assets/branding.png
image: assets/branding/spotube-nightly-logo_android12.png
branding: assets/branding/branding.png
color: "#000000"
icon_background_color: "#000000"

View File

@ -9,220 +9,85 @@
import 'package:flutter/widgets.dart';
class $AssetsBackgroundsGen {
const $AssetsBackgroundsGen();
class $AssetsBrandingGen {
const $AssetsBrandingGen();
/// File path: assets/backgrounds/xmas-effect.png
AssetGenImage get xmasEffect =>
const AssetGenImage('assets/backgrounds/xmas-effect.png');
/// File path: assets/branding/spotube-logo-light.png
AssetGenImage get spotubeLogoLight =>
const AssetGenImage('assets/branding/spotube-logo-light.png');
/// File path: assets/branding/spotube-logo.png
AssetGenImage get spotubeLogo =>
const AssetGenImage('assets/branding/spotube-logo.png');
/// List of all assets
List<AssetGenImage> get values => [xmasEffect];
List<AssetGenImage> get values => [spotubeLogoLight, spotubeLogo];
}
class $AssetsLogosGen {
const $AssetsLogosGen();
class $AssetsImagesGen {
const $AssetsImagesGen();
/// File path: assets/logos/songlink-transparent.png
AssetGenImage get songlinkTransparent =>
const AssetGenImage('assets/logos/songlink-transparent.png');
/// File path: assets/images/album-placeholder.png
AssetGenImage get albumPlaceholder =>
const AssetGenImage('assets/images/album-placeholder.png');
/// File path: assets/logos/songlink.png
AssetGenImage get songlink =>
const AssetGenImage('assets/logos/songlink.png');
/// File path: assets/images/bengali-patterns-bg.jpg
AssetGenImage get bengaliPatternsBg =>
const AssetGenImage('assets/images/bengali-patterns-bg.jpg');
/// List of all assets
List<AssetGenImage> get values => [songlinkTransparent, songlink];
}
/// File path: assets/images/liked-tracks.jpg
AssetGenImage get likedTracks =>
const AssetGenImage('assets/images/liked-tracks.jpg');
class $AssetsPatternsGen {
const $AssetsPatternsGen();
/// Directory path: assets/images/logos
$AssetsImagesLogosGen get logos => const $AssetsImagesLogosGen();
/// File path: assets/patterns/black_white_visualized.jpg
AssetGenImage get blackWhiteVisualized =>
const AssetGenImage('assets/patterns/black_white_visualized.jpg');
/// File path: assets/images/placeholder.png
AssetGenImage get placeholder =>
const AssetGenImage('assets/images/placeholder.png');
/// File path: assets/patterns/brazil_carnival.jpg
AssetGenImage get brazilCarnival =>
const AssetGenImage('assets/patterns/brazil_carnival.jpg');
/// File path: assets/patterns/cotton_balls.jpg
AssetGenImage get cottonBalls =>
const AssetGenImage('assets/patterns/cotton_balls.jpg');
/// File path: assets/patterns/cute_worms.jpg
AssetGenImage get cuteWorms =>
const AssetGenImage('assets/patterns/cute_worms.jpg');
/// File path: assets/patterns/flash_cross_axis.jpg
AssetGenImage get flashCrossAxis =>
const AssetGenImage('assets/patterns/flash_cross_axis.jpg');
/// File path: assets/patterns/memphis_shapes.jpg
AssetGenImage get memphisShapes =>
const AssetGenImage('assets/patterns/memphis_shapes.jpg');
/// File path: assets/patterns/oval_gloomy.jpg
AssetGenImage get ovalGloomy =>
const AssetGenImage('assets/patterns/oval_gloomy.jpg');
/// File path: assets/patterns/oval_sunny.jpg
AssetGenImage get ovalSunny =>
const AssetGenImage('assets/patterns/oval_sunny.jpg');
/// File path: assets/patterns/red_nimbuses.jpg
AssetGenImage get redNimbuses =>
const AssetGenImage('assets/patterns/red_nimbuses.jpg');
/// File path: assets/patterns/tree_bark.jpg
AssetGenImage get treeBark =>
const AssetGenImage('assets/patterns/tree_bark.jpg');
/// File path: assets/patterns/vibrant_pentagons.jpg
AssetGenImage get vibrantPentagons =>
const AssetGenImage('assets/patterns/vibrant_pentagons.jpg');
/// File path: assets/patterns/wiring_pattern.jpg
AssetGenImage get wiringPattern =>
const AssetGenImage('assets/patterns/wiring_pattern.jpg');
/// File path: assets/patterns/zigzags_gloomy.jpg
AssetGenImage get zigzagsGloomy =>
const AssetGenImage('assets/patterns/zigzags_gloomy.jpg');
/// File path: assets/patterns/zigzags_sunny.jpg
AssetGenImage get zigzagsSunny =>
const AssetGenImage('assets/patterns/zigzags_sunny.jpg');
/// File path: assets/images/user-placeholder.png
AssetGenImage get userPlaceholder =>
const AssetGenImage('assets/images/user-placeholder.png');
/// List of all assets
List<AssetGenImage> get values => [
blackWhiteVisualized,
brazilCarnival,
cottonBalls,
cuteWorms,
flashCrossAxis,
memphisShapes,
ovalGloomy,
ovalSunny,
redNimbuses,
treeBark,
vibrantPentagons,
wiringPattern,
zigzagsGloomy,
zigzagsSunny
albumPlaceholder,
bengaliPatternsBg,
likedTracks,
placeholder,
userPlaceholder
];
}
class $AssetsTutorialGen {
const $AssetsTutorialGen();
class $AssetsImagesLogosGen {
const $AssetsImagesLogosGen();
/// File path: assets/tutorial/step-1.png
AssetGenImage get step1 => const AssetGenImage('assets/tutorial/step-1.png');
/// File path: assets/images/logos/invidious.jpg
AssetGenImage get invidious =>
const AssetGenImage('assets/images/logos/invidious.jpg');
/// File path: assets/tutorial/step-2.png
AssetGenImage get step2 => const AssetGenImage('assets/tutorial/step-2.png');
/// File path: assets/images/logos/jiosaavn.png
AssetGenImage get jiosaavn =>
const AssetGenImage('assets/images/logos/jiosaavn.png');
/// File path: assets/tutorial/step-3.png
AssetGenImage get step3 => const AssetGenImage('assets/tutorial/step-3.png');
/// File path: assets/images/logos/songlink-transparent.png
AssetGenImage get songlinkTransparent =>
const AssetGenImage('assets/images/logos/songlink-transparent.png');
/// List of all assets
List<AssetGenImage> get values => [step1, step2, step3];
List<AssetGenImage> get values => [invidious, jiosaavn, songlinkTransparent];
}
class Assets {
Assets._();
static const String license = 'LICENSE';
static const AssetGenImage albumPlaceholder =
AssetGenImage('assets/album-placeholder.png');
static const $AssetsBackgroundsGen backgrounds = $AssetsBackgroundsGen();
static const AssetGenImage bengaliPatternsBg =
AssetGenImage('assets/bengali-patterns-bg.jpg');
static const AssetGenImage branding = AssetGenImage('assets/branding.png');
static const AssetGenImage emptyBox = AssetGenImage('assets/empty_box.png');
static const AssetGenImage invidious = AssetGenImage('assets/invidious.jpg');
static const AssetGenImage jiosaavn = AssetGenImage('assets/jiosaavn.png');
static const AssetGenImage likedTracks =
AssetGenImage('assets/liked-tracks.jpg');
static const $AssetsLogosGen logos = $AssetsLogosGen();
static const $AssetsPatternsGen patterns = $AssetsPatternsGen();
static const AssetGenImage placeholder =
AssetGenImage('assets/placeholder.png');
static const AssetGenImage spotubeHeroBanner =
AssetGenImage('assets/spotube-hero-banner.png');
static const AssetGenImage spotubeLogoForeground =
AssetGenImage('assets/spotube-logo-foreground.png');
static const AssetGenImage spotubeLogoItem =
AssetGenImage('assets/spotube-logo-item.png');
static const AssetGenImage spotubeLogoLight =
AssetGenImage('assets/spotube-logo-light.png');
static const AssetGenImage spotubeLogoMacos =
AssetGenImage('assets/spotube-logo-macos.png');
static const AssetGenImage spotubeLogoBmp =
AssetGenImage('assets/spotube-logo.bmp');
static const String spotubeLogoIco = 'assets/spotube-logo.ico';
static const AssetGenImage spotubeLogoPng =
AssetGenImage('assets/spotube-logo.png');
static const AssetGenImage spotubeLogoAndroid12 =
AssetGenImage('assets/spotube-logo_android12.png');
static const AssetGenImage spotubeNightlyItem =
AssetGenImage('assets/spotube-nightly-item.png');
static const AssetGenImage spotubeNightlyLogoForegroundPng =
AssetGenImage('assets/spotube-nightly-logo-foreground.png');
static const String spotubeNightlyLogoForegroundSvg =
'assets/spotube-nightly-logo-foreground.svg';
static const AssetGenImage spotubeNightlyLogo =
AssetGenImage('assets/spotube-nightly-logo.png');
static const AssetGenImage spotubeNightlyLogoAndroid12 =
AssetGenImage('assets/spotube-nightly-logo_android12.png');
static const AssetGenImage spotubeScreenshot =
AssetGenImage('assets/spotube-screenshot.png');
static const AssetGenImage spotubeTallCapsule =
AssetGenImage('assets/spotube-tall-capsule.png');
static const AssetGenImage spotubeWideCapsuleLarge =
AssetGenImage('assets/spotube-wide-capsule-large.png');
static const AssetGenImage spotubeWideCapsuleSmall =
AssetGenImage('assets/spotube-wide-capsule-small.png');
static const AssetGenImage spotubeBanner =
AssetGenImage('assets/spotube_banner.png');
static const AssetGenImage success = AssetGenImage('assets/success.png');
static const $AssetsTutorialGen tutorial = $AssetsTutorialGen();
static const AssetGenImage userPlaceholder =
AssetGenImage('assets/user-placeholder.png');
static const $AssetsBrandingGen branding = $AssetsBrandingGen();
static const $AssetsImagesGen images = $AssetsImagesGen();
/// List of all assets
static List<dynamic> get values => [
license,
albumPlaceholder,
bengaliPatternsBg,
branding,
emptyBox,
invidious,
jiosaavn,
likedTracks,
placeholder,
spotubeHeroBanner,
spotubeLogoForeground,
spotubeLogoItem,
spotubeLogoLight,
spotubeLogoMacos,
spotubeLogoBmp,
spotubeLogoIco,
spotubeLogoPng,
spotubeLogoAndroid12,
spotubeNightlyItem,
spotubeNightlyLogoForegroundPng,
spotubeNightlyLogoForegroundSvg,
spotubeNightlyLogo,
spotubeNightlyLogoAndroid12,
spotubeScreenshot,
spotubeTallCapsule,
spotubeWideCapsuleLarge,
spotubeWideCapsuleSmall,
spotubeBanner,
success,
userPlaceholder
];
static List<String> get values => [license];
}
class AssetGenImage {

View File

@ -18,4 +18,7 @@ class FontFamily {
/// Font family: RadixIcons
static const String radixIcons = 'RadixIcons';
/// Font family: Ubuntu Mono
static const String ubuntuMono = 'Ubuntu Mono';
}

View File

@ -58,10 +58,10 @@ class UniversalImage extends HookWidget {
),
height: height,
width: width,
placeholder: AssetImage(placeholder ?? Assets.placeholder.path),
placeholder: AssetImage(placeholder ?? Assets.images.placeholder.path),
imageErrorBuilder: (context, error, stackTrace) {
return Image.asset(
placeholder ?? Assets.placeholder.path,
placeholder ?? Assets.images.placeholder.path,
width: width,
height: height,
cacheHeight: height?.toInt(),
@ -82,7 +82,7 @@ class UniversalImage extends HookWidget {
fit: fit,
errorBuilder: (context, error, stackTrace) {
return Image.asset(
placeholder ?? Assets.placeholder.path,
placeholder ?? Assets.images.placeholder.path,
width: width,
height: height,
cacheHeight: height?.toInt(),
@ -102,7 +102,7 @@ class UniversalImage extends HookWidget {
fit: fit,
errorBuilder: (context, error, stackTrace) {
return Image.asset(
placeholder ?? Assets.placeholder.path,
placeholder ?? Assets.images.placeholder.path,
width: width,
height: height,
cacheHeight: height?.toInt(),
@ -123,7 +123,7 @@ class UniversalImage extends HookWidget {
fit: fit,
errorBuilder: (context, error, stackTrace) {
return Image.asset(
placeholder ?? Assets.placeholder.path,
placeholder ?? Assets.images.placeholder.path,
width: width,
height: height,
cacheHeight: height?.toInt(),

View File

@ -254,7 +254,7 @@ class TrackOptions extends HookConsumerWidget {
playlistId,
);
},
leading: Assets.logos.songlinkTransparent.image(
leading: Assets.images.logos.songlinkTransparent.image(
width: 22,
height: 22,
color: colorScheme.foreground.withValues(alpha: 0.5),

View File

@ -112,13 +112,8 @@ mixin _$WebSocketLoadEventData {
required TResult orElse(),
}) =>
throw _privateConstructorUsedError;
/// Serializes this WebSocketLoadEventData to a JSON map.
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
/// Create a copy of WebSocketLoadEventData
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@JsonKey(ignore: true)
$WebSocketLoadEventDataCopyWith<WebSocketLoadEventData> get copyWith =>
throw _privateConstructorUsedError;
}
@ -147,8 +142,6 @@ class _$WebSocketLoadEventDataCopyWithImpl<$Res,
// ignore: unused_field
final $Res Function($Val) _then;
/// Create a copy of WebSocketLoadEventData
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
@ -197,8 +190,6 @@ class __$$WebSocketLoadEventDataPlaylistImplCopyWithImpl<$Res>
$Res Function(_$WebSocketLoadEventDataPlaylistImpl) _then)
: super(_value, _then);
/// Create a copy of WebSocketLoadEventData
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
@ -222,8 +213,6 @@ class __$$WebSocketLoadEventDataPlaylistImplCopyWithImpl<$Res>
));
}
/// Create a copy of WebSocketLoadEventData
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$SpotubeSimplePlaylistObjectCopyWith<$Res>? get collection {
@ -292,14 +281,12 @@ class _$WebSocketLoadEventDataPlaylistImpl
other.initialIndex == initialIndex));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@JsonKey(ignore: true)
@override
int get hashCode => Object.hash(runtimeType,
const DeepCollectionEquality().hash(_tracks), collection, initialIndex);
/// Create a copy of WebSocketLoadEventData
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@JsonKey(ignore: true)
@override
@pragma('vm:prefer-inline')
_$$WebSocketLoadEventDataPlaylistImplCopyWith<
@ -433,11 +420,8 @@ abstract class WebSocketLoadEventDataPlaylist extends WebSocketLoadEventData {
SpotubeSimplePlaylistObject? get collection;
@override
int? get initialIndex;
/// Create a copy of WebSocketLoadEventData
/// with the given fields replaced by the non-null parameter values.
@override
@JsonKey(includeFromJson: false, includeToJson: false)
@JsonKey(ignore: true)
_$$WebSocketLoadEventDataPlaylistImplCopyWith<
_$WebSocketLoadEventDataPlaylistImpl>
get copyWith => throw _privateConstructorUsedError;
@ -472,8 +456,6 @@ class __$$WebSocketLoadEventDataAlbumImplCopyWithImpl<$Res>
$Res Function(_$WebSocketLoadEventDataAlbumImpl) _then)
: super(_value, _then);
/// Create a copy of WebSocketLoadEventData
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
@ -497,8 +479,6 @@ class __$$WebSocketLoadEventDataAlbumImplCopyWithImpl<$Res>
));
}
/// Create a copy of WebSocketLoadEventData
/// with the given fields replaced by the non-null parameter values.
@override
@pragma('vm:prefer-inline')
$SpotubeSimpleAlbumObjectCopyWith<$Res>? get collection {
@ -565,14 +545,12 @@ class _$WebSocketLoadEventDataAlbumImpl extends WebSocketLoadEventDataAlbum {
other.initialIndex == initialIndex));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@JsonKey(ignore: true)
@override
int get hashCode => Object.hash(runtimeType,
const DeepCollectionEquality().hash(_tracks), collection, initialIndex);
/// Create a copy of WebSocketLoadEventData
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@JsonKey(ignore: true)
@override
@pragma('vm:prefer-inline')
_$$WebSocketLoadEventDataAlbumImplCopyWith<_$WebSocketLoadEventDataAlbumImpl>
@ -705,11 +683,8 @@ abstract class WebSocketLoadEventDataAlbum extends WebSocketLoadEventData {
SpotubeSimpleAlbumObject? get collection;
@override
int? get initialIndex;
/// Create a copy of WebSocketLoadEventData
/// with the given fields replaced by the non-null parameter values.
@override
@JsonKey(includeFromJson: false, includeToJson: false)
@JsonKey(ignore: true)
_$$WebSocketLoadEventDataAlbumImplCopyWith<_$WebSocketLoadEventDataAlbumImpl>
get copyWith => throw _privateConstructorUsedError;
}

View File

@ -20,9 +20,9 @@ enum ImagePlaceholder {
}
final placeholderUrlMap = {
ImagePlaceholder.albumArt: Assets.albumPlaceholder.path,
ImagePlaceholder.artist: Assets.userPlaceholder.path,
ImagePlaceholder.collection: Assets.placeholder.path,
ImagePlaceholder.albumArt: Assets.images.albumPlaceholder.path,
ImagePlaceholder.artist: Assets.images.userPlaceholder.path,
ImagePlaceholder.collection: Assets.images.placeholder.path,
ImagePlaceholder.online:
"https://avatars.dicebear.com/api/bottts/${PrimitiveUtils.uuid.v4()}.png",
};

File diff suppressed because it is too large Load Diff

View File

@ -28,12 +28,8 @@ mixin _$TrackSourceQuery {
String get isrc => throw _privateConstructorUsedError;
bool get explicit => throw _privateConstructorUsedError;
/// Serializes this TrackSourceQuery to a JSON map.
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
/// Create a copy of TrackSourceQuery
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@JsonKey(ignore: true)
$TrackSourceQueryCopyWith<TrackSourceQuery> get copyWith =>
throw _privateConstructorUsedError;
}
@ -64,8 +60,6 @@ class _$TrackSourceQueryCopyWithImpl<$Res, $Val extends TrackSourceQuery>
// ignore: unused_field
final $Res Function($Val) _then;
/// Create a copy of TrackSourceQuery
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
@ -136,8 +130,6 @@ class __$$TrackSourceQueryImplCopyWithImpl<$Res>
$Res Function(_$TrackSourceQueryImpl) _then)
: super(_value, _then);
/// Create a copy of TrackSourceQuery
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
@ -241,7 +233,7 @@ class _$TrackSourceQueryImpl extends _TrackSourceQuery {
other.explicit == explicit));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@JsonKey(ignore: true)
@override
int get hashCode => Object.hash(
runtimeType,
@ -253,9 +245,7 @@ class _$TrackSourceQueryImpl extends _TrackSourceQuery {
isrc,
explicit);
/// Create a copy of TrackSourceQuery
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@JsonKey(ignore: true)
@override
@pragma('vm:prefer-inline')
_$$TrackSourceQueryImplCopyWith<_$TrackSourceQueryImpl> get copyWith =>
@ -298,11 +288,8 @@ abstract class _TrackSourceQuery extends TrackSourceQuery {
String get isrc;
@override
bool get explicit;
/// Create a copy of TrackSourceQuery
/// with the given fields replaced by the non-null parameter values.
@override
@JsonKey(includeFromJson: false, includeToJson: false)
@JsonKey(ignore: true)
_$$TrackSourceQueryImplCopyWith<_$TrackSourceQueryImpl> get copyWith =>
throw _privateConstructorUsedError;
}
@ -320,12 +307,8 @@ mixin _$TrackSourceInfo {
String get pageUrl => throw _privateConstructorUsedError;
int get durationMs => throw _privateConstructorUsedError;
/// Serializes this TrackSourceInfo to a JSON map.
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
/// Create a copy of TrackSourceInfo
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@JsonKey(ignore: true)
$TrackSourceInfoCopyWith<TrackSourceInfo> get copyWith =>
throw _privateConstructorUsedError;
}
@ -355,8 +338,6 @@ class _$TrackSourceInfoCopyWithImpl<$Res, $Val extends TrackSourceInfo>
// ignore: unused_field
final $Res Function($Val) _then;
/// Create a copy of TrackSourceInfo
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
@ -421,8 +402,6 @@ class __$$TrackSourceInfoImplCopyWithImpl<$Res>
_$TrackSourceInfoImpl _value, $Res Function(_$TrackSourceInfoImpl) _then)
: super(_value, _then);
/// Create a copy of TrackSourceInfo
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
@ -509,14 +488,12 @@ class _$TrackSourceInfoImpl implements _TrackSourceInfo {
other.durationMs == durationMs));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@JsonKey(ignore: true)
@override
int get hashCode => Object.hash(
runtimeType, id, title, artists, thumbnail, pageUrl, durationMs);
/// Create a copy of TrackSourceInfo
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@JsonKey(ignore: true)
@override
@pragma('vm:prefer-inline')
_$$TrackSourceInfoImplCopyWith<_$TrackSourceInfoImpl> get copyWith =>
@ -555,11 +532,8 @@ abstract class _TrackSourceInfo implements TrackSourceInfo {
String get pageUrl;
@override
int get durationMs;
/// Create a copy of TrackSourceInfo
/// with the given fields replaced by the non-null parameter values.
@override
@JsonKey(includeFromJson: false, includeToJson: false)
@JsonKey(ignore: true)
_$$TrackSourceInfoImplCopyWith<_$TrackSourceInfoImpl> get copyWith =>
throw _privateConstructorUsedError;
}
@ -575,12 +549,8 @@ mixin _$TrackSource {
SourceCodecs get codec => throw _privateConstructorUsedError;
String get bitrate => throw _privateConstructorUsedError;
/// Serializes this TrackSource to a JSON map.
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
/// Create a copy of TrackSource
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@JsonKey(ignore: true)
$TrackSourceCopyWith<TrackSource> get copyWith =>
throw _privateConstructorUsedError;
}
@ -608,8 +578,6 @@ class _$TrackSourceCopyWithImpl<$Res, $Val extends TrackSource>
// ignore: unused_field
final $Res Function($Val) _then;
/// Create a copy of TrackSource
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
@ -662,8 +630,6 @@ class __$$TrackSourceImplCopyWithImpl<$Res>
_$TrackSourceImpl _value, $Res Function(_$TrackSourceImpl) _then)
: super(_value, _then);
/// Create a copy of TrackSource
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
@ -730,13 +696,11 @@ class _$TrackSourceImpl implements _TrackSource {
(identical(other.bitrate, bitrate) || other.bitrate == bitrate));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@JsonKey(ignore: true)
@override
int get hashCode => Object.hash(runtimeType, url, quality, codec, bitrate);
/// Create a copy of TrackSource
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@JsonKey(ignore: true)
@override
@pragma('vm:prefer-inline')
_$$TrackSourceImplCopyWith<_$TrackSourceImpl> get copyWith =>
@ -768,11 +732,8 @@ abstract class _TrackSource implements TrackSource {
SourceCodecs get codec;
@override
String get bitrate;
/// Create a copy of TrackSource
/// with the given fields replaced by the non-null parameter values.
@override
@JsonKey(includeFromJson: false, includeToJson: false)
@JsonKey(ignore: true)
_$$TrackSourceImplCopyWith<_$TrackSourceImpl> get copyWith =>
throw _privateConstructorUsedError;
}

View File

@ -9,7 +9,7 @@ import 'package:spotube/provider/history/recent.dart';
class HomeRecentlyPlayedSection extends HookConsumerWidget {
const HomeRecentlyPlayedSection({super.key});
@override
Widget build(BuildContext context, ref) {
final history = ref.watch(recentlyPlayedItems);
@ -20,17 +20,20 @@ class HomeRecentlyPlayedSection extends HookConsumerWidget {
return const SizedBox();
}
final uniqueItems = <dynamic>{};
final filteredItems = [
for (final item in historyData)
if (item.playlist != null && item.playlist?.id != null && uniqueItems.add(item.playlist!.id!))
item.playlist
else if (item.album != null && item.album?.id != null && uniqueItems.add(item.album?.id))
item.album
];
return Skeletonizer(
enabled: history.isLoading,
child: HorizontalPlaybuttonCardView(
title: Text(context.l10n.recently_played),
items: [
for (final item in historyData)
if (item.playlist != null)
item.playlist
else if (item.album != null)
item.album
],
items: filteredItems,
hasNextPage: false,
isLoadingNextPage: false,
onFetchMore: () {},

View File

@ -2,7 +2,7 @@ import 'package:auto_route/auto_route.dart';
import 'package:auto_size_text/auto_size_text.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:shadcn_flutter/shadcn_flutter.dart' hide Consumer;
import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:sliding_up_panel/sliding_up_panel.dart';
import 'package:spotube/collections/assets.gen.dart';
@ -115,7 +115,7 @@ class PlayerView extends HookConsumerWidget {
trailing: [
if (currentActiveTrackSource is YoutubeSourcedTrack)
TextButton(
leading: Assets.logos.songlinkTransparent.image(
leading: Assets.images.logos.songlinkTransparent.image(
width: 20,
height: 20,
color: theme.colorScheme.foreground,
@ -178,7 +178,7 @@ class PlayerView extends HookConsumerWidget {
borderRadius: BorderRadius.circular(20),
child: UniversalImage(
path: albumArt,
placeholder: Assets.albumPlaceholder.path,
placeholder: Assets.images.albumPlaceholder.path,
fit: BoxFit.cover,
),
),

View File

@ -37,7 +37,7 @@ class PlayerTrackDetails extends HookConsumerWidget {
child: UniversalImage(
path: (track?.album.images)
.asUrlString(placeholder: ImagePlaceholder.albumArt),
placeholder: Assets.albumPlaceholder.path,
placeholder: Assets.images.albumPlaceholder.path,
),
),
),

View File

@ -36,7 +36,7 @@ final sourceInfoToIconMap = {
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(90),
image: DecorationImage(
image: Assets.jiosaavn.provider(),
image: Assets.images.logos.jiosaavn.provider(),
fit: BoxFit.cover,
),
),
@ -48,7 +48,7 @@ final sourceInfoToIconMap = {
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(90),
image: DecorationImage(
image: Assets.invidious.provider(),
image: Assets.images.logos.invidious.provider(),
fit: BoxFit.cover,
),
),

View File

@ -40,7 +40,7 @@ class BottomPlayer extends HookConsumerWidget {
index: (playlist.activeTrack?.album.images.length ?? 1) - 1,
placeholder: ImagePlaceholder.albumArt,
)
: Assets.albumPlaceholder.path,
: Assets.images.albumPlaceholder.path,
[playlist.activeTrack?.album.images],
);

View File

@ -26,7 +26,7 @@ class Sidebar extends HookConsumerWidget {
color: Colors.black,
borderRadius: BorderRadius.circular(50),
),
child: Assets.spotubeLogoPng.image(
child: Assets.branding.spotubeLogo.image(
height: 50,
cacheHeight: (100 * MediaQuery.devicePixelRatioOf(context)).toInt(),
),

View File

@ -71,7 +71,7 @@ class GettingStartedPage extends HookConsumerWidget {
child: DecoratedBox(
decoration: BoxDecoration(
image: DecorationImage(
image: Assets.bengaliPatternsBg.provider(),
image: Assets.images.bengaliPatternsBg.provider(),
fit: BoxFit.cover,
),
),

View File

@ -17,7 +17,7 @@ class GettingStartedPageGreetingSection extends HookConsumerWidget {
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Assets.spotubeLogoPng.image(height: 200),
Assets.branding.spotubeLogo.image(height: 200),
const Gap(24),
const Text("Spotube").semiBold().h4(),
const Gap(4),

View File

@ -19,9 +19,10 @@ final audioSourceToIconMap = {
AudioSource.piped: const Icon(SpotubeIcons.piped, size: 20),
AudioSource.invidious: ClipRRect(
borderRadius: BorderRadius.circular(26),
child: Assets.invidious.image(width: 26, height: 26),
child: Assets.images.logos.invidious.image(width: 26, height: 26),
),
AudioSource.jiosaavn: Assets.jiosaavn.image(width: 20, height: 20),
AudioSource.jiosaavn:
Assets.images.logos.jiosaavn.image(width: 20, height: 20),
};
class GettingStartedPagePlaybackSection extends HookConsumerWidget {

View File

@ -1,5 +1,3 @@
import 'dart:ui';
import 'package:auto_route/auto_route.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
@ -47,8 +45,8 @@ class HomePage extends HookConsumerWidget {
floating: true,
title: Image.asset(
theme.brightness == Brightness.dark
? Assets.spotubeLogoPng.path
: Assets.spotubeLogoLight.path,
? Assets.branding.spotubeLogo.path
: Assets.branding.spotubeLogoLight.path,
height: 45,
width: 45,
color: theme.colorScheme.background,

View File

@ -50,7 +50,7 @@ class UserPlaylistsPage extends HookConsumerWidget {
owner: me.asData!.value!,
images: [
SpotubeImageObject(
url: Assets.likedTracks.path,
url: Assets.images.likedTracks.path,
width: 300,
height: 300,
)

View File

@ -1,6 +1,7 @@
import 'package:flutter/material.dart' as material;
import 'package:flutter/widgets.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:spotube/collections/assets.gen.dart';
import 'package:spotube/components/track_presentation/presentation_props.dart';
import 'package:spotube/components/track_presentation/track_presentation.dart';
import 'package:spotube/models/metadata/metadata.dart';
@ -30,7 +31,7 @@ class LikedPlaylistPage extends HookConsumerWidget {
child: TrackPresentation(
options: TrackPresentationOptions(
collection: playlist,
image: "assets/liked-tracks.jpg",
image: Assets.images.likedTracks.path,
pagination: PaginationProps(
hasNextPage: false,
isLoading: likedTracks.isLoading,

View File

@ -45,7 +45,7 @@ class AboutSpotubePage extends HookConsumerWidget {
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: Column(
children: [
Assets.spotubeLogoPng.image(
Assets.branding.spotubeLogo.image(
height: 200,
width: 200,
),

View File

@ -27,12 +27,8 @@ mixin _$AudioPlayerState {
int get currentIndex => throw _privateConstructorUsedError;
List<SpotubeTrackObject> get tracks => throw _privateConstructorUsedError;
/// Serializes this AudioPlayerState to a JSON map.
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
/// Create a copy of AudioPlayerState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@JsonKey(ignore: true)
$AudioPlayerStateCopyWith<AudioPlayerState> get copyWith =>
throw _privateConstructorUsedError;
}
@ -62,8 +58,6 @@ class _$AudioPlayerStateCopyWithImpl<$Res, $Val extends AudioPlayerState>
// ignore: unused_field
final $Res Function($Val) _then;
/// Create a copy of AudioPlayerState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
@ -128,8 +122,6 @@ class __$$AudioPlayerStateImplCopyWithImpl<$Res>
$Res Function(_$AudioPlayerStateImpl) _then)
: super(_value, _then);
/// Create a copy of AudioPlayerState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
@ -234,7 +226,7 @@ class _$AudioPlayerStateImpl extends _AudioPlayerState {
const DeepCollectionEquality().equals(other._tracks, _tracks));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@JsonKey(ignore: true)
@override
int get hashCode => Object.hash(
runtimeType,
@ -245,9 +237,7 @@ class _$AudioPlayerStateImpl extends _AudioPlayerState {
currentIndex,
const DeepCollectionEquality().hash(_tracks));
/// Create a copy of AudioPlayerState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@JsonKey(ignore: true)
@override
@pragma('vm:prefer-inline')
_$$AudioPlayerStateImplCopyWith<_$AudioPlayerStateImpl> get copyWith =>
@ -287,11 +277,8 @@ abstract class _AudioPlayerState extends AudioPlayerState {
int get currentIndex;
@override
List<SpotubeTrackObject> get tracks;
/// Create a copy of AudioPlayerState
/// with the given fields replaced by the non-null parameter values.
@override
@JsonKey(includeFromJson: false, includeToJson: false)
@JsonKey(ignore: true)
_$$AudioPlayerStateImplCopyWith<_$AudioPlayerStateImpl> get copyWith =>
throw _privateConstructorUsedError;
}

View File

@ -15,7 +15,6 @@ import 'package:spotube/services/logger/logger.dart';
import 'package:spotube/services/metadata/errors/exceptions.dart';
import 'package:spotube/services/metadata/metadata.dart';
import 'package:spotube/utils/service_utils.dart';
import 'package:uuid/uuid.dart';
import 'package:archive/archive.dart';
import 'package:pub_semver/pub_semver.dart';
@ -133,6 +132,8 @@ class MetadataPluginNotifier extends AsyncNotifier<MetadataPluginState> {
if (!await pluginExtractionDir.exists() ||
!await pluginJsonFile.exists() ||
!await pluginBinaryFile.exists()) {
// Delete the plugin entry from DB if the plugin files are not there.
await database.metadataPluginsTable.deleteOne(plugin);
continue;
}
@ -290,12 +291,8 @@ class MetadataPluginNotifier extends AsyncNotifier<MetadataPluginState> {
final pluginDir = await _getPluginRootDir();
await pluginDir.create(recursive: true);
final tempPluginName = "${const Uuid().v4()}.smplug";
final pluginFile = File(join(pluginDir.path, tempPluginName));
final pluginRes = await globalDio.download(
final pluginRes = await globalDio.get(
pluginDownloadUrl,
pluginFile.path,
options: Options(
responseType: ResponseType.bytes,
followRedirects: true,
@ -307,7 +304,7 @@ class MetadataPluginNotifier extends AsyncNotifier<MetadataPluginState> {
throw MetadataPluginException.pluginDownloadFailed();
}
return await extractPluginArchive(await pluginFile.readAsBytes());
return await extractPluginArchive(pluginRes.data);
}
bool validatePluginApiCompatibility(PluginConfiguration plugin) {

View File

@ -22,10 +22,10 @@ class SystemTrayManager with TrayListener {
if (enabled) {
await trayManager.setIcon(
kIsWindows
? 'assets/spotube-logo.ico'
? 'assets/branding/spotube-logo.ico'
: kIsFlatpak
? 'com.github.KRTirtho.Spotube'
: 'assets/spotube-logo.png',
: 'assets/branding/spotube-logo.png',
);
trayManager.addListener(this);
} else {

View File

@ -30,12 +30,8 @@ mixin _$SongLink {
String? get nativeAppUriMobile => throw _privateConstructorUsedError;
String? get nativeAppUriDesktop => throw _privateConstructorUsedError;
/// Serializes this SongLink to a JSON map.
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
/// Create a copy of SongLink
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@JsonKey(ignore: true)
$SongLinkCopyWith<SongLink> get copyWith =>
throw _privateConstructorUsedError;
}
@ -67,8 +63,6 @@ class _$SongLinkCopyWithImpl<$Res, $Val extends SongLink>
// ignore: unused_field
final $Res Function($Val) _then;
/// Create a copy of SongLink
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
@ -151,8 +145,6 @@ class __$$SongLinkImplCopyWithImpl<$Res>
_$SongLinkImpl _value, $Res Function(_$SongLinkImpl) _then)
: super(_value, _then);
/// Create a copy of SongLink
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
@ -269,14 +261,12 @@ class _$SongLinkImpl implements _SongLink {
other.nativeAppUriDesktop == nativeAppUriDesktop));
}
@JsonKey(includeFromJson: false, includeToJson: false)
@JsonKey(ignore: true)
@override
int get hashCode => Object.hash(runtimeType, displayName, linkId, platform,
show, uniqueId, country, url, nativeAppUriMobile, nativeAppUriDesktop);
/// Create a copy of SongLink
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@JsonKey(ignore: true)
@override
@pragma('vm:prefer-inline')
_$$SongLinkImplCopyWith<_$SongLinkImpl> get copyWith =>
@ -323,11 +313,8 @@ abstract class _SongLink implements SongLink {
String? get nativeAppUriMobile;
@override
String? get nativeAppUriDesktop;
/// Create a copy of SongLink
/// with the given fields replaced by the non-null parameter values.
@override
@JsonKey(includeFromJson: false, includeToJson: false)
@JsonKey(ignore: true)
_$$SongLinkImplCopyWith<_$SongLinkImpl> get copyWith =>
throw _privateConstructorUsedError;
}

View File

@ -37,7 +37,7 @@
<screenshots>
<screenshot type="default">
<image type="source">
https://rawcdn.githack.com/KRTirtho/spotube/refs/heads/master/assets/spotube-screenshot.png
https://rawcdn.githack.com/KRTirtho/spotube/refs/heads/master/assets/branding/spotube-screenshot.png
</image>
<caption>Spotube screenshot</caption>
</screenshot>

View File

@ -1,5 +1,5 @@
display_name: Spotube
icon: assets/spotube-logo.png
icon: assets/branding/spotube-logo.png
keywords:
- Music

View File

@ -30,7 +30,7 @@ suggested_dependencies:
- yt-dlp
essential: false
icon: assets/spotube-logo.png
icon: assets/branding/spotube-logo.png
keywords:
- Music

View File

@ -1,4 +1,4 @@
icon: assets/spotube-logo.png
icon: assets/branding/spotube-logo.png
summary: Lightweight cross-platform music client
group: Applications/Multimedia
vendor: Kingkor Roy Tirtho

View File

@ -1,5 +1,5 @@
title: Spotube
icon: assets/spotube-logo.png
icon: assets/branding/spotube-logo.png
contents:
- x: 448
y: 344

View File

@ -199,11 +199,10 @@ flutter:
generate: true
uses-material-design: true
assets:
- assets/
- assets/tutorial/
- assets/logos/
- assets/backgrounds/
- assets/patterns/
- assets/images/
- assets/images/logos/
- assets/branding/spotube-logo.png
- assets/branding/spotube-logo-light.png
- LICENSE
- packages/flutter_undraw/assets/undraw/access_denied.svg
- packages/flutter_undraw/assets/undraw/fixing_bugs.svg

Some files were not shown because too many files have changed in this diff Show More