Compare commits

...

11 Commits

Author SHA1 Message Date
Alex
f0028623cd
Merge 69d35aa2d9 into 9d005c8c38 2025-04-24 12:47:59 +00:00
alessio
69d35aa2d9 refactor: add new_icon in code 2025-04-24 14:46:38 +02:00
AleAtDev
62534f0ae6
Merge pull request #1 from AleAtDev/refactor/new-icons
Refactor/new icons
2025-04-24 00:21:04 +02:00
Kingkor Roy Tirtho
ba27dc70e4
Merge pull request #2550 from KRTirtho/dev
Release 4.0.2
2025-03-16 23:57:54 +06:00
Kingkor Roy Tirtho
723b6b1f38
Merge pull request #2524 from KRTirtho/dev
Release 4.0.1
2025-03-15 17:21:27 +06:00
Kingkor Roy Tirtho
464666c01a
Merge pull request #2410 from KRTirtho/dev
chore: update linux appdata screenshot
2025-03-07 20:22:32 +06:00
Kingkor Roy Tirtho
0e58cd0e99
Merge pull request #2408 from KRTirtho/dev
chore: add new images
2025-03-07 20:18:03 +06:00
Kingkor Roy Tirtho
d4f70f56e4
Merge pull request #2405 from KRTirtho/dev
Release 4.0.0
2025-03-07 18:05:55 +06: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
30 changed files with 339 additions and 554 deletions

View File

@ -4,8 +4,8 @@
# This file should be version controlled and should not be manually edited. # This file should be version controlled and should not be manually edited.
version: version:
revision: "300451adae589accbece3490f4396f10bdf15e6e" revision: "ea121f8859e4b13e47a8f845e4586164519588bc"
channel: "stable" channel: "[user-branch]"
project_type: app project_type: app
@ -13,11 +13,26 @@ project_type: app
migration: migration:
platforms: platforms:
- platform: root - platform: root
create_revision: 300451adae589accbece3490f4396f10bdf15e6e create_revision: ea121f8859e4b13e47a8f845e4586164519588bc
base_revision: 300451adae589accbece3490f4396f10bdf15e6e base_revision: ea121f8859e4b13e47a8f845e4586164519588bc
- platform: android
create_revision: ea121f8859e4b13e47a8f845e4586164519588bc
base_revision: ea121f8859e4b13e47a8f845e4586164519588bc
- platform: ios
create_revision: ea121f8859e4b13e47a8f845e4586164519588bc
base_revision: ea121f8859e4b13e47a8f845e4586164519588bc
- platform: linux
create_revision: ea121f8859e4b13e47a8f845e4586164519588bc
base_revision: ea121f8859e4b13e47a8f845e4586164519588bc
- platform: macos
create_revision: ea121f8859e4b13e47a8f845e4586164519588bc
base_revision: ea121f8859e4b13e47a8f845e4586164519588bc
- platform: web
create_revision: ea121f8859e4b13e47a8f845e4586164519588bc
base_revision: ea121f8859e4b13e47a8f845e4586164519588bc
- platform: windows - platform: windows
create_revision: 300451adae589accbece3490f4396f10bdf15e6e create_revision: ea121f8859e4b13e47a8f845e4586164519588bc
base_revision: 300451adae589accbece3490f4396f10bdf15e6e base_revision: ea121f8859e4b13e47a8f845e4586164519588bc
# User provided section # User provided section

View File

@ -0,0 +1,44 @@
plugins {
id("com.android.application")
id("kotlin-android")
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
id("dev.flutter.flutter-gradle-plugin")
}
android {
namespace = "oss.krtirtho.spotube"
compileSdk = flutter.compileSdkVersion
ndkVersion = flutter.ndkVersion
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_11.toString()
}
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId = "oss.krtirtho.spotube"
// You can update the following values to match your application needs.
// For more information, see: https://flutter.dev/to/review-gradle-config.
minSdk = flutter.minSdkVersion
targetSdk = flutter.targetSdkVersion
versionCode = flutter.versionCode
versionName = flutter.versionName
}
buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig = signingConfigs.getByName("debug")
}
}
}
flutter {
source = "../.."
}

21
android/build.gradle.kts Normal file
View File

@ -0,0 +1,21 @@
allprojects {
repositories {
google()
mavenCentral()
}
}
val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get()
rootProject.layout.buildDirectory.value(newBuildDir)
subprojects {
val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name)
project.layout.buildDirectory.value(newSubprojectBuildDir)
}
subprojects {
project.evaluationDependsOn(":app")
}
tasks.register<Delete>("clean") {
delete(rootProject.layout.buildDirectory)
}

View File

@ -0,0 +1,25 @@
pluginManagement {
val flutterSdkPath = run {
val properties = java.util.Properties()
file("local.properties").inputStream().use { properties.load(it) }
val flutterSdkPath = properties.getProperty("flutter.sdk")
require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" }
flutterSdkPath
}
includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}
plugins {
id("dev.flutter.flutter-plugin-loader") version "1.0.0"
id("com.android.application") version "8.7.0" apply false
id("org.jetbrains.kotlin.android") version "1.8.22" apply false
}
include(":app")

View File

@ -0,0 +1,12 @@
import Flutter
import UIKit
import XCTest
class RunnerTests: XCTestCase {
func testExample() {
// If you add code to the Runner application, consider adding tests here.
// See https://developer.apple.com/documentation/xctest for more information about using XCTest.
}
}

View File

@ -150,35 +150,27 @@ class Assets {
AssetGenImage('assets/placeholder.png'); AssetGenImage('assets/placeholder.png');
static const AssetGenImage spotubeHeroBanner = static const AssetGenImage spotubeHeroBanner =
AssetGenImage('assets/spotube-hero-banner.png'); AssetGenImage('assets/spotube-hero-banner.png');
static const AssetGenImage spotubeLogoForeground = static const AssetGenImage spotubeIconRounded =
AssetGenImage('assets/spotube-logo-foreground.jpg'); AssetGenImage('assets/spotube-icon-rounded.png');
static const AssetGenImage spotubeIcon =
AssetGenImage('assets/spotube-icon.png');
static const AssetGenImage spotubeLogoMacos = static const AssetGenImage spotubeLogoMacos =
AssetGenImage('assets/spotube-logo-macos.png'); AssetGenImage('assets/spotube-logo-macos.png');
static const AssetGenImage spotubeLogoBmp = static const AssetGenImage spotubeLogoNotWallpaper =
AssetGenImage('assets/spotube-logo.bmp'); AssetGenImage('assets/spotube-logo-notWallpaper.png');
static const String spotubeLogoIco = 'assets/spotube-logo.ico'; static const AssetGenImage spotubeLogoRounded =
static const AssetGenImage spotubeLogoPng = AssetGenImage('assets/spotube-logo-rounded.png');
AssetGenImage('assets/spotube-logo.png');
static const String spotubeLogoSvg = 'assets/spotube-logo.svg';
static const AssetGenImage spotubeLogoAndroid12 = static const AssetGenImage spotubeLogoAndroid12 =
AssetGenImage('assets/spotube-logo_android12.png'); AssetGenImage('assets/spotube-logo_android12.png');
static const AssetGenImage spotubeNightlyLogoForeground = static const AssetGenImage spotubeNightlyNotWallpaper =
AssetGenImage('assets/spotube-nightly-logo-foreground.jpg'); AssetGenImage('assets/spotube-nightly-notWallpaper.png');
static const AssetGenImage spotubeNightlyLogoPng = static const AssetGenImage spotubeNightlyRounded =
AssetGenImage('assets/spotube-nightly-logo.png'); AssetGenImage('assets/spotube-nightly-rounded.png');
static const String spotubeNightlyLogoSvg = 'assets/spotube-nightly-logo.svg'; static const AssetGenImage spotubeNightlyPng =
static const AssetGenImage spotubeNightlyLogoAndroid12 = AssetGenImage('assets/spotube-nightly.png');
AssetGenImage('assets/spotube-nightly-logo_android12.png'); static const String spotubeNightlySvg = 'assets/spotube-nightly.svg';
static const AssetGenImage spotubeScreenshot = static const AssetGenImage spotubeScreenshot =
AssetGenImage('assets/spotube-screenshot.png'); 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 AssetGenImage success = AssetGenImage('assets/success.png');
static const $AssetsTutorialGen tutorial = $AssetsTutorialGen(); static const $AssetsTutorialGen tutorial = $AssetsTutorialGen();
static const AssetGenImage userPlaceholder = static const AssetGenImage userPlaceholder =
@ -196,22 +188,17 @@ class Assets {
likedTracks, likedTracks,
placeholder, placeholder,
spotubeHeroBanner, spotubeHeroBanner,
spotubeLogoForeground, spotubeIconRounded,
spotubeIcon,
spotubeLogoMacos, spotubeLogoMacos,
spotubeLogoBmp, spotubeLogoNotWallpaper,
spotubeLogoIco, spotubeLogoRounded,
spotubeLogoPng,
spotubeLogoSvg,
spotubeLogoAndroid12, spotubeLogoAndroid12,
spotubeNightlyLogoForeground, spotubeNightlyNotWallpaper,
spotubeNightlyLogoPng, spotubeNightlyRounded,
spotubeNightlyLogoSvg, spotubeNightlyPng,
spotubeNightlyLogoAndroid12, spotubeNightlySvg,
spotubeScreenshot, spotubeScreenshot,
spotubeTallCapsule,
spotubeWideCapsuleLarge,
spotubeWideCapsuleSmall,
spotubeBanner,
success, success,
userPlaceholder userPlaceholder
]; ];

View File

@ -19,7 +19,7 @@ abstract class Env {
@EnviedField(varName: 'LASTFM_API_SECRET') @EnviedField(varName: 'LASTFM_API_SECRET')
static final String lastFmApiSecret = _Env.lastFmApiSecret; static final String lastFmApiSecret = _Env.lastFmApiSecret;
@EnviedField(varName: 'HIDE_DONATIONS', defaultValue: "0") @EnviedField(varName: 'HIDE_DONATIONS', defaultValue: 0)
static final int _hideDonations = _Env._hideDonations; static final int _hideDonations = _Env._hideDonations;
static bool get hideDonations => _hideDonations == 1; static bool get hideDonations => _hideDonations == 1;
@ -32,23 +32,23 @@ abstract class Env {
}; };
}).toList(); }).toList();
@EnviedField(varName: 'ENABLE_UPDATE_CHECK', defaultValue: "1") @EnviedField(varName: 'ENABLE_UPDATE_CHECK', defaultValue: 1)
static final String _enableUpdateChecker = _Env._enableUpdateChecker; static final String _enableUpdateChecker = _Env._enableUpdateChecker;
@EnviedField(varName: "RELEASE_CHANNEL", defaultValue: "nightly") @EnviedField(varName: "RELEASE_CHANNEL", defaultValue: "nightly")
static final String _releaseChannel = _Env._releaseChannel; static final String _releaseChannel = _Env._releaseChannel;
@EnviedField(varName: "DISABLE_SPOTIFY_IMAGES", defaultValue: "0") @EnviedField(varName: "DISABLE_SPOTIFY_IMAGES", defaultValue: 0)
static final String _disableSpotifyImages = _Env._disableSpotifyImages; static final String _disableSpotifyImages = _Env._disableSpotifyImages;
static bool get disableSpotifyImages => _disableSpotifyImages == "1"; static bool get disableSpotifyImages => _disableSpotifyImages == 1;
static ReleaseChannel get releaseChannel => _releaseChannel == "stable" static ReleaseChannel get releaseChannel => _releaseChannel == "stable"
? ReleaseChannel.stable ? ReleaseChannel.stable
: ReleaseChannel.nightly; : ReleaseChannel.nightly;
static bool get enableUpdateChecker => static bool get enableUpdateChecker =>
kIsFlatpak || _enableUpdateChecker == "1"; kIsFlatpak || _enableUpdateChecker == 1;
static String discordAppId = "1176718791388975124"; static String discordAppId = "1176718791388975124";
} }

View File

@ -99,13 +99,8 @@ mixin _$WebSocketLoadEventData {
required TResult orElse(), required TResult orElse(),
}) => }) =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
/// Serializes this WebSocketLoadEventData to a JSON map.
Map<String, dynamic> toJson() => throw _privateConstructorUsedError; Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
@JsonKey(ignore: true)
/// Create a copy of WebSocketLoadEventData
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$WebSocketLoadEventDataCopyWith<WebSocketLoadEventData> get copyWith => $WebSocketLoadEventDataCopyWith<WebSocketLoadEventData> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
} }
@ -132,8 +127,6 @@ class _$WebSocketLoadEventDataCopyWithImpl<$Res,
// ignore: unused_field // ignore: unused_field
final $Res Function($Val) _then; 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') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -178,8 +171,6 @@ class __$$WebSocketLoadEventDataPlaylistImplCopyWithImpl<$Res>
$Res Function(_$WebSocketLoadEventDataPlaylistImpl) _then) $Res Function(_$WebSocketLoadEventDataPlaylistImpl) _then)
: super(_value, _then); : super(_value, _then);
/// Create a copy of WebSocketLoadEventData
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -256,14 +247,12 @@ class _$WebSocketLoadEventDataPlaylistImpl
other.initialIndex == initialIndex)); other.initialIndex == initialIndex));
} }
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(ignore: true)
@override @override
int get hashCode => Object.hash(runtimeType, int get hashCode => Object.hash(runtimeType,
const DeepCollectionEquality().hash(_tracks), collection, initialIndex); const DeepCollectionEquality().hash(_tracks), collection, initialIndex);
/// Create a copy of WebSocketLoadEventData @JsonKey(ignore: true)
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override @override
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
_$$WebSocketLoadEventDataPlaylistImplCopyWith< _$$WebSocketLoadEventDataPlaylistImplCopyWith<
@ -383,11 +372,8 @@ abstract class WebSocketLoadEventDataPlaylist extends WebSocketLoadEventData {
PlaylistSimple? get collection; PlaylistSimple? get collection;
@override @override
int? get initialIndex; int? get initialIndex;
/// Create a copy of WebSocketLoadEventData
/// with the given fields replaced by the non-null parameter values.
@override @override
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(ignore: true)
_$$WebSocketLoadEventDataPlaylistImplCopyWith< _$$WebSocketLoadEventDataPlaylistImplCopyWith<
_$WebSocketLoadEventDataPlaylistImpl> _$WebSocketLoadEventDataPlaylistImpl>
get copyWith => throw _privateConstructorUsedError; get copyWith => throw _privateConstructorUsedError;
@ -418,8 +404,6 @@ class __$$WebSocketLoadEventDataAlbumImplCopyWithImpl<$Res>
$Res Function(_$WebSocketLoadEventDataAlbumImpl) _then) $Res Function(_$WebSocketLoadEventDataAlbumImpl) _then)
: super(_value, _then); : super(_value, _then);
/// Create a copy of WebSocketLoadEventData
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -495,14 +479,12 @@ class _$WebSocketLoadEventDataAlbumImpl extends WebSocketLoadEventDataAlbum {
other.initialIndex == initialIndex)); other.initialIndex == initialIndex));
} }
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(ignore: true)
@override @override
int get hashCode => Object.hash(runtimeType, int get hashCode => Object.hash(runtimeType,
const DeepCollectionEquality().hash(_tracks), collection, initialIndex); const DeepCollectionEquality().hash(_tracks), collection, initialIndex);
/// Create a copy of WebSocketLoadEventData @JsonKey(ignore: true)
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override @override
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
_$$WebSocketLoadEventDataAlbumImplCopyWith<_$WebSocketLoadEventDataAlbumImpl> _$$WebSocketLoadEventDataAlbumImplCopyWith<_$WebSocketLoadEventDataAlbumImpl>
@ -621,11 +603,8 @@ abstract class WebSocketLoadEventDataAlbum extends WebSocketLoadEventData {
AlbumSimple? get collection; AlbumSimple? get collection;
@override @override
int? get initialIndex; int? get initialIndex;
/// Create a copy of WebSocketLoadEventData
/// with the given fields replaced by the non-null parameter values.
@override @override
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(ignore: true)
_$$WebSocketLoadEventDataAlbumImplCopyWith<_$WebSocketLoadEventDataAlbumImpl> _$$WebSocketLoadEventDataAlbumImplCopyWith<_$WebSocketLoadEventDataAlbumImpl>
get copyWith => throw _privateConstructorUsedError; get copyWith => throw _privateConstructorUsedError;
} }

View File

@ -5964,7 +5964,8 @@ final class $$PlaylistTableTableReferences extends BaseReferences<_$AppDatabase,
db.audioPlayerStateTable.createAlias($_aliasNameGenerator( db.audioPlayerStateTable.createAlias($_aliasNameGenerator(
db.playlistTable.audioPlayerStateId, db.audioPlayerStateTable.id)); db.playlistTable.audioPlayerStateId, db.audioPlayerStateTable.id));
$$AudioPlayerStateTableTableProcessedTableManager get audioPlayerStateId { $$AudioPlayerStateTableTableProcessedTableManager? get audioPlayerStateId {
if ($_item.audioPlayerStateId == null) return null;
final manager = $$AudioPlayerStateTableTableTableManager( final manager = $$AudioPlayerStateTableTableTableManager(
$_db, $_db.audioPlayerStateTable) $_db, $_db.audioPlayerStateTable)
.filter((f) => f.id($_item.audioPlayerStateId!)); .filter((f) => f.id($_item.audioPlayerStateId!));
@ -6290,7 +6291,8 @@ final class $$PlaylistMediaTableTableReferences extends BaseReferences<
db.playlistTable.createAlias($_aliasNameGenerator( db.playlistTable.createAlias($_aliasNameGenerator(
db.playlistMediaTable.playlistId, db.playlistTable.id)); db.playlistMediaTable.playlistId, db.playlistTable.id));
$$PlaylistTableTableProcessedTableManager get playlistId { $$PlaylistTableTableProcessedTableManager? get playlistId {
if ($_item.playlistId == null) return null;
final manager = $$PlaylistTableTableTableManager($_db, $_db.playlistTable) final manager = $$PlaylistTableTableTableManager($_db, $_db.playlistTable)
.filter((f) => f.id($_item.playlistId!)); .filter((f) => f.id($_item.playlistId!));
final item = $_typedResult.readTableOrNull(_playlistIdTable($_db)); final item = $_typedResult.readTableOrNull(_playlistIdTable($_db));

View File

@ -29,12 +29,8 @@ mixin _$SpotifySectionPlaylist {
String get owner => throw _privateConstructorUsedError; String get owner => throw _privateConstructorUsedError;
String get uri => throw _privateConstructorUsedError; String get uri => throw _privateConstructorUsedError;
/// Serializes this SpotifySectionPlaylist to a JSON map.
Map<String, dynamic> toJson() => throw _privateConstructorUsedError; Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
@JsonKey(ignore: true)
/// Create a copy of SpotifySectionPlaylist
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$SpotifySectionPlaylistCopyWith<SpotifySectionPlaylist> get copyWith => $SpotifySectionPlaylistCopyWith<SpotifySectionPlaylist> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
} }
@ -65,8 +61,6 @@ class _$SpotifySectionPlaylistCopyWithImpl<$Res,
// ignore: unused_field // ignore: unused_field
final $Res Function($Val) _then; final $Res Function($Val) _then;
/// Create a copy of SpotifySectionPlaylist
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -134,8 +128,6 @@ class __$$SpotifySectionPlaylistImplCopyWithImpl<$Res>
$Res Function(_$SpotifySectionPlaylistImpl) _then) $Res Function(_$SpotifySectionPlaylistImpl) _then)
: super(_value, _then); : super(_value, _then);
/// Create a copy of SpotifySectionPlaylist
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -229,14 +221,12 @@ class _$SpotifySectionPlaylistImpl extends _SpotifySectionPlaylist {
(identical(other.uri, uri) || other.uri == uri)); (identical(other.uri, uri) || other.uri == uri));
} }
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(ignore: true)
@override @override
int get hashCode => Object.hash(runtimeType, description, format, int get hashCode => Object.hash(runtimeType, description, format,
const DeepCollectionEquality().hash(_images), name, owner, uri); const DeepCollectionEquality().hash(_images), name, owner, uri);
/// Create a copy of SpotifySectionPlaylist @JsonKey(ignore: true)
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override @override
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
_$$SpotifySectionPlaylistImplCopyWith<_$SpotifySectionPlaylistImpl> _$$SpotifySectionPlaylistImplCopyWith<_$SpotifySectionPlaylistImpl>
@ -276,11 +266,8 @@ abstract class _SpotifySectionPlaylist extends SpotifySectionPlaylist {
String get owner; String get owner;
@override @override
String get uri; String get uri;
/// Create a copy of SpotifySectionPlaylist
/// with the given fields replaced by the non-null parameter values.
@override @override
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(ignore: true)
_$$SpotifySectionPlaylistImplCopyWith<_$SpotifySectionPlaylistImpl> _$$SpotifySectionPlaylistImplCopyWith<_$SpotifySectionPlaylistImpl>
get copyWith => throw _privateConstructorUsedError; get copyWith => throw _privateConstructorUsedError;
} }
@ -296,12 +283,8 @@ mixin _$SpotifySectionArtist {
List<SpotifySectionItemImage> get images => List<SpotifySectionItemImage> get images =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
/// Serializes this SpotifySectionArtist to a JSON map.
Map<String, dynamic> toJson() => throw _privateConstructorUsedError; Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
@JsonKey(ignore: true)
/// Create a copy of SpotifySectionArtist
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$SpotifySectionArtistCopyWith<SpotifySectionArtist> get copyWith => $SpotifySectionArtistCopyWith<SpotifySectionArtist> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
} }
@ -326,8 +309,6 @@ class _$SpotifySectionArtistCopyWithImpl<$Res,
// ignore: unused_field // ignore: unused_field
final $Res Function($Val) _then; final $Res Function($Val) _then;
/// Create a copy of SpotifySectionArtist
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -371,8 +352,6 @@ class __$$SpotifySectionArtistImplCopyWithImpl<$Res>
$Res Function(_$SpotifySectionArtistImpl) _then) $Res Function(_$SpotifySectionArtistImpl) _then)
: super(_value, _then); : super(_value, _then);
/// Create a copy of SpotifySectionArtist
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -437,14 +416,12 @@ class _$SpotifySectionArtistImpl extends _SpotifySectionArtist {
const DeepCollectionEquality().equals(other._images, _images)); const DeepCollectionEquality().equals(other._images, _images));
} }
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(ignore: true)
@override @override
int get hashCode => Object.hash( int get hashCode => Object.hash(
runtimeType, name, uri, const DeepCollectionEquality().hash(_images)); runtimeType, name, uri, const DeepCollectionEquality().hash(_images));
/// Create a copy of SpotifySectionArtist @JsonKey(ignore: true)
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override @override
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
_$$SpotifySectionArtistImplCopyWith<_$SpotifySectionArtistImpl> _$$SpotifySectionArtistImplCopyWith<_$SpotifySectionArtistImpl>
@ -477,11 +454,8 @@ abstract class _SpotifySectionArtist extends SpotifySectionArtist {
String get uri; String get uri;
@override @override
List<SpotifySectionItemImage> get images; List<SpotifySectionItemImage> get images;
/// Create a copy of SpotifySectionArtist
/// with the given fields replaced by the non-null parameter values.
@override @override
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(ignore: true)
_$$SpotifySectionArtistImplCopyWith<_$SpotifySectionArtistImpl> _$$SpotifySectionArtistImplCopyWith<_$SpotifySectionArtistImpl>
get copyWith => throw _privateConstructorUsedError; get copyWith => throw _privateConstructorUsedError;
} }
@ -499,12 +473,8 @@ mixin _$SpotifySectionAlbum {
String get name => throw _privateConstructorUsedError; String get name => throw _privateConstructorUsedError;
String get uri => throw _privateConstructorUsedError; String get uri => throw _privateConstructorUsedError;
/// Serializes this SpotifySectionAlbum to a JSON map.
Map<String, dynamic> toJson() => throw _privateConstructorUsedError; Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
@JsonKey(ignore: true)
/// Create a copy of SpotifySectionAlbum
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$SpotifySectionAlbumCopyWith<SpotifySectionAlbum> get copyWith => $SpotifySectionAlbumCopyWith<SpotifySectionAlbum> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
} }
@ -532,8 +502,6 @@ class _$SpotifySectionAlbumCopyWithImpl<$Res, $Val extends SpotifySectionAlbum>
// ignore: unused_field // ignore: unused_field
final $Res Function($Val) _then; final $Res Function($Val) _then;
/// Create a copy of SpotifySectionAlbum
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -586,8 +554,6 @@ class __$$SpotifySectionAlbumImplCopyWithImpl<$Res>
$Res Function(_$SpotifySectionAlbumImpl) _then) $Res Function(_$SpotifySectionAlbumImpl) _then)
: super(_value, _then); : super(_value, _then);
/// Create a copy of SpotifySectionAlbum
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -669,7 +635,7 @@ class _$SpotifySectionAlbumImpl extends _SpotifySectionAlbum {
(identical(other.uri, uri) || other.uri == uri)); (identical(other.uri, uri) || other.uri == uri));
} }
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(ignore: true)
@override @override
int get hashCode => Object.hash( int get hashCode => Object.hash(
runtimeType, runtimeType,
@ -678,9 +644,7 @@ class _$SpotifySectionAlbumImpl extends _SpotifySectionAlbum {
name, name,
uri); uri);
/// Create a copy of SpotifySectionAlbum @JsonKey(ignore: true)
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override @override
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
_$$SpotifySectionAlbumImplCopyWith<_$SpotifySectionAlbumImpl> get copyWith => _$$SpotifySectionAlbumImplCopyWith<_$SpotifySectionAlbumImpl> get copyWith =>
@ -714,11 +678,8 @@ abstract class _SpotifySectionAlbum extends SpotifySectionAlbum {
String get name; String get name;
@override @override
String get uri; String get uri;
/// Create a copy of SpotifySectionAlbum
/// with the given fields replaced by the non-null parameter values.
@override @override
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(ignore: true)
_$$SpotifySectionAlbumImplCopyWith<_$SpotifySectionAlbumImpl> get copyWith => _$$SpotifySectionAlbumImplCopyWith<_$SpotifySectionAlbumImpl> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
} }
@ -733,12 +694,8 @@ mixin _$SpotifySectionAlbumArtist {
String get name => throw _privateConstructorUsedError; String get name => throw _privateConstructorUsedError;
String get uri => throw _privateConstructorUsedError; String get uri => throw _privateConstructorUsedError;
/// Serializes this SpotifySectionAlbumArtist to a JSON map.
Map<String, dynamic> toJson() => throw _privateConstructorUsedError; Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
@JsonKey(ignore: true)
/// Create a copy of SpotifySectionAlbumArtist
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$SpotifySectionAlbumArtistCopyWith<SpotifySectionAlbumArtist> get copyWith => $SpotifySectionAlbumArtistCopyWith<SpotifySectionAlbumArtist> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
} }
@ -763,8 +720,6 @@ class _$SpotifySectionAlbumArtistCopyWithImpl<$Res,
// ignore: unused_field // ignore: unused_field
final $Res Function($Val) _then; final $Res Function($Val) _then;
/// Create a copy of SpotifySectionAlbumArtist
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -806,8 +761,6 @@ class __$$SpotifySectionAlbumArtistImplCopyWithImpl<$Res>
$Res Function(_$SpotifySectionAlbumArtistImpl) _then) $Res Function(_$SpotifySectionAlbumArtistImpl) _then)
: super(_value, _then); : super(_value, _then);
/// Create a copy of SpotifySectionAlbumArtist
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -855,13 +808,11 @@ class _$SpotifySectionAlbumArtistImpl extends _SpotifySectionAlbumArtist {
(identical(other.uri, uri) || other.uri == uri)); (identical(other.uri, uri) || other.uri == uri));
} }
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(ignore: true)
@override @override
int get hashCode => Object.hash(runtimeType, name, uri); int get hashCode => Object.hash(runtimeType, name, uri);
/// Create a copy of SpotifySectionAlbumArtist @JsonKey(ignore: true)
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override @override
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
_$$SpotifySectionAlbumArtistImplCopyWith<_$SpotifySectionAlbumArtistImpl> _$$SpotifySectionAlbumArtistImplCopyWith<_$SpotifySectionAlbumArtistImpl>
@ -889,11 +840,8 @@ abstract class _SpotifySectionAlbumArtist extends SpotifySectionAlbumArtist {
String get name; String get name;
@override @override
String get uri; String get uri;
/// Create a copy of SpotifySectionAlbumArtist
/// with the given fields replaced by the non-null parameter values.
@override @override
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(ignore: true)
_$$SpotifySectionAlbumArtistImplCopyWith<_$SpotifySectionAlbumArtistImpl> _$$SpotifySectionAlbumArtistImplCopyWith<_$SpotifySectionAlbumArtistImpl>
get copyWith => throw _privateConstructorUsedError; get copyWith => throw _privateConstructorUsedError;
} }
@ -909,12 +857,8 @@ mixin _$SpotifySectionItemImage {
String get url => throw _privateConstructorUsedError; String get url => throw _privateConstructorUsedError;
num? get width => throw _privateConstructorUsedError; num? get width => throw _privateConstructorUsedError;
/// Serializes this SpotifySectionItemImage to a JSON map.
Map<String, dynamic> toJson() => throw _privateConstructorUsedError; Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
@JsonKey(ignore: true)
/// Create a copy of SpotifySectionItemImage
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$SpotifySectionItemImageCopyWith<SpotifySectionItemImage> get copyWith => $SpotifySectionItemImageCopyWith<SpotifySectionItemImage> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
} }
@ -939,8 +883,6 @@ class _$SpotifySectionItemImageCopyWithImpl<$Res,
// ignore: unused_field // ignore: unused_field
final $Res Function($Val) _then; final $Res Function($Val) _then;
/// Create a copy of SpotifySectionItemImage
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -987,8 +929,6 @@ class __$$SpotifySectionItemImageImplCopyWithImpl<$Res>
$Res Function(_$SpotifySectionItemImageImpl) _then) $Res Function(_$SpotifySectionItemImageImpl) _then)
: super(_value, _then); : super(_value, _then);
/// Create a copy of SpotifySectionItemImage
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -1045,13 +985,11 @@ class _$SpotifySectionItemImageImpl extends _SpotifySectionItemImage {
(identical(other.width, width) || other.width == width)); (identical(other.width, width) || other.width == width));
} }
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(ignore: true)
@override @override
int get hashCode => Object.hash(runtimeType, height, url, width); int get hashCode => Object.hash(runtimeType, height, url, width);
/// Create a copy of SpotifySectionItemImage @JsonKey(ignore: true)
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override @override
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
_$$SpotifySectionItemImageImplCopyWith<_$SpotifySectionItemImageImpl> _$$SpotifySectionItemImageImplCopyWith<_$SpotifySectionItemImageImpl>
@ -1082,11 +1020,8 @@ abstract class _SpotifySectionItemImage extends SpotifySectionItemImage {
String get url; String get url;
@override @override
num? get width; num? get width;
/// Create a copy of SpotifySectionItemImage
/// with the given fields replaced by the non-null parameter values.
@override @override
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(ignore: true)
_$$SpotifySectionItemImageImplCopyWith<_$SpotifySectionItemImageImpl> _$$SpotifySectionItemImageImplCopyWith<_$SpotifySectionItemImageImpl>
get copyWith => throw _privateConstructorUsedError; get copyWith => throw _privateConstructorUsedError;
} }
@ -1103,12 +1038,8 @@ mixin _$SpotifyHomeFeedSectionItem {
SpotifySectionArtist? get artist => throw _privateConstructorUsedError; SpotifySectionArtist? get artist => throw _privateConstructorUsedError;
SpotifySectionAlbum? get album => throw _privateConstructorUsedError; SpotifySectionAlbum? get album => throw _privateConstructorUsedError;
/// Serializes this SpotifyHomeFeedSectionItem to a JSON map.
Map<String, dynamic> toJson() => throw _privateConstructorUsedError; Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
@JsonKey(ignore: true)
/// Create a copy of SpotifyHomeFeedSectionItem
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$SpotifyHomeFeedSectionItemCopyWith<SpotifyHomeFeedSectionItem> $SpotifyHomeFeedSectionItemCopyWith<SpotifyHomeFeedSectionItem>
get copyWith => throw _privateConstructorUsedError; get copyWith => throw _privateConstructorUsedError;
} }
@ -1142,8 +1073,6 @@ class _$SpotifyHomeFeedSectionItemCopyWithImpl<$Res,
// ignore: unused_field // ignore: unused_field
final $Res Function($Val) _then; final $Res Function($Val) _then;
/// Create a copy of SpotifyHomeFeedSectionItem
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -1172,8 +1101,6 @@ class _$SpotifyHomeFeedSectionItemCopyWithImpl<$Res,
) as $Val); ) as $Val);
} }
/// Create a copy of SpotifyHomeFeedSectionItem
/// with the given fields replaced by the non-null parameter values.
@override @override
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
$SpotifySectionPlaylistCopyWith<$Res>? get playlist { $SpotifySectionPlaylistCopyWith<$Res>? get playlist {
@ -1186,8 +1113,6 @@ class _$SpotifyHomeFeedSectionItemCopyWithImpl<$Res,
}); });
} }
/// Create a copy of SpotifyHomeFeedSectionItem
/// with the given fields replaced by the non-null parameter values.
@override @override
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
$SpotifySectionArtistCopyWith<$Res>? get artist { $SpotifySectionArtistCopyWith<$Res>? get artist {
@ -1200,8 +1125,6 @@ class _$SpotifyHomeFeedSectionItemCopyWithImpl<$Res,
}); });
} }
/// Create a copy of SpotifyHomeFeedSectionItem
/// with the given fields replaced by the non-null parameter values.
@override @override
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
$SpotifySectionAlbumCopyWith<$Res>? get album { $SpotifySectionAlbumCopyWith<$Res>? get album {
@ -1248,8 +1171,6 @@ class __$$SpotifyHomeFeedSectionItemImplCopyWithImpl<$Res>
$Res Function(_$SpotifyHomeFeedSectionItemImpl) _then) $Res Function(_$SpotifyHomeFeedSectionItemImpl) _then)
: super(_value, _then); : super(_value, _then);
/// Create a copy of SpotifyHomeFeedSectionItem
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -1316,14 +1237,12 @@ class _$SpotifyHomeFeedSectionItemImpl implements _SpotifyHomeFeedSectionItem {
(identical(other.album, album) || other.album == album)); (identical(other.album, album) || other.album == album));
} }
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(ignore: true)
@override @override
int get hashCode => int get hashCode =>
Object.hash(runtimeType, typename, playlist, artist, album); Object.hash(runtimeType, typename, playlist, artist, album);
/// Create a copy of SpotifyHomeFeedSectionItem @JsonKey(ignore: true)
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override @override
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
_$$SpotifyHomeFeedSectionItemImplCopyWith<_$SpotifyHomeFeedSectionItemImpl> _$$SpotifyHomeFeedSectionItemImplCopyWith<_$SpotifyHomeFeedSectionItemImpl>
@ -1357,11 +1276,8 @@ abstract class _SpotifyHomeFeedSectionItem
SpotifySectionArtist? get artist; SpotifySectionArtist? get artist;
@override @override
SpotifySectionAlbum? get album; SpotifySectionAlbum? get album;
/// Create a copy of SpotifyHomeFeedSectionItem
/// with the given fields replaced by the non-null parameter values.
@override @override
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(ignore: true)
_$$SpotifyHomeFeedSectionItemImplCopyWith<_$SpotifyHomeFeedSectionItemImpl> _$$SpotifyHomeFeedSectionItemImplCopyWith<_$SpotifyHomeFeedSectionItemImpl>
get copyWith => throw _privateConstructorUsedError; get copyWith => throw _privateConstructorUsedError;
} }
@ -1379,12 +1295,8 @@ mixin _$SpotifyHomeFeedSection {
List<SpotifyHomeFeedSectionItem> get items => List<SpotifyHomeFeedSectionItem> get items =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
/// Serializes this SpotifyHomeFeedSection to a JSON map.
Map<String, dynamic> toJson() => throw _privateConstructorUsedError; Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
@JsonKey(ignore: true)
/// Create a copy of SpotifyHomeFeedSection
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$SpotifyHomeFeedSectionCopyWith<SpotifyHomeFeedSection> get copyWith => $SpotifyHomeFeedSectionCopyWith<SpotifyHomeFeedSection> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
} }
@ -1413,8 +1325,6 @@ class _$SpotifyHomeFeedSectionCopyWithImpl<$Res,
// ignore: unused_field // ignore: unused_field
final $Res Function($Val) _then; final $Res Function($Val) _then;
/// Create a copy of SpotifyHomeFeedSection
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -1470,8 +1380,6 @@ class __$$SpotifyHomeFeedSectionImplCopyWithImpl<$Res>
$Res Function(_$SpotifyHomeFeedSectionImpl) _then) $Res Function(_$SpotifyHomeFeedSectionImpl) _then)
: super(_value, _then); : super(_value, _then);
/// Create a copy of SpotifyHomeFeedSection
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -1545,14 +1453,12 @@ class _$SpotifyHomeFeedSectionImpl implements _SpotifyHomeFeedSection {
const DeepCollectionEquality().equals(other._items, _items)); const DeepCollectionEquality().equals(other._items, _items));
} }
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(ignore: true)
@override @override
int get hashCode => Object.hash(runtimeType, typename, title, uri, int get hashCode => Object.hash(runtimeType, typename, title, uri,
const DeepCollectionEquality().hash(_items)); const DeepCollectionEquality().hash(_items));
/// Create a copy of SpotifyHomeFeedSection @JsonKey(ignore: true)
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override @override
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
_$$SpotifyHomeFeedSectionImplCopyWith<_$SpotifyHomeFeedSectionImpl> _$$SpotifyHomeFeedSectionImplCopyWith<_$SpotifyHomeFeedSectionImpl>
@ -1586,11 +1492,8 @@ abstract class _SpotifyHomeFeedSection implements SpotifyHomeFeedSection {
String get uri; String get uri;
@override @override
List<SpotifyHomeFeedSectionItem> get items; List<SpotifyHomeFeedSectionItem> get items;
/// Create a copy of SpotifyHomeFeedSection
/// with the given fields replaced by the non-null parameter values.
@override @override
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(ignore: true)
_$$SpotifyHomeFeedSectionImplCopyWith<_$SpotifyHomeFeedSectionImpl> _$$SpotifyHomeFeedSectionImplCopyWith<_$SpotifyHomeFeedSectionImpl>
get copyWith => throw _privateConstructorUsedError; get copyWith => throw _privateConstructorUsedError;
} }
@ -1605,12 +1508,8 @@ mixin _$SpotifyHomeFeed {
List<SpotifyHomeFeedSection> get sections => List<SpotifyHomeFeedSection> get sections =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
/// Serializes this SpotifyHomeFeed to a JSON map.
Map<String, dynamic> toJson() => throw _privateConstructorUsedError; Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
@JsonKey(ignore: true)
/// Create a copy of SpotifyHomeFeed
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$SpotifyHomeFeedCopyWith<SpotifyHomeFeed> get copyWith => $SpotifyHomeFeedCopyWith<SpotifyHomeFeed> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
} }
@ -1634,8 +1533,6 @@ class _$SpotifyHomeFeedCopyWithImpl<$Res, $Val extends SpotifyHomeFeed>
// ignore: unused_field // ignore: unused_field
final $Res Function($Val) _then; final $Res Function($Val) _then;
/// Create a copy of SpotifyHomeFeed
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -1674,8 +1571,6 @@ class __$$SpotifyHomeFeedImplCopyWithImpl<$Res>
_$SpotifyHomeFeedImpl _value, $Res Function(_$SpotifyHomeFeedImpl) _then) _$SpotifyHomeFeedImpl _value, $Res Function(_$SpotifyHomeFeedImpl) _then)
: super(_value, _then); : super(_value, _then);
/// Create a copy of SpotifyHomeFeed
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -1731,14 +1626,12 @@ class _$SpotifyHomeFeedImpl implements _SpotifyHomeFeed {
const DeepCollectionEquality().equals(other._sections, _sections)); const DeepCollectionEquality().equals(other._sections, _sections));
} }
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(ignore: true)
@override @override
int get hashCode => Object.hash( int get hashCode => Object.hash(
runtimeType, greeting, const DeepCollectionEquality().hash(_sections)); runtimeType, greeting, const DeepCollectionEquality().hash(_sections));
/// Create a copy of SpotifyHomeFeed @JsonKey(ignore: true)
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override @override
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
_$$SpotifyHomeFeedImplCopyWith<_$SpotifyHomeFeedImpl> get copyWith => _$$SpotifyHomeFeedImplCopyWith<_$SpotifyHomeFeedImpl> get copyWith =>
@ -1766,11 +1659,8 @@ abstract class _SpotifyHomeFeed implements SpotifyHomeFeed {
String get greeting; String get greeting;
@override @override
List<SpotifyHomeFeedSection> get sections; List<SpotifyHomeFeedSection> get sections;
/// Create a copy of SpotifyHomeFeed
/// with the given fields replaced by the non-null parameter values.
@override @override
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(ignore: true)
_$$SpotifyHomeFeedImplCopyWith<_$SpotifyHomeFeedImpl> get copyWith => _$$SpotifyHomeFeedImplCopyWith<_$SpotifyHomeFeedImpl> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
} }

View File

@ -24,9 +24,7 @@ mixin _$GeneratePlaylistProviderInput {
RecommendationSeeds? get min => throw _privateConstructorUsedError; RecommendationSeeds? get min => throw _privateConstructorUsedError;
RecommendationSeeds? get target => throw _privateConstructorUsedError; RecommendationSeeds? get target => throw _privateConstructorUsedError;
/// Create a copy of GeneratePlaylistProviderInput @JsonKey(ignore: true)
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$GeneratePlaylistProviderInputCopyWith<GeneratePlaylistProviderInput> $GeneratePlaylistProviderInputCopyWith<GeneratePlaylistProviderInput>
get copyWith => throw _privateConstructorUsedError; get copyWith => throw _privateConstructorUsedError;
} }
@ -64,8 +62,6 @@ class _$GeneratePlaylistProviderInputCopyWithImpl<$Res,
// ignore: unused_field // ignore: unused_field
final $Res Function($Val) _then; final $Res Function($Val) _then;
/// Create a copy of GeneratePlaylistProviderInput
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -109,8 +105,6 @@ class _$GeneratePlaylistProviderInputCopyWithImpl<$Res,
) as $Val); ) as $Val);
} }
/// Create a copy of GeneratePlaylistProviderInput
/// with the given fields replaced by the non-null parameter values.
@override @override
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
$RecommendationSeedsCopyWith<$Res>? get max { $RecommendationSeedsCopyWith<$Res>? get max {
@ -123,8 +117,6 @@ class _$GeneratePlaylistProviderInputCopyWithImpl<$Res,
}); });
} }
/// Create a copy of GeneratePlaylistProviderInput
/// with the given fields replaced by the non-null parameter values.
@override @override
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
$RecommendationSeedsCopyWith<$Res>? get min { $RecommendationSeedsCopyWith<$Res>? get min {
@ -137,8 +129,6 @@ class _$GeneratePlaylistProviderInputCopyWithImpl<$Res,
}); });
} }
/// Create a copy of GeneratePlaylistProviderInput
/// with the given fields replaced by the non-null parameter values.
@override @override
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
$RecommendationSeedsCopyWith<$Res>? get target { $RecommendationSeedsCopyWith<$Res>? get target {
@ -188,8 +178,6 @@ class __$$GeneratePlaylistProviderInputImplCopyWithImpl<$Res>
$Res Function(_$GeneratePlaylistProviderInputImpl) _then) $Res Function(_$GeneratePlaylistProviderInputImpl) _then)
: super(_value, _then); : super(_value, _then);
/// Create a copy of GeneratePlaylistProviderInput
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -295,9 +283,7 @@ class _$GeneratePlaylistProviderInputImpl
min, min,
target); target);
/// Create a copy of GeneratePlaylistProviderInput @JsonKey(ignore: true)
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override @override
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
_$$GeneratePlaylistProviderInputImplCopyWith< _$$GeneratePlaylistProviderInputImplCopyWith<
@ -331,11 +317,8 @@ abstract class _GeneratePlaylistProviderInput
RecommendationSeeds? get min; RecommendationSeeds? get min;
@override @override
RecommendationSeeds? get target; RecommendationSeeds? get target;
/// Create a copy of GeneratePlaylistProviderInput
/// with the given fields replaced by the non-null parameter values.
@override @override
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(ignore: true)
_$$GeneratePlaylistProviderInputImplCopyWith< _$$GeneratePlaylistProviderInputImplCopyWith<
_$GeneratePlaylistProviderInputImpl> _$GeneratePlaylistProviderInputImpl>
get copyWith => throw _privateConstructorUsedError; get copyWith => throw _privateConstructorUsedError;
@ -364,12 +347,8 @@ mixin _$RecommendationSeeds {
num? get timeSignature => throw _privateConstructorUsedError; num? get timeSignature => throw _privateConstructorUsedError;
num? get valence => throw _privateConstructorUsedError; num? get valence => throw _privateConstructorUsedError;
/// Serializes this RecommendationSeeds to a JSON map.
Map<String, dynamic> toJson() => throw _privateConstructorUsedError; Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
@JsonKey(ignore: true)
/// Create a copy of RecommendationSeeds
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$RecommendationSeedsCopyWith<RecommendationSeeds> get copyWith => $RecommendationSeedsCopyWith<RecommendationSeeds> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
} }
@ -407,8 +386,6 @@ class _$RecommendationSeedsCopyWithImpl<$Res, $Val extends RecommendationSeeds>
// ignore: unused_field // ignore: unused_field
final $Res Function($Val) _then; final $Res Function($Val) _then;
/// Create a copy of RecommendationSeeds
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -521,8 +498,6 @@ class __$$RecommendationSeedsImplCopyWithImpl<$Res>
$Res Function(_$RecommendationSeedsImpl) _then) $Res Function(_$RecommendationSeedsImpl) _then)
: super(_value, _then); : super(_value, _then);
/// Create a copy of RecommendationSeeds
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -690,7 +665,7 @@ class _$RecommendationSeedsImpl implements _RecommendationSeeds {
(identical(other.valence, valence) || other.valence == valence)); (identical(other.valence, valence) || other.valence == valence));
} }
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(ignore: true)
@override @override
int get hashCode => Object.hash( int get hashCode => Object.hash(
runtimeType, runtimeType,
@ -709,9 +684,7 @@ class _$RecommendationSeedsImpl implements _RecommendationSeeds {
timeSignature, timeSignature,
valence); valence);
/// Create a copy of RecommendationSeeds @JsonKey(ignore: true)
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override @override
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
_$$RecommendationSeedsImplCopyWith<_$RecommendationSeedsImpl> get copyWith => _$$RecommendationSeedsImplCopyWith<_$RecommendationSeedsImpl> get copyWith =>
@ -776,11 +749,8 @@ abstract class _RecommendationSeeds implements RecommendationSeeds {
num? get timeSignature; num? get timeSignature;
@override @override
num? get valence; num? get valence;
/// Create a copy of RecommendationSeeds
/// with the given fields replaced by the non-null parameter values.
@override @override
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(ignore: true)
_$$RecommendationSeedsImplCopyWith<_$RecommendationSeedsImpl> get copyWith => _$$RecommendationSeedsImplCopyWith<_$RecommendationSeedsImpl> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
} }

View File

@ -26,7 +26,7 @@ class Sidebar extends HookConsumerWidget {
color: Colors.black, color: Colors.black,
borderRadius: BorderRadius.circular(50), borderRadius: BorderRadius.circular(50),
), ),
child: Assets.spotubeLogoPng.image(height: 50), child: Assets.spotubeLogoNotWallpaper.image(height: 50),
); );
} }

View File

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

View File

@ -45,7 +45,7 @@ class HomePage extends HookConsumerWidget {
if (mediaQuery.smAndDown || layoutMode == LayoutMode.compact) if (mediaQuery.smAndDown || layoutMode == LayoutMode.compact)
SliverAppBar( SliverAppBar(
floating: true, floating: true,
title: Assets.spotubeLogoPng.image(height: 45), title: Assets.spotubeLogoNotWallpaper.image(height: 45),
backgroundColor: context.theme.colorScheme.background, backgroundColor: context.theme.colorScheme.background,
foregroundColor: context.theme.colorScheme.foreground, foregroundColor: context.theme.colorScheme.foreground,
actions: [ actions: [

View File

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

View File

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

View File

@ -1,11 +1,19 @@
cmake_minimum_required(VERSION 3.10) # Project-level configuration.
cmake_minimum_required(VERSION 3.13)
project(runner LANGUAGES CXX) project(runner LANGUAGES CXX)
# The name of the executable created for the application. Change this to change
# the on-disk name of your application.
set(BINARY_NAME "spotube") set(BINARY_NAME "spotube")
# The unique GTK application identifier for this application. See:
# https://wiki.gnome.org/HowDoI/ChooseApplicationID
set(APPLICATION_ID "oss.krtirtho.spotube") set(APPLICATION_ID "oss.krtirtho.spotube")
# Explicitly opt in to modern CMake behaviors to avoid warnings with recent
# versions of CMake.
cmake_policy(SET CMP0063 NEW) cmake_policy(SET CMP0063 NEW)
# Load bundled libraries from the lib/ directory relative to the binary.
set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") set(CMAKE_INSTALL_RPATH "$ORIGIN/lib")
# Root filesystem for cross-building. # Root filesystem for cross-building.
@ -18,7 +26,7 @@ if(FLUTTER_TARGET_PLATFORM_SYSROOT)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
endif() endif()
# Configure build options. # Define build configuration options.
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
set(CMAKE_BUILD_TYPE "Debug" CACHE set(CMAKE_BUILD_TYPE "Debug" CACHE
STRING "Flutter build mode" FORCE) STRING "Flutter build mode" FORCE)
@ -27,35 +35,31 @@ if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
endif() endif()
# Compilation settings that should be applied to most targets. # Compilation settings that should be applied to most targets.
#
# Be cautious about adding new options here, as plugins use this function by
# default. In most cases, you should add new options to specific targets instead
# of modifying this function.
function(APPLY_STANDARD_SETTINGS TARGET) function(APPLY_STANDARD_SETTINGS TARGET)
target_compile_features(${TARGET} PUBLIC cxx_std_14) target_compile_features(${TARGET} PUBLIC cxx_std_14)
target_compile_options(${TARGET} PRIVATE -Wall -Werror) target_compile_options(${TARGET} PRIVATE -Wall -Werror)
target_compile_options(${TARGET} PRIVATE "$<$<NOT:$<CONFIG:Debug>>:-O3>") target_compile_options(${TARGET} PRIVATE "$<$<NOT:$<CONFIG:Debug>>:-O3>")
target_compile_definitions(${TARGET} PRIVATE "$<$<NOT:$<CONFIG:Debug>>:NDEBUG>") target_compile_definitions(${TARGET} PRIVATE "$<$<NOT:$<CONFIG:Debug>>:NDEBUG>")
target_compile_options(${TARGET} PRIVATE -Wno-error=deprecated-declarations)
endfunction() endfunction()
set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter")
# Flutter library and tool build rules. # Flutter library and tool build rules.
set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter")
add_subdirectory(${FLUTTER_MANAGED_DIR}) add_subdirectory(${FLUTTER_MANAGED_DIR})
# System-level dependencies. # System-level dependencies.
find_package(PkgConfig REQUIRED) find_package(PkgConfig REQUIRED)
pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0)
add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") # Application build; see runner/CMakeLists.txt.
add_subdirectory("runner")
# Application build # Run the Flutter tool portions of the build. This must not be removed.
add_executable(${BINARY_NAME}
"main.cc"
"my_application.cc"
"${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc"
)
apply_standard_settings(${BINARY_NAME})
target_link_libraries(${BINARY_NAME} PRIVATE flutter)
target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK)
add_dependencies(${BINARY_NAME} flutter_assemble) add_dependencies(${BINARY_NAME} flutter_assemble)
# Only the install-generated bundle's copy of the executable will launch # Only the install-generated bundle's copy of the executable will launch
# correctly, since the resources must in the right relative locations. To avoid # correctly, since the resources must in the right relative locations. To avoid
# people trying to run the unbundled copy, put it in a subdirectory instead of # people trying to run the unbundled copy, put it in a subdirectory instead of
@ -65,12 +69,11 @@ set_target_properties(${BINARY_NAME}
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run"
) )
# Generated plugin build rules, which manage building the plugins and adding # Generated plugin build rules, which manage building the plugins and adding
# them to the application. # them to the application.
include(flutter/generated_plugins.cmake) include(flutter/generated_plugins.cmake)
target_link_libraries(${BINARY_NAME} PRIVATE ${MIMALLOC_LIB})
# === Installation === # === Installation ===
# By default, "installing" just makes a relocatable bundle in the build # By default, "installing" just makes a relocatable bundle in the build
@ -97,11 +100,17 @@ install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}
install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
COMPONENT Runtime) COMPONENT Runtime)
if(PLUGIN_BUNDLED_LIBRARIES) foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES})
install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" install(FILES "${bundled_library}"
DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
COMPONENT Runtime) COMPONENT Runtime)
endif() endforeach(bundled_library)
# Copy the native assets provided by the build.dart from all packages.
set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/")
install(DIRECTORY "${NATIVE_ASSETS_DIR}"
DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
COMPONENT Runtime)
# Fully re-copy the assets directory on each build to avoid having stale files # Fully re-copy the assets directory on each build to avoid having stale files
# from a previous install. # from a previous install.

View File

@ -1,72 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<component type="desktop-application">
<id>com.github.KRTirtho.Spotube</id>
<name>Spotube</name>
<summary>
Freedom of music
</summary>
<metadata_license>CC0-1.0</metadata_license>
<project_license>BSD-4-Clause</project_license>
<recommends>
<control>pointing</control>
<control>keyboard</control>
<control>touch</control>
</recommends>
<developer_name>Kingkor Roy Tirtho</developer_name>
<url type="bugtracker">https://github.com/krtirtho/spotube/issues</url>
<url type="homepage">https://spotube.krtirtho.dev</url>
<url type="donation">https://opencollective.com/spotube</url>
<description>
<p>Open source Spotify client that doesn't require Premium nor uses Electron! Available for
both desktop &amp; mobile!</p>
<p>Following are the features that currently spotube offers:</p>
<ul>
<li>🚫 No ads, thanks to the use of public &amp; free Spotify and YT Music APIs¹</li>
<li>⬇️ Downloadable tracks</li>
<li>🖥️ 📱 Cross-platform support</li>
<li>🪶 Small size &amp; less data usage</li>
<li>🕵️ Anonymous/guest login</li>
<li>🕒 Time synced lyrics</li>
<li>✋ No telemetry, diagnostics or user data collection</li>
<li>🚀 Native performance</li>
<li>📖 Open source/libre software</li>
<li>🔉 Playback control is done locally, not on the server</li>
</ul>
</description>
<screenshots>
<screenshot type="default">
<image type="source">
https://rawcdn.githack.com/KRTirtho/spotube/refs/heads/master/assets/spotube-screenshot.png
</image>
<caption>Spotube screenshot</caption>
</screenshot>
</screenshots>
<launchable type="desktop-id">com.github.KRTirtho.Spotube.desktop</launchable>
<releases> %{{APPDATA_RELEASE}}% <release version="2.6.0" date="2022-12-09" />
<release
version="2.5.0" date="2022-10-13" />
<release version="2.4.1" date="2022-09-13" />
<release
version="2.4.0" date="2022-09-09" />
<release version="2.3.1" date="2022-07-11" />
<release
version="2.2.1" date="2022-06-09" />
<release version="2.2.0" date="2022-06-05" />
<release
version="2.1.0" date="2022-05-10" />
<release version="2.0.0" date="2022-03-24" />
<release
version="1.2.0" date="2022-02-02" />
<release version="1.1.0" date="2022-01-27" />
<release
version="1.0.1" date="2022-01-15" />
<release version="1.0.0" date="2022-01-14" />
<release
version="0.0.3" date="2021-05-08" />
<release version="0.0.2" date="2021-03-31" />
<release
version="0.0.1" date="2021-03-20" />
</releases>
<content_rating type="oars-1.1" />
<update_contact>krtirtho@gmail.com</update_contact>
</component>

View File

@ -1,3 +1,4 @@
# This file controls Flutter-level build steps. It should not be edited.
cmake_minimum_required(VERSION 3.10) cmake_minimum_required(VERSION 3.10)
set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral")

View File

@ -1,16 +0,0 @@
display_name: Spotube
icon: assets/spotube-logo.png
keywords:
- Music
- Spotify
- Media
- Streaming
- YouTube
generic_name: Music Streaming Application
categories:
- Music
supported_mime_type:
- x-scheme-handler/spotify

View File

@ -1,47 +0,0 @@
display_name: Spotube
package_name: spotube
maintainer:
name: Kingkor Roy Tirtho
email: krtirtho@gmail.com
priority: optional
section: x11
installed_size: 24400
dependencies:
- mpv
- libappindicator3-1 | libayatana-appindicator3-1
- gir1.2-appindicator3-0.1 | gir1.2-ayatanaappindicator3-0.1
- libsecret-1-0
- libnotify-bin
- libjsoncpp25
- libmpv1 | libmpv2
- xdg-user-dirs
- avahi-daemon
- avahi-discover
- avahi-utils
- libnss-mdns
- mdns-scan
- libwebkit2gtk-4.1-0 | libwebkit2gtk-4.0-0
- libsoup-3.0-0 | libsoup-2.4-0
suggested_dependencies:
- yt-dlp
essential: false
icon: assets/spotube-logo.png
keywords:
- Music
- Spotify
- Media
- Streaming
- YouTube
generic_name: Music Streaming Application
categories:
- Music
supported_mime_type:
- x-scheme-handler/spotify

View File

@ -1,38 +0,0 @@
icon: assets/spotube-logo.png
summary: Lightweight cross-platform Spotify desktop client
group: Applications/Multimedia
vendor: Kingkor Roy Tirtho
packager: Kingkor Roy Tirtho
packagerEmail: krtirtho@gmail.com
license: BSD-4-Clause
url: https://github.com/KRTirtho/spotube
requires:
- mpv
- libappindicator
- jsoncpp
- libsecret
- libnotify
- xdg-user-dirs
- avahi
- mdns-scan
- nss-mdns
- webkit2gtk4.1
- libsoup3
display_name: Spotube
keywords:
- Music
- Spotify
- Media
- Streaming
- YouTube
generic_name: Music Streaming Application
categories:
- Music
startup_notify: true
supported_mime_type:
- x-scheme-handler/spotify

View File

@ -0,0 +1,26 @@
cmake_minimum_required(VERSION 3.13)
project(runner LANGUAGES CXX)
# Define the application target. To change its name, change BINARY_NAME in the
# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer
# work.
#
# Any new source files that you add to the application should be added here.
add_executable(${BINARY_NAME}
"main.cc"
"my_application.cc"
"${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc"
)
# Apply the standard set of build settings. This can be removed for applications
# that need different build settings.
apply_standard_settings(${BINARY_NAME})
# Add preprocessor definitions for the application ID.
add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}")
# Add dependency libraries. Add any application-specific dependencies here.
target_link_libraries(${BINARY_NAME} PRIVATE flutter)
target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK)
target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}")

View File

@ -17,13 +17,6 @@ G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION)
// Implements GApplication::activate. // Implements GApplication::activate.
static void my_application_activate(GApplication* application) { static void my_application_activate(GApplication* application) {
MyApplication* self = MY_APPLICATION(application); MyApplication* self = MY_APPLICATION(application);
GList* windows = gtk_application_get_windows(GTK_APPLICATION(application));
if (windows) {
gtk_window_present(GTK_WINDOW(windows->data));
return;
}
GtkWindow* window = GtkWindow* window =
GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application)));
@ -58,8 +51,7 @@ static void my_application_activate(GApplication* application) {
gtk_widget_show(GTK_WIDGET(window)); gtk_widget_show(GTK_WIDGET(window));
g_autoptr(FlDartProject) project = fl_dart_project_new(); g_autoptr(FlDartProject) project = fl_dart_project_new();
fl_dart_project_set_dart_entrypoint_arguments( fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments);
project, self->dart_entrypoint_arguments);
FlView* view = fl_view_new(project); FlView* view = fl_view_new(project);
gtk_widget_show(GTK_WIDGET(view)); gtk_widget_show(GTK_WIDGET(view));
@ -71,24 +63,40 @@ static void my_application_activate(GApplication* application) {
} }
// Implements GApplication::local_command_line. // Implements GApplication::local_command_line.
static gboolean my_application_local_command_line(GApplication* application, static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) {
gchar*** arguments,
int* exit_status) {
MyApplication* self = MY_APPLICATION(application); MyApplication* self = MY_APPLICATION(application);
// Strip out the first argument as it is the binary name. // Strip out the first argument as it is the binary name.
self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); self->dart_entrypoint_arguments = g_strdupv(*arguments + 1);
g_autoptr(GError) error = nullptr; g_autoptr(GError) error = nullptr;
if (!g_application_register(application, nullptr, &error)) { if (!g_application_register(application, nullptr, &error)) {
g_warning("Failed to register: %s", error->message); g_warning("Failed to register: %s", error->message);
*exit_status = 1; *exit_status = 1;
return TRUE; return TRUE;
} }
g_application_activate(application); g_application_activate(application);
*exit_status = 0; *exit_status = 0;
return FALSE; return TRUE;
}
// Implements GApplication::startup.
static void my_application_startup(GApplication* application) {
//MyApplication* self = MY_APPLICATION(object);
// Perform any actions required at application startup.
G_APPLICATION_CLASS(my_application_parent_class)->startup(application);
}
// Implements GApplication::shutdown.
static void my_application_shutdown(GApplication* application) {
//MyApplication* self = MY_APPLICATION(object);
// Perform any actions required at application shutdown.
G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application);
} }
// Implements GObject::dispose. // Implements GObject::dispose.
@ -100,31 +108,23 @@ static void my_application_dispose(GObject* object) {
static void my_application_class_init(MyApplicationClass* klass) { static void my_application_class_init(MyApplicationClass* klass) {
G_APPLICATION_CLASS(klass)->activate = my_application_activate; G_APPLICATION_CLASS(klass)->activate = my_application_activate;
G_APPLICATION_CLASS(klass)->local_command_line = G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line;
my_application_local_command_line; G_APPLICATION_CLASS(klass)->startup = my_application_startup;
G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown;
G_OBJECT_CLASS(klass)->dispose = my_application_dispose; G_OBJECT_CLASS(klass)->dispose = my_application_dispose;
} }
static void my_application_init(MyApplication* self) {} static void my_application_init(MyApplication* self) {}
bool is_flatpak(void) {
if (getenv("container") || getenv("FLATPAK_ID") || getenv("FLATPAK")) {
/* flatpak */
return true;
}
return false; /* No container detected */
}
MyApplication* my_application_new() { MyApplication* my_application_new() {
// gchar based alternate MY_APPLICATION_ID // Set the program name to the application ID, which helps various systems
const char* my_application_id = APPLICATION_ID; // like GTK and desktop environments map this running application to its
// corresponding .desktop file. This ensures better integration by allowing
// the application to be recognized beyond its binary name.
g_set_prgname(APPLICATION_ID);
if (is_flatpak()) { return MY_APPLICATION(g_object_new(my_application_get_type(),
my_application_id = "com.github.KRTirtho.Spotube"; "application-id", APPLICATION_ID,
} "flags", G_APPLICATION_NON_UNIQUE,
nullptr));
return MY_APPLICATION(g_object_new( }
my_application_get_type(), "application-id", my_application_id, "flags",
G_APPLICATION_HANDLES_COMMAND_LINE | G_APPLICATION_HANDLES_OPEN,
nullptr));
}

View File

@ -1,9 +0,0 @@
[Desktop Entry]
Type=Application
Name=Spotube
Exec=/usr/bin/spotube
Icon=/usr/share/icons/spotube/spotube-logo.png
Comment=A music streaming app combining the power of Spotify & YouTube
Terminal=false
Categories=Audio;Music;Player;AudioVideo;
MimeType=x-scheme-handler/spotify;

View File

@ -0,0 +1,12 @@
import Cocoa
import FlutterMacOS
import XCTest
class RunnerTests: XCTestCase {
func testExample() {
// If you add code to the Runner application, consider adding tests here.
// See https://developer.apple.com/documentation/xctest for more information about using XCTest.
}
}

View File

@ -5,23 +5,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: _fe_analyzer_shared name: _fe_analyzer_shared
sha256: "16e298750b6d0af7ce8a3ba7c18c69c3785d11b15ec83f6dcd0ad2a0009b3cab" sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "76.0.0" version: "67.0.0"
_macros:
dependency: transitive
description: dart
source: sdk
version: "0.3.3"
analyzer: analyzer:
dependency: transitive dependency: transitive
description: description:
name: analyzer name: analyzer
sha256: "1f14db053a8c23e260789e9b0980fa27f2680dd640932cae5e1137cce0e46e1e" sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.11.0" version: "6.4.1"
analyzer_plugin: analyzer_plugin:
dependency: transitive dependency: transitive
description: description:
@ -483,10 +478,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: dart_style name: dart_style
sha256: "7856d364b589d1f08986e140938578ed36ed948581fbc3bc9aef1805039ac5ab" sha256: "99e066ce75c89d6b29903d788a7bb9369cf754f7b24bf70bf4b6d6d6b26853b9"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.3.7" version: "2.3.6"
dartx: dartx:
dependency: transitive dependency: transitive
description: description:
@ -582,18 +577,18 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: drift name: drift
sha256: c2d073d35ad441730812f4ea05b5dd031fb81c5f9786a4f5fb77ecd6307b6f74 sha256: df027d168a2985a2e9da900adeba2ab0136f0d84436592cf3cd5135f82c8579c
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.22.1" version: "2.21.0"
drift_dev: drift_dev:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: drift_dev name: drift_dev
sha256: f4ab5d6976b1e31551ceb82ff597a505bda7818ff4f7be08a1da9d55eb6e730c sha256: "623649abe932fc17bd32e578e7e05f7ac5e7dd0b33e6c8669a0634105d1389bf"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.22.1" version: "2.21.2"
duration: duration:
dependency: "direct main" dependency: "direct main"
description: description:
@ -809,10 +804,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: flutter_form_builder name: flutter_form_builder
sha256: "39aee5a2548df0b3979a83eea38468116a888341fbca8a92c4be18a486a7bb57" sha256: "375da52998c72f80dec9187bd93afa7ab202b89d5d066699368ff96d39fd4876"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "9.6.0" version: "9.7.0"
flutter_gen_core: flutter_gen_core:
dependency: transitive dependency: transitive
description: description:
@ -1049,10 +1044,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: form_builder_validators name: form_builder_validators
sha256: "517fb884183fff7a0ef3db7d375981011da26ee452f20fb3d2e788ad527ad01d" sha256: cd617fa346250293ff3e2709961d0faf7b80e6e4f0ff7b500126b28d7422dd67
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "11.1.1" version: "11.1.2"
form_validator: form_validator:
dependency: "direct main" dependency: "direct main"
description: description:
@ -1065,10 +1060,10 @@ packages:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: freezed name: freezed
sha256: "44c19278dd9d89292cf46e97dc0c1e52ce03275f40a97c5a348e802a924bf40e" sha256: a434911f643466d78462625df76fd9eb13e57348ff43fe1f77bbe909522c67a1
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.5.7" version: "2.5.2"
freezed_annotation: freezed_annotation:
dependency: "direct main" dependency: "direct main"
description: description:
@ -1379,10 +1374,10 @@ packages:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: json_serializable name: json_serializable
sha256: c2fcb3920cf2b6ae6845954186420fca40bc0a8abcc84903b7801f17d7050d7c sha256: ea1432d167339ea9b5bb153f0571d0039607a873d6e04e0117af043f14a1fd4b
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.9.0" version: "6.8.0"
leak_tracker: leak_tracker:
dependency: transitive dependency: transitive
description: description:
@ -1447,14 +1442,6 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.2" version: "1.0.2"
macros:
dependency: transitive
description:
name: macros
sha256: "1d9e801cd66f7ea3663c45fc708450db1fa57f988142c64289142c9b7ee80656"
url: "https://pub.dev"
source: hosted
version: "0.1.3-main.0"
matcher: matcher:
dependency: transitive dependency: transitive
description: description:
@ -2289,10 +2276,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: sqlparser name: sqlparser
sha256: "4cad4b2c5f63dc9ea1a8dcffb58cf762322bea5dd8836870164a65e913bdae41" sha256: d77749237609784e337ec36c979d41f6f38a7b279df98622ae23929c8eb954a4
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.40.0" version: "0.39.2"
stack_trace: stack_trace:
dependency: transitive dependency: transitive
description: description:
@ -2449,10 +2436,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: tray_manager name: tray_manager
sha256: c2da0f0f1ddb455e721cf68d05d1281fec75cf5df0a1d3cb67b6ca0bdfd5709d sha256: "80be6c508159a6f3c57983de795209ac13453e9832fd574143b06dceee188ed2"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.4.0" version: "0.3.2"
type_plus: type_plus:
dependency: transitive dependency: transitive
description: description:

View File

@ -102,7 +102,7 @@ dependencies:
ref: dart-3-support ref: dart-3-support
url: https://github.com/KRTirtho/scrobblenaut.git url: https://github.com/KRTirtho/scrobblenaut.git
scroll_to_index: ^3.0.1 scroll_to_index: ^3.0.1
shadcn_flutter: ^0.0.32 shadcn_flutter: ^0.0.26
shared_preferences: ^2.2.3 shared_preferences: ^2.2.3
shelf: ^1.4.1 shelf: ^1.4.1
shelf_router: ^1.1.4 shelf_router: ^1.1.4
@ -120,7 +120,7 @@ dependencies:
test: ^1.25.7 test: ^1.25.7
timezone: ^0.10.0 timezone: ^0.10.0
titlebar_buttons: ^1.0.0 titlebar_buttons: ^1.0.0
tray_manager: ^0.4.0 tray_manager: ^0.3.0
url_launcher: ^6.2.6 url_launcher: ^6.2.6
uuid: ^4.4.0 uuid: ^4.4.0
version: ^3.0.2 version: ^3.0.2
@ -212,4 +212,4 @@ flutter_native_splash:
image: assets/spotube-logo_android12.png image: assets/spotube-logo_android12.png
branding: assets/branding.png branding: assets/branding.png
color: "#000000" color: "#000000"
icon_background_color: "#000000" icon_background_color: "#000000"