chore: optimize assets and app size
2
Makefile
@ -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)
|
||||
|
@ -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
|
||||
|
@ -33,7 +33,7 @@ def composeVersion = "1.4.8"
|
||||
android {
|
||||
namespace "oss.krtirtho.spotube"
|
||||
|
||||
compileSdkVersion 35
|
||||
compileSdkVersion 36
|
||||
|
||||
ndkVersion = "27.0.12077973"
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"title": "Spotube",
|
||||
"icon": "assets/spotube-logo-macos.png",
|
||||
"icon": "assets/branding/spotube-logo-macos.png",
|
||||
"contents": [
|
||||
{
|
||||
"x": 448,
|
||||
|
Before Width: | Height: | Size: 176 KiB |
Before Width: | Height: | Size: 689 KiB |
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 70 KiB |
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 54 KiB |
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB |
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB |
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 39 KiB |
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
Before Width: | Height: | Size: 790 KiB After Width: | Height: | Size: 790 KiB |
Before Width: | Height: | Size: 771 KiB After Width: | Height: | Size: 771 KiB |
Before Width: | Height: | Size: 191 KiB After Width: | Height: | Size: 191 KiB |
Before Width: | Height: | Size: 1.4 MiB After Width: | Height: | Size: 1.4 MiB |
Before Width: | Height: | Size: 94 KiB After Width: | Height: | Size: 94 KiB |
Before Width: | Height: | Size: 435 KiB After Width: | Height: | Size: 435 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 9.4 KiB |
Before Width: | Height: | Size: 144 KiB After Width: | Height: | Size: 144 KiB |
Before Width: | Height: | Size: 351 KiB After Width: | Height: | Size: 351 KiB |
Before Width: | Height: | Size: 1.4 MiB After Width: | Height: | Size: 1.4 MiB |
Before Width: | Height: | Size: 241 KiB After Width: | Height: | Size: 241 KiB |
Before Width: | Height: | Size: 531 KiB After Width: | Height: | Size: 531 KiB |
Before Width: | Height: | Size: 158 KiB After Width: | Height: | Size: 158 KiB |
Before Width: | Height: | Size: 396 KiB After Width: | Height: | Size: 396 KiB |
Before Width: | Height: | Size: 1006 KiB After Width: | Height: | Size: 1006 KiB |
Before Width: | Height: | Size: 156 KiB After Width: | Height: | Size: 156 KiB |
Before Width: | Height: | Size: 137 KiB After Width: | Height: | Size: 137 KiB |
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 383 KiB After Width: | Height: | Size: 383 KiB |
Before Width: | Height: | Size: 167 KiB |
Before Width: | Height: | Size: 94 KiB After Width: | Height: | Size: 94 KiB |
BIN
assets/images/bengali-patterns-bg.jpg
Normal file
After Width: | Height: | Size: 285 KiB |
BIN
assets/images/liked-tracks.jpg
Normal file
After Width: | Height: | Size: 8.1 KiB |
BIN
assets/images/logos/invidious.jpg
Normal file
After Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
BIN
assets/images/logos/songlink-transparent.png
Normal file
After Width: | Height: | Size: 8.6 KiB |
Before Width: | Height: | Size: 8.7 KiB After Width: | Height: | Size: 8.7 KiB |
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 47 KiB |
Before Width: | Height: | Size: 98 KiB |
Before Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 72 KiB |
Before Width: | Height: | Size: 86 KiB |
Before Width: | Height: | Size: 336 KiB |
Before Width: | Height: | Size: 78 KiB |
Before Width: | Height: | Size: 498 KiB |
Before Width: | Height: | Size: 33 KiB |
Before Width: | Height: | Size: 40 KiB |
Before Width: | Height: | Size: 172 KiB |
Before Width: | Height: | Size: 141 KiB |
Before Width: | Height: | Size: 158 KiB |
Before Width: | Height: | Size: 180 KiB |
Before Width: | Height: | Size: 50 KiB |
Before Width: | Height: | Size: 167 KiB |
Before Width: | Height: | Size: 69 KiB |
Before Width: | Height: | Size: 51 KiB |
Before Width: | Height: | Size: 49 KiB |
Before Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 149 KiB |
Before Width: | Height: | Size: 137 KiB |
@ -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>
|
||||
|
@ -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"),
|
||||
);
|
||||
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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 {
|
||||
|
@ -18,4 +18,7 @@ class FontFamily {
|
||||
|
||||
/// Font family: RadixIcons
|
||||
static const String radixIcons = 'RadixIcons';
|
||||
|
||||
/// Font family: Ubuntu Mono
|
||||
static const String ubuntuMono = 'Ubuntu Mono';
|
||||
}
|
||||
|
@ -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(),
|
||||
|
@ -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),
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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",
|
||||
};
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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,
|
||||
),
|
||||
),
|
||||
|
@ -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,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
@ -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,
|
||||
),
|
||||
),
|
||||
|
@ -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],
|
||||
);
|
||||
|
||||
|
@ -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(),
|
||||
),
|
||||
|
@ -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,
|
||||
),
|
||||
),
|
||||
|
@ -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),
|
||||
|
@ -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 {
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
)
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
),
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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>
|
||||
|
@ -1,5 +1,5 @@
|
||||
display_name: Spotube
|
||||
icon: assets/spotube-logo.png
|
||||
icon: assets/branding/spotube-logo.png
|
||||
|
||||
keywords:
|
||||
- Music
|
||||
|
@ -30,7 +30,7 @@ suggested_dependencies:
|
||||
- yt-dlp
|
||||
|
||||
essential: false
|
||||
icon: assets/spotube-logo.png
|
||||
icon: assets/branding/spotube-logo.png
|
||||
|
||||
keywords:
|
||||
- Music
|
||||
|
@ -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
|
||||
|
@ -1,5 +1,5 @@
|
||||
title: Spotube
|
||||
icon: assets/spotube-logo.png
|
||||
icon: assets/branding/spotube-logo.png
|
||||
contents:
|
||||
- x: 448
|
||||
y: 344
|
||||
|
@ -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
|
||||
|
@ -20,7 +20,7 @@ Compression=lzma
|
||||
SolidCompression=yes
|
||||
SetupIconFile={{SETUP_ICON_FILE}}
|
||||
WizardStyle=modern
|
||||
WizardSmallImageFile="..\\..\\assets\\spotube-logo.bmp"
|
||||
WizardSmallImageFile="..\\..\\assets\\branding\\spotube-logo.bmp"
|
||||
PrivilegesRequired={{PRIVILEGES_REQUIRED}}
|
||||
ArchitecturesAllowed=x64compatible
|
||||
ArchitecturesInstallIn64BitMode=x64compatible
|
||||
|