mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-09-13 07:55:18 +00:00
chore: update app summary
This commit is contained in:
parent
eeb8cabf49
commit
dcdb16676d
@ -1,5 +1,5 @@
|
|||||||
pkgbase = spotube-bin
|
pkgbase = spotube-bin
|
||||||
pkgdesc = A lightweight free Spotify crossplatform-client which handles playback manually, streams music using Youtube & no Spotify premium account is needed
|
pkgdesc = Open source Spotify client that doesn't require Premium nor uses Electron! Available for both desktop & mobile!
|
||||||
pkgver = 2.3.0
|
pkgver = 2.3.0
|
||||||
pkgrel = 1
|
pkgrel = 1
|
||||||
url = https://github.com/KRTirtho/spotube/
|
url = https://github.com/KRTirtho/spotube/
|
||||||
|
@ -3,7 +3,7 @@ pkgname=spotube-bin
|
|||||||
pkgver=%{{SPOTUBE_VERSION}}%
|
pkgver=%{{SPOTUBE_VERSION}}%
|
||||||
pkgrel=%{{PKGREL}}%
|
pkgrel=%{{PKGREL}}%
|
||||||
epoch=
|
epoch=
|
||||||
pkgdesc="A lightweight free Spotify crossplatform-client which handles playback manually, streams music using Youtube & no Spotify premium account is needed"
|
pkgdesc="Open source Spotify client that doesn't require Premium nor uses Electron! Available for both desktop & mobile!"
|
||||||
arch=(x86_64)
|
arch=(x86_64)
|
||||||
url="https://github.com/KRTirtho/spotube/"
|
url="https://github.com/KRTirtho/spotube/"
|
||||||
license=('BSD-4-Clause')
|
license=('BSD-4-Clause')
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
<docsUrl>https://github.com/KRTirtho/spotube#readme</docsUrl>
|
<docsUrl>https://github.com/KRTirtho/spotube#readme</docsUrl>
|
||||||
<bugTrackerUrl>https://github.com/KRTirtho/spotube/issues/new</bugTrackerUrl>
|
<bugTrackerUrl>https://github.com/KRTirtho/spotube/issues/new</bugTrackerUrl>
|
||||||
<tags>spotube music audio spotify youtube flutter</tags>
|
<tags>spotube music audio spotify youtube flutter</tags>
|
||||||
<summary>A lightweight free Spotify 🎧 crossplatform-client 🖥📱 which handles playback manually, streams music using Youtube & no Spotify premium account is needed 😱</summary>
|
<summary>Open source Spotify client that doesn't require Premium nor uses Electron! Available for both desktop & mobile!</summary>
|
||||||
<description>
|
<description>
|
||||||
Spotube is a Flutter based lightweight spotify client. It utilizes the power
|
Spotube is a Flutter based lightweight spotify client. It utilizes the power
|
||||||
of Spotify & Youtube's public API & creates a hazardless, performant & resource
|
of Spotify & Youtube's public API & creates a hazardless, performant & resource
|
||||||
|
@ -44,7 +44,7 @@ class CategoryCard extends HookConsumerWidget {
|
|||||||
children: [
|
children: [
|
||||||
Text(
|
Text(
|
||||||
category.name!,
|
category.name!,
|
||||||
style: Theme.of(context).textTheme.titleLarge,
|
style: Theme.of(context).textTheme.titleMedium,
|
||||||
),
|
),
|
||||||
ScrollConfiguration(
|
ScrollConfiguration(
|
||||||
behavior: ScrollConfiguration.of(context).copyWith(
|
behavior: ScrollConfiguration.of(context).copyWith(
|
||||||
|
@ -6,7 +6,6 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
|
|||||||
|
|
||||||
import 'package:spotify/spotify.dart';
|
import 'package:spotify/spotify.dart';
|
||||||
import 'package:spotube/collections/spotube_icons.dart';
|
import 'package:spotube/collections/spotube_icons.dart';
|
||||||
import 'package:spotube/components/playlist/playlist_create_dialog.dart';
|
|
||||||
import 'package:spotube/components/shared/shimmers/shimmer_playbutton_card.dart';
|
import 'package:spotube/components/shared/shimmers/shimmer_playbutton_card.dart';
|
||||||
import 'package:spotube/components/shared/fallbacks/anonymous_fallback.dart';
|
import 'package:spotube/components/shared/fallbacks/anonymous_fallback.dart';
|
||||||
import 'package:spotube/components/playlist/playlist_card.dart';
|
import 'package:spotube/components/playlist/playlist_card.dart';
|
||||||
@ -34,6 +33,7 @@ class UserPlaylists extends HookConsumerWidget {
|
|||||||
final likedTracksPlaylist = useMemoized(
|
final likedTracksPlaylist = useMemoized(
|
||||||
() => PlaylistSimple()
|
() => PlaylistSimple()
|
||||||
..name = "Liked Tracks"
|
..name = "Liked Tracks"
|
||||||
|
..description = "All your liked tracks"
|
||||||
..type = "playlist"
|
..type = "playlist"
|
||||||
..collaborative = false
|
..collaborative = false
|
||||||
..public = false
|
..public = false
|
||||||
@ -75,15 +75,10 @@ class UserPlaylists extends HookConsumerWidget {
|
|||||||
return const AnonymousFallback();
|
return const AnonymousFallback();
|
||||||
}
|
}
|
||||||
|
|
||||||
final children = [
|
|
||||||
const PlaylistCreateDialog(),
|
|
||||||
...playlists.map((playlist) => PlaylistCard(playlist)).toList(),
|
|
||||||
];
|
|
||||||
return RefreshIndicator(
|
return RefreshIndicator(
|
||||||
onRefresh: playlistsQuery.refresh,
|
onRefresh: playlistsQuery.refresh,
|
||||||
child: SingleChildScrollView(
|
child: SingleChildScrollView(
|
||||||
physics: const AlwaysScrollableScrollPhysics(),
|
physics: const AlwaysScrollableScrollPhysics(),
|
||||||
child: Padding(
|
|
||||||
padding: const EdgeInsets.all(8.0),
|
padding: const EdgeInsets.all(8.0),
|
||||||
child: SafeArea(
|
child: SafeArea(
|
||||||
child: Column(
|
child: Column(
|
||||||
@ -99,21 +94,16 @@ class UserPlaylists extends HookConsumerWidget {
|
|||||||
if (playlistsQuery.isLoading || !playlistsQuery.hasData)
|
if (playlistsQuery.isLoading || !playlistsQuery.hasData)
|
||||||
const Center(child: ShimmerPlaybuttonCard(count: 7))
|
const Center(child: ShimmerPlaybuttonCard(count: 7))
|
||||||
else
|
else
|
||||||
Center(
|
Wrap(
|
||||||
child: Wrap(
|
runSpacing: 10,
|
||||||
spacing: spacing, // gap between adjacent chips
|
children: playlists
|
||||||
runSpacing: 20, // gap between lines
|
.map((playlist) => PlaylistCard(playlist))
|
||||||
alignment: breakpoint.isSm
|
.toList(),
|
||||||
? WrapAlignment.center
|
|
||||||
: WrapAlignment.start,
|
|
||||||
children: children,
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,6 @@ import 'package:flutter_hooks/flutter_hooks.dart';
|
|||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:spotify/spotify.dart';
|
import 'package:spotify/spotify.dart';
|
||||||
import 'package:spotube/components/shared/playbutton_card.dart';
|
import 'package:spotube/components/shared/playbutton_card.dart';
|
||||||
import 'package:spotube/hooks/use_breakpoint_value.dart';
|
|
||||||
import 'package:spotube/provider/playlist_queue_provider.dart';
|
import 'package:spotube/provider/playlist_queue_provider.dart';
|
||||||
import 'package:spotube/provider/spotify_provider.dart';
|
import 'package:spotube/provider/spotify_provider.dart';
|
||||||
import 'package:spotube/services/queries/queries.dart';
|
import 'package:spotube/services/queries/queries.dart';
|
||||||
@ -34,14 +33,11 @@ class PlaylistCard extends HookConsumerWidget {
|
|||||||
[playlistNotifier, tracks.value, query?.data],
|
[playlistNotifier, tracks.value, query?.data],
|
||||||
);
|
);
|
||||||
|
|
||||||
final int marginH =
|
|
||||||
useBreakpointValue(sm: 10, md: 15, lg: 20, xl: 20, xxl: 20);
|
|
||||||
|
|
||||||
final updating = useState(false);
|
final updating = useState(false);
|
||||||
final spotify = ref.watch(spotifyProvider);
|
final spotify = ref.watch(spotifyProvider);
|
||||||
|
|
||||||
return PlaybuttonCard(
|
return PlaybuttonCard(
|
||||||
margin: EdgeInsets.symmetric(horizontal: marginH.toDouble()),
|
margin: const EdgeInsets.symmetric(horizontal: 10),
|
||||||
title: playlist.name!,
|
title: playlist.name!,
|
||||||
description: playlist.description,
|
description: playlist.description,
|
||||||
imageUrl: TypeConversionUtils.image_X_UrlString(
|
imageUrl: TypeConversionUtils.image_X_UrlString(
|
||||||
|
@ -24,6 +24,7 @@ class SpotubeNavigationBar extends HookConsumerWidget {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context, ref) {
|
Widget build(BuildContext context, ref) {
|
||||||
|
final theme = Theme.of(context);
|
||||||
final downloadCount = ref.watch(
|
final downloadCount = ref.watch(
|
||||||
downloaderProvider.select((s) => s.currentlyRunning),
|
downloaderProvider.select((s) => s.currentlyRunning),
|
||||||
);
|
);
|
||||||
@ -34,8 +35,8 @@ class SpotubeNavigationBar extends HookConsumerWidget {
|
|||||||
final insideSelectedIndex = useState<int>(selectedIndex);
|
final insideSelectedIndex = useState<int>(selectedIndex);
|
||||||
|
|
||||||
final buttonColor = useBrightnessValue(
|
final buttonColor = useBrightnessValue(
|
||||||
Theme.of(context).colorScheme.inversePrimary,
|
theme.colorScheme.inversePrimary,
|
||||||
Theme.of(context).colorScheme.primary.withOpacity(0.2),
|
theme.colorScheme.primary.withOpacity(0.2),
|
||||||
);
|
);
|
||||||
|
|
||||||
useEffect(() {
|
useEffect(() {
|
||||||
@ -51,12 +52,10 @@ class SpotubeNavigationBar extends HookConsumerWidget {
|
|||||||
child: BackdropFilter(
|
child: BackdropFilter(
|
||||||
filter: ImageFilter.blur(sigmaX: 15, sigmaY: 15),
|
filter: ImageFilter.blur(sigmaX: 15, sigmaY: 15),
|
||||||
child: CurvedNavigationBar(
|
child: CurvedNavigationBar(
|
||||||
backgroundColor: Theme.of(context)
|
backgroundColor:
|
||||||
.colorScheme
|
theme.colorScheme.secondaryContainer.withOpacity(0.72),
|
||||||
.secondaryContainer
|
|
||||||
.withOpacity(0.72),
|
|
||||||
buttonBackgroundColor: buttonColor,
|
buttonBackgroundColor: buttonColor,
|
||||||
color: Theme.of(context).colorScheme.background,
|
color: theme.colorScheme.background,
|
||||||
height: 50,
|
height: 50,
|
||||||
items: [
|
items: [
|
||||||
...navbarTileList.map(
|
...navbarTileList.map(
|
||||||
@ -64,18 +63,11 @@ class SpotubeNavigationBar extends HookConsumerWidget {
|
|||||||
return MouseRegion(
|
return MouseRegion(
|
||||||
cursor: SystemMouseCursors.click,
|
cursor: SystemMouseCursors.click,
|
||||||
child: Badge(
|
child: Badge(
|
||||||
backgroundColor: Theme.of(context).primaryColor,
|
|
||||||
isLabelVisible: e.title == "Library" && downloadCount > 0,
|
isLabelVisible: e.title == "Library" && downloadCount > 0,
|
||||||
label: Text(
|
label: Text(downloadCount.toString()),
|
||||||
downloadCount.toString(),
|
|
||||||
style: const TextStyle(
|
|
||||||
color: Colors.white,
|
|
||||||
fontSize: 10,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
child: Icon(
|
child: Icon(
|
||||||
e.icon,
|
e.icon,
|
||||||
color: Theme.of(context).colorScheme.primary,
|
color: theme.colorScheme.primary,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
@ -99,7 +99,7 @@ class PlaybuttonCard extends HookWidget {
|
|||||||
Positioned.directional(
|
Positioned.directional(
|
||||||
textDirection: TextDirection.ltr,
|
textDirection: TextDirection.ltr,
|
||||||
end: end,
|
end: end,
|
||||||
bottom: -5,
|
bottom: -size * .15,
|
||||||
child: Column(
|
child: Column(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
|
@ -15,7 +15,10 @@ class CategoryQueries {
|
|||||||
"category-playlists",
|
"category-playlists",
|
||||||
(pageParam, spotify) async {
|
(pageParam, spotify) async {
|
||||||
final categories = await spotify.categories
|
final categories = await spotify.categories
|
||||||
.list(country: recommendationMarket)
|
.list(
|
||||||
|
country: recommendationMarket,
|
||||||
|
locale: 'en_US',
|
||||||
|
)
|
||||||
.getPage(15, pageParam);
|
.getPage(15, pageParam);
|
||||||
|
|
||||||
return categories;
|
return categories;
|
||||||
@ -44,7 +47,7 @@ class CategoryQueries {
|
|||||||
(pageParam, spotify) async {
|
(pageParam, spotify) async {
|
||||||
final playlists = await Pages<PlaylistSimple?>(
|
final playlists = await Pages<PlaylistSimple?>(
|
||||||
spotify,
|
spotify,
|
||||||
"v1/browse/categories/$category/playlists",
|
"v1/browse/categories/$category/playlists?country=US&locale=en_US",
|
||||||
(json) => json == null ? null : PlaylistSimple.fromJson(json),
|
(json) => json == null ? null : PlaylistSimple.fromJson(json),
|
||||||
'playlists',
|
'playlists',
|
||||||
(json) => PlaylistsFeatured.fromJson(json),
|
(json) => PlaylistsFeatured.fromJson(json),
|
||||||
|
@ -3,8 +3,7 @@
|
|||||||
<id>com.github.KRTirtho.Spotube</id>
|
<id>com.github.KRTirtho.Spotube</id>
|
||||||
<name>Spotube</name>
|
<name>Spotube</name>
|
||||||
<summary>
|
<summary>
|
||||||
A lightweight free Spotify crossplatform-client which handles playback manually, streams music
|
Open source Spotify client that doesn't require Premium nor uses Electron! Available for both desktop & mobile!
|
||||||
using Youtube & no Spotify premium account is needed
|
|
||||||
</summary>
|
</summary>
|
||||||
<metadata_license>CC0-1.0</metadata_license>
|
<metadata_license>CC0-1.0</metadata_license>
|
||||||
<project_license>BSD-4-Clause</project_license>
|
<project_license>BSD-4-Clause</project_license>
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
A lightweight free Spotify crossplatform-client (desktop: Mac, Linux, Windows, mobile: Android) which handles playback manually, streams music using Youtube & no Spotify premium account is needed
|
Open source Spotify client that doesn't require Premium nor uses Electron! Available for both desktop & mobile!
|
||||||
|
|
||||||
|
|
||||||
Features:
|
Features:
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
name: spotube
|
name: spotube
|
||||||
description: A lightweight free Spotify crossplatform-client which handles
|
description: Open source Spotify client that doesn't require Premium nor uses Electron! Available for both desktop & mobile!
|
||||||
playback manually, streams music using Youtube & no Spotify premium account is
|
|
||||||
needed
|
|
||||||
|
|
||||||
publish_to: "none"
|
publish_to: "none"
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user