7 Commits
Author SHA1 Message Date
Illusion 638a12f274 chore: v0.3.3
* updated dependencies and removed unused ones
* added flutter as a submodule for easier f-droid updates
2023-02-05 18:47:46 +02:00
Illusion 3935faffc7 chore: correct license in README 2023-02-05 05:51:43 +02:00
Illusion 20c2862ea5 chore: fastlane for f-droid 2023-02-05 05:22:04 +02:00
Illusion 99b1035638 chore: sign app with release keys and change appId 2023-02-05 00:52:02 +02:00
Illusion e69b5e6848 fix: move to new api domain 2022-10-02 00:32:36 +03:00
Illusion 42077e17ee feat/fix: themes with some fixes 2022-08-07 06:26:54 +03:00
Illusion 55d26abaae chore: update readme 2022-08-06 02:42:48 +03:00
25 changed files with 719 additions and 343 deletions
+3
View File
@@ -0,0 +1,3 @@
[submodule "3rdparty/flutter"]
path = 3rdparty/flutter
url = https://github.com/flutter/flutter
Vendored Submodule
+1
Submodule 3rdparty/flutter added at b8f5394a5c
+6 -1
View File
@@ -1,3 +1,8 @@
# lyricsgrabbr
App that listens to your notifications and provides lyrics for the currently playing song.
App to listen to Spotify notifications and provide lyrics for currently playing song.
## Supported players
Any player that uses the MediaSession API _should_ be supported
## License
The project is licensed under the GPL3 license while the assets (icon) are licensed under the creative commons license.
+19 -3
View File
@@ -21,6 +21,12 @@ if (flutterVersionName == null) {
flutterVersionName = '1.0'
}
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file("key.properties")
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
@@ -42,17 +48,27 @@ android {
}
defaultConfig {
applicationId "com.illusionware.lyricsgrabbr"
applicationId "com.illusionman1212.lyricsgrabbr"
minSdkVersion 23
targetSdkVersion 31
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
}
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
storePassword keystoreProperties['storePassword']
}
}
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.release
}
debug {
signingConfig signingConfigs.debug
}
}
+1 -1
View File
@@ -1,5 +1,5 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.illusionware.lyricsgrabbr">
package="com.illusionman1212.lyricsgrabbr">
<!-- Flutter needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
+1 -1
View File
@@ -1,5 +1,5 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.illusionware.lyricsgrabbr">
package="com.illusionman1212.lyricsgrabbr">
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.INTERNET" />
@@ -1,4 +1,4 @@
package com.illusionware.lyricsgrabbr
package com.illusionman1212.lyricsgrabbr
import android.content.Intent
import android.os.Bundle
@@ -1,4 +1,4 @@
package com.illusionware.lyricsgrabbr
package com.illusionman1212.lyricsgrabbr
import android.app.Notification
import android.app.NotificationChannel
@@ -1,4 +1,4 @@
package com.illusionware.lyricsgrabbr
package com.illusionman1212.lyricsgrabbr
import io.flutter.plugin.common.EventChannel.StreamHandler
import io.flutter.plugin.common.EventChannel.EventSink
+1 -1
View File
@@ -1,5 +1,5 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.illusionware.lyricsgrabbr">
package="com.illusionman1212.lyricsgrabbr">
<!-- Flutter needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
@@ -0,0 +1,2 @@
## F-droid release
Initial release on f-droid
Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 724 KiB

@@ -0,0 +1 @@
Lyrics grabbr listens to your notifications and provides lyrics for the currently playing song.
@@ -0,0 +1 @@
Lyrics Grabbr
+1 -3
View File
@@ -1,5 +1,4 @@
import 'package:flutter/material.dart';
import 'dart:convert' as convert;
import 'package:web_scraper/web_scraper.dart';
class LyricsPage extends StatefulWidget {
@@ -87,8 +86,7 @@ class _LyricsPageState extends State<LyricsPage> {
width: MediaQuery.of(context).size.width,
child: SingleChildScrollView(
child: Container(
padding: const EdgeInsets.symmetric(
horizontal: 30, vertical: 30),
padding: const EdgeInsets.all(30),
child: Text(
lyrics ?? '',
style: const TextStyle(
+86 -29
View File
@@ -1,28 +1,61 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:provider/provider.dart';
import 'notification_listener.dart';
import 'search_result.dart';
import 'package:http/http.dart' as http;
import 'dart:convert' as convert;
import 'package:shared_preferences/shared_preferences.dart';
import 'settings.dart';
import 'theme_provider.dart';
Future<void> main() async {
runApp(const LyricsGrabbr());
}
class LyricsGrabbr extends StatelessWidget {
class LyricsGrabbr extends StatefulWidget {
const LyricsGrabbr({Key? key}) : super(key: key);
@override
State<LyricsGrabbr> createState() => _LyricsGrabbrState();
}
class _LyricsGrabbrState extends State<LyricsGrabbr> {
@override
Widget build(BuildContext context) {
return FutureBuilder<SharedPreferences>(
future: SharedPreferences.getInstance(),
builder: (_, snapshot) {
final prefTheme = snapshot.data?.getString("theme");
var themeMode = ThemeMode.system;
if (prefTheme == AppTheme.Dark.name) {
themeMode = ThemeMode.dark;
} else if (prefTheme == AppTheme.Light.name) {
themeMode = ThemeMode.light;
} else if (prefTheme == AppTheme.System.name) {
themeMode = ThemeMode.system;
}
return snapshot.hasData ? ChangeNotifierProvider(
create: (context) => ThemeProvider(themeMode),
builder: (context, _) {
final themeProvider = Provider.of<ThemeProvider>(context);
return MaterialApp(
title: 'Lyrics Grabbr',
theme: ThemeData(
primarySwatch: Colors.purple,
),
theme: MyThemes.lightTheme,
darkTheme: MyThemes.darkTheme,
themeMode: themeProvider.themeMode,
home: const HomePage(title: 'Lyrics Grabbr'),
);
}
) : Container();
}
);
}
}
class HomePage extends StatefulWidget {
@@ -90,7 +123,6 @@ class _HomePageState extends State<HomePage> with WidgetsBindingObserver {
),
content: const Text(
'This app requires permission to listen to notifications to function properly. Please grant permission in the next screen. BEWARE that the only way to stop the service is to revoke the notification listening permission.',
style: TextStyle(color: Colors.blueGrey),
),
actions: [
TextButton(
@@ -148,7 +180,7 @@ class _HomePageState extends State<HomePage> with WidgetsBindingObserver {
// TODO: build an httpclient to reuse between requests.
final uri = Uri.https(
'api.illusionman1212.tech',
'api.illusionman1212.com',
'/lyrics/search',
{'q': '$song $artist'},
);
@@ -178,35 +210,28 @@ class _HomePageState extends State<HomePage> with WidgetsBindingObserver {
}
Widget _buildResults() {
return ListView.builder(
return ListView.separated(
itemBuilder: (_, i) {
return searchResults[i];
},
itemCount: searchResults.length,
separatorBuilder: (BuildContext context, int index) {
return const Divider(height: 1);
},
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
centerTitle: true,
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
if (running)
List<Widget> _buildPage() {
if (lastNotification != null) {
return [
Container(
padding: const EdgeInsets.all(20),
child: RichText(
text: TextSpan(
text: lastNotification?.songTitle,
style: const TextStyle(
style: TextStyle(
fontSize: 24.0,
color: Colors.black,
color: Theme.of(context).textTheme.bodyLarge?.color,
fontWeight: FontWeight.w700,
),
children: [
@@ -215,9 +240,9 @@ class _HomePageState extends State<HomePage> with WidgetsBindingObserver {
),
TextSpan(
text: lastNotification?.artist,
style: const TextStyle(
style: TextStyle(
fontSize: 20.0,
color: Color(0xFF303030),
color: Theme.of(context).textTheme.bodyMedium?.color,
),
)
]),
@@ -230,9 +255,7 @@ class _HomePageState extends State<HomePage> with WidgetsBindingObserver {
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: const [
CircularProgressIndicator(value: null)
]))
children: const [CircularProgressIndicator(value: null)]))
: Flexible(
child: Column(
mainAxisSize: MainAxisSize.min,
@@ -244,9 +267,9 @@ class _HomePageState extends State<HomePage> with WidgetsBindingObserver {
running
? 'Found ${searchResults.length} result(s)'
: "",
style: const TextStyle(
style: TextStyle(
fontSize: 15,
color: Colors.black87,
color: Theme.of(context).textTheme.bodyText1?.color,
fontWeight: FontWeight.bold,
fontStyle: FontStyle.italic,
),
@@ -257,8 +280,42 @@ class _HomePageState extends State<HomePage> with WidgetsBindingObserver {
),
),
),
];
}
return [
const Padding(
padding: EdgeInsets.symmetric(vertical: 16),
child: Text("No supported player is running",
style: TextStyle(fontSize: 24)),
),
];
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
centerTitle: true,
actions: [
IconButton(
icon: const Icon(Icons.settings),
tooltip: "Settings",
splashRadius: 20,
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(builder: (context) => const SettingsPage()));
},
),
],
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
children: _buildPage(),
),
),
);
}
+54 -67
View File
@@ -1,10 +1,9 @@
import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'lyrics.dart';
class SearchResult extends StatefulWidget {
class SearchResult extends StatelessWidget {
const SearchResult(
{Key? key,
required this.title,
@@ -17,79 +16,42 @@ class SearchResult extends StatefulWidget {
final String title;
final String artist;
final String url;
final String artistUrl;
final Uri url;
final Uri artistUrl;
final String thumbnail;
final int id;
SearchResult.fromJson(Map<String, dynamic> json, {Key? key})
: title = json['meta']['title'],
artist = json['meta']['primaryArtist']['name'],
url = json['url'],
artistUrl = json['meta']['primaryArtist']['url'],
url = Uri.parse(json['url']),
artistUrl = Uri.parse(json['meta']['primaryArtist']['url']),
thumbnail = json['resources']['thumbnail'],
id = json['id'],
super(key: key);
@override
State<StatefulWidget> createState() => _SearchResultState();
}
class OptionItem extends StatelessWidget {
final String title;
final IconData icon;
final void Function()? tapFunction;
const OptionItem(
{Key? key, required this.title, required this.icon, this.tapFunction})
: super(key: key);
@override
Widget build(BuildContext context) {
return InkWell(
onTap: tapFunction,
child: Ink(
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 20),
child: Row(
children: [
Container(
margin: const EdgeInsets.only(right: 15),
child: Icon(icon),
),
Text(
title,
style: const TextStyle(fontSize: 17, fontWeight: FontWeight.w600),
),
],
),
),
);
}
}
class _SearchResultState extends State<SearchResult> {
List<Widget> _buildOptions() {
return <OptionItem>[
OptionItem(
title: "Open Artist Page in Genius",
icon: Icons.library_music,
tapFunction: () async {
if (!await launch(widget.artistUrl)) {
throw 'could not launch ${widget.artistUrl}';
onTap: () async {
if (!await launchUrl(artistUrl)) {
throw 'could not launch $artistUrl';
}
}),
OptionItem(
title: "Open Song Page in Genius",
icon: Icons.music_note,
tapFunction: () async {
if (!await launch(widget.url)) {
throw 'could not launch ${widget.url}';
onTap: () async {
if (!await launchUrl(url)) {
throw 'could not launch $url';
}
})
];
}
void _showOptionsBottomSheet() {
void _showOptionsBottomSheet(BuildContext context) {
showModalBottomSheet(
context: context,
builder: (context) {
@@ -109,37 +71,31 @@ class _SearchResultState extends State<SearchResult> {
@override
Widget build(BuildContext context) {
return Material(
child: Container(
margin: const EdgeInsets.only(top: 0.5),
child: InkWell(
onTap: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => LyricsPage(
title: widget.title,
artist: widget.artist,
url: widget.url,
title: title,
artist: artist,
url: url.toString(),
),
),
);
},
onLongPress: () => _showOptionsBottomSheet(),
onLongPress: () => _showOptionsBottomSheet(context),
child: Ink(
height: 75,
color: Colors.white10,
child: Row(
children: [
Container(
margin: const EdgeInsets.only(right: 20),
child: Image.network(
widget.thumbnail,
thumbnail,
width: 75,
height: 75,
fit: BoxFit.cover,
errorBuilder: (context, error, stackTrace) {
Fluttertoast.showToast(
msg: 'Failed to load album art for: ${widget.title}',
toastLength: Toast.LENGTH_LONG);
return const Center(
child: SizedBox(
width: 75,
@@ -155,18 +111,18 @@ class _SearchResultState extends State<SearchResult> {
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
widget.title,
style: const TextStyle(
color: Colors.black,
title,
style: TextStyle(
color: Theme.of(context).textTheme.bodyLarge?.color,
fontSize: 18,
fontWeight: FontWeight.bold,
),
overflow: TextOverflow.ellipsis,
),
Text(
widget.artist,
style: const TextStyle(
color: Colors.black54,
artist,
style: TextStyle(
color: Theme.of(context).textTheme.titleMedium?.color,
fontSize: 14,
),
overflow: TextOverflow.ellipsis,
@@ -178,6 +134,37 @@ class _SearchResultState extends State<SearchResult> {
),
),
),
);
}
}
class OptionItem extends StatelessWidget {
final String title;
final IconData icon;
final void Function()? onTap;
const OptionItem(
{Key? key, required this.title, required this.icon, this.onTap})
: super(key: key);
@override
Widget build(BuildContext context) {
return InkWell(
onTap: onTap,
child: Ink(
padding: const EdgeInsets.all(20),
child: Row(
children: [
Container(
margin: const EdgeInsets.only(right: 15),
child: Icon(icon),
),
Text(
title,
style: const TextStyle(fontSize: 17, fontWeight: FontWeight.w600),
),
],
),
),
);
}
+188
View File
@@ -0,0 +1,188 @@
// ignore_for_file: constant_identifier_names
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'theme_provider.dart';
enum AppTheme {
Dark,
Light,
System
}
class Setting extends StatelessWidget {
final String title;
final String? desc;
final void Function() onTap;
const Setting({
Key? key,
required this.title,
this.desc,
required this.onTap,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Material(
child: InkWell(
onTap: onTap,
child: Ink(
child: Container(
padding: const EdgeInsets.all(16),
child: Row(
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(title, style: const TextStyle(fontSize: 16)),
if (desc != null)
Text(desc!,
style: const TextStyle(color: Colors.grey)),
]),
),
],
),
),
),
),
);
}
}
class SettingsPage extends StatefulWidget {
const SettingsPage({Key? key}) : super(key: key);
@override
State<SettingsPage> createState() => _SettingsPageState();
}
class _SettingsPageState extends State<SettingsPage> {
final Future<SharedPreferences> _prefs = SharedPreferences.getInstance();
late SharedPreferences prefs;
String? activeTheme;
@override
void initState() {
super.initState();
initPlatformState();
}
Future<void> initPlatformState() async {
prefs = await _prefs;
setState(() {
activeTheme = prefs.getString("theme") ?? AppTheme.System.name;
});
}
Widget _buildSettingsGroup(String groupTitle, List<Setting> items) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Text(groupTitle,
style: const TextStyle(color: Colors.deepPurple)),
),
...items,
],
);
}
List<Widget> _buildSettingsList(BuildContext context) {
return [
_buildSettingsGroup("Customization", [
Setting(
title: "Theme",
desc: activeTheme,
onTap: () {
final provider = Provider.of<ThemeProvider>(context, listen: false);
showDialog(
context: context,
builder: (BuildContext buildCtx) {
return Dialog(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(2)),
child: Container(
padding: const EdgeInsets.symmetric(vertical: 16),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding:
const EdgeInsets.symmetric(horizontal: 20),
child: Text("Theme",
style: Theme.of(context).textTheme.headline6),
),
Padding(
padding: const EdgeInsets.symmetric(vertical: 8),
child: Column(
children: [
RadioListTile(
value: AppTheme.System.name,
groupValue: activeTheme,
title: Text("Use System Default", style: Theme.of(context).textTheme.bodyText1),
onChanged: (String? value) => setState(() {
provider.changeTheme(ThemeMode.system);
activeTheme = AppTheme.System.name;
prefs.setString("theme", AppTheme.System.name);
Navigator.pop(context);
})),
RadioListTile(
value: AppTheme.Dark.name,
groupValue: activeTheme,
title: Text("Dark", style: Theme.of(context).textTheme.bodyText1),
onChanged: (String? value) => setState(() {
provider.changeTheme(ThemeMode.dark);
activeTheme = AppTheme.Dark.name;
prefs.setString("theme", AppTheme.Dark.name);
Navigator.pop(context);
})),
RadioListTile(
value: AppTheme.Light.name,
groupValue: activeTheme,
title: Text("Light", style: Theme.of(context).textTheme.bodyText1),
onChanged: (String? value) => setState(() {
provider.changeTheme(ThemeMode.light);
activeTheme = AppTheme.Light.name;
prefs.setString("theme", AppTheme.Light.name);
Navigator.pop(context);
})),
],
),
),
],
),
),
);
});
})
])
];
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("Settings"),
),
body: ListView.separated(
itemBuilder: (_, i) {
return _buildSettingsList(context)[i];
},
separatorBuilder: (_, __) {
return const SizedBox(height: 15);
},
itemCount: 1,
padding: const EdgeInsets.symmetric(vertical: 20),
),
);
}
}
+43
View File
@@ -0,0 +1,43 @@
import 'package:flutter/material.dart';
class ThemeProvider extends ChangeNotifier {
ThemeMode themeMode;
ThemeProvider(this.themeMode);
bool get isDarkMode => themeMode == ThemeMode.dark;
void changeTheme(ThemeMode mode) {
themeMode = mode;
notifyListeners();
}
}
class MyThemes {
static final darkTheme = ThemeData(
primarySwatch: Colors.deepPurple,
dialogTheme: const DialogTheme(backgroundColor: Color(0xFF202020)),
unselectedWidgetColor: Colors.white,
canvasColor: Colors.black,
bottomSheetTheme: const BottomSheetThemeData(backgroundColor: Color(0xFF202020)),
dividerColor: Colors.white,
iconTheme: const IconThemeData(color: Colors.white),
textTheme: const TextTheme(
bodyText1: TextStyle(color: Colors.white, fontSize: 16),
bodyText2: TextStyle(color: Colors.white),
subtitle1: TextStyle(color: Colors.grey),
subtitle2: TextStyle(color: Colors.white),
headline6: TextStyle(color: Colors.white),
),
);
static final lightTheme = ThemeData(
primarySwatch: Colors.purple,
dividerColor: Colors.black,
textTheme: const TextTheme(
bodyText1: TextStyle(fontSize: 16),
subtitle1: TextStyle(color: Colors.black54),
),
);
}
+217 -143
View File
@@ -1,90 +1,78 @@
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
args:
dependency: transitive
description:
name: args
url: "https://pub.dartlang.org"
source: hosted
version: "2.3.0"
async:
dependency: transitive
description:
name: async
url: "https://pub.dartlang.org"
sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0
url: "https://pub.dev"
source: hosted
version: "2.8.2"
version: "2.10.0"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
url: "https://pub.dartlang.org"
sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
url: "https://pub.dev"
source: hosted
version: "2.1.0"
version: "2.1.1"
characters:
dependency: transitive
description:
name: characters
url: "https://pub.dartlang.org"
sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c
url: "https://pub.dev"
source: hosted
version: "1.2.0"
charcode:
dependency: transitive
description:
name: charcode
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.1"
version: "1.2.1"
clock:
dependency: transitive
description:
name: clock
url: "https://pub.dartlang.org"
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
url: "https://pub.dev"
source: hosted
version: "1.1.0"
version: "1.1.1"
collection:
dependency: transitive
description:
name: collection
url: "https://pub.dartlang.org"
sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0
url: "https://pub.dev"
source: hosted
version: "1.16.0"
version: "1.17.0"
csslib:
dependency: transitive
description:
name: csslib
url: "https://pub.dartlang.org"
sha256: b36c7f7e24c0bdf1bf9a3da461c837d1de64b9f8beb190c9011d8c72a3dfd745
url: "https://pub.dev"
source: hosted
version: "0.17.2"
dbus:
dependency: transitive
description:
name: dbus
url: "https://pub.dartlang.org"
source: hosted
version: "0.7.1"
fake_async:
dependency: transitive
description:
name: fake_async
url: "https://pub.dartlang.org"
sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
url: "https://pub.dev"
source: hosted
version: "1.3.0"
version: "1.3.1"
ffi:
dependency: transitive
description:
name: ffi
url: "https://pub.dartlang.org"
sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978
url: "https://pub.dev"
source: hosted
version: "1.1.2"
version: "2.0.1"
file:
dependency: transitive
description:
name: file
url: "https://pub.dartlang.org"
sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d"
url: "https://pub.dev"
source: hosted
version: "6.1.2"
version: "6.1.4"
flutter:
dependency: "direct main"
description: flutter
@@ -94,30 +82,10 @@ packages:
dependency: "direct dev"
description:
name: flutter_lints
url: "https://pub.dartlang.org"
sha256: b543301ad291598523947dc534aaddc5aaad597b709d2426d3a0e0d44c5cb493
url: "https://pub.dev"
source: hosted
version: "1.0.4"
flutter_local_notifications:
dependency: "direct main"
description:
name: flutter_local_notifications
url: "https://pub.dartlang.org"
source: hosted
version: "9.3.2"
flutter_local_notifications_linux:
dependency: transitive
description:
name: flutter_local_notifications_linux
url: "https://pub.dartlang.org"
source: hosted
version: "0.4.2"
flutter_local_notifications_platform_interface:
dependency: transitive
description:
name: flutter_local_notifications_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "5.0.0"
flutter_test:
dependency: "direct dev"
description: flutter
@@ -128,104 +96,198 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
fluttertoast:
dependency: "direct main"
description:
name: fluttertoast
url: "https://pub.dartlang.org"
source: hosted
version: "8.0.9"
html:
dependency: transitive
description:
name: html
url: "https://pub.dartlang.org"
sha256: d9793e10dbe0e6c364f4c59bf3e01fb33a9b2a674bc7a1081693dba0614b6269
url: "https://pub.dev"
source: hosted
version: "0.15.0"
version: "0.15.1"
http:
dependency: "direct main"
description:
name: http
url: "https://pub.dartlang.org"
sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482"
url: "https://pub.dev"
source: hosted
version: "0.13.4"
version: "0.13.5"
http_parser:
dependency: transitive
description:
name: http_parser
url: "https://pub.dartlang.org"
sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
url: "https://pub.dev"
source: hosted
version: "4.0.0"
version: "4.0.2"
js:
dependency: transitive
description:
name: js
url: "https://pub.dartlang.org"
sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7"
url: "https://pub.dev"
source: hosted
version: "0.6.4"
version: "0.6.5"
lints:
dependency: transitive
description:
name: lints
url: "https://pub.dartlang.org"
sha256: a2c3d198cb5ea2e179926622d433331d8b58374ab8f29cdda6e863bd62fd369c
url: "https://pub.dev"
source: hosted
version: "1.0.1"
matcher:
dependency: transitive
description:
name: matcher
url: "https://pub.dartlang.org"
sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72"
url: "https://pub.dev"
source: hosted
version: "0.12.11"
version: "0.12.13"
material_color_utilities:
dependency: transitive
description:
name: material_color_utilities
url: "https://pub.dartlang.org"
sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724
url: "https://pub.dev"
source: hosted
version: "0.1.4"
version: "0.2.0"
meta:
dependency: transitive
description:
name: meta
url: "https://pub.dartlang.org"
sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42"
url: "https://pub.dev"
source: hosted
version: "1.7.0"
version: "1.8.0"
nested:
dependency: transitive
description:
name: nested
sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20"
url: "https://pub.dev"
source: hosted
version: "1.0.0"
path:
dependency: transitive
description:
name: path
url: "https://pub.dartlang.org"
sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b
url: "https://pub.dev"
source: hosted
version: "1.8.1"
petitparser:
version: "1.8.2"
path_provider_linux:
dependency: transitive
description:
name: petitparser
url: "https://pub.dartlang.org"
name: path_provider_linux
sha256: ab0987bf95bc591da42dffb38c77398fc43309f0b9b894dcc5d6f40c4b26c379
url: "https://pub.dev"
source: hosted
version: "4.4.0"
version: "2.1.7"
path_provider_platform_interface:
dependency: transitive
description:
name: path_provider_platform_interface
sha256: f0abc8ebd7253741f05488b4813d936b4d07c6bae3e86148a09e342ee4b08e76
url: "https://pub.dev"
source: hosted
version: "2.0.5"
path_provider_windows:
dependency: transitive
description:
name: path_provider_windows
sha256: bcabbe399d4042b8ee687e17548d5d3f527255253b4a639f5f8d2094a9c2b45c
url: "https://pub.dev"
source: hosted
version: "2.1.3"
platform:
dependency: transitive
description:
name: platform
url: "https://pub.dartlang.org"
sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76"
url: "https://pub.dev"
source: hosted
version: "3.1.0"
plugin_platform_interface:
dependency: transitive
description:
name: plugin_platform_interface
url: "https://pub.dartlang.org"
sha256: dbf0f707c78beedc9200146ad3cb0ab4d5da13c246336987be6940f026500d3a
url: "https://pub.dev"
source: hosted
version: "2.1.2"
version: "2.1.3"
process:
dependency: transitive
description:
name: process
url: "https://pub.dartlang.org"
sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09"
url: "https://pub.dev"
source: hosted
version: "4.2.4"
provider:
dependency: "direct main"
description:
name: provider
sha256: cdbe7530b12ecd9eb455bdaa2fcb8d4dad22e80b8afb4798b41479d5ce26847f
url: "https://pub.dev"
source: hosted
version: "6.0.5"
shared_preferences:
dependency: "direct main"
description:
name: shared_preferences
sha256: "5949029e70abe87f75cfe59d17bf5c397619c4b74a099b10116baeb34786fad9"
url: "https://pub.dev"
source: hosted
version: "2.0.17"
shared_preferences_android:
dependency: transitive
description:
name: shared_preferences_android
sha256: "955e9736a12ba776bdd261cf030232b30eadfcd9c79b32a3250dd4a494e8c8f7"
url: "https://pub.dev"
source: hosted
version: "2.0.15"
shared_preferences_foundation:
dependency: transitive
description:
name: shared_preferences_foundation
sha256: "2b55c18636a4edc529fa5cd44c03d3f3100c00513f518c5127c951978efcccd0"
url: "https://pub.dev"
source: hosted
version: "2.1.3"
shared_preferences_linux:
dependency: transitive
description:
name: shared_preferences_linux
sha256: f8ea038aa6da37090093974ebdcf4397010605fd2ff65c37a66f9d28394cb874
url: "https://pub.dev"
source: hosted
version: "2.1.3"
shared_preferences_platform_interface:
dependency: transitive
description:
name: shared_preferences_platform_interface
sha256: da9431745ede5ece47bc26d5d73a9d3c6936ef6945c101a5aca46f62e52c1cf3
url: "https://pub.dev"
source: hosted
version: "2.1.0"
shared_preferences_web:
dependency: transitive
description:
name: shared_preferences_web
sha256: a4b5bc37fe1b368bbc81f953197d55e12f49d0296e7e412dfe2d2d77d6929958
url: "https://pub.dev"
source: hosted
version: "2.0.4"
shared_preferences_windows:
dependency: transitive
description:
name: shared_preferences_windows
sha256: "5eaf05ae77658d3521d0e993ede1af962d4b326cd2153d312df716dc250f00c9"
url: "https://pub.dev"
source: hosted
version: "2.1.3"
sky_engine:
dependency: transitive
description: flutter
@@ -235,142 +297,154 @@ packages:
dependency: transitive
description:
name: source_span
url: "https://pub.dartlang.org"
sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250
url: "https://pub.dev"
source: hosted
version: "1.8.2"
version: "1.9.1"
stack_trace:
dependency: transitive
description:
name: stack_trace
url: "https://pub.dartlang.org"
sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5
url: "https://pub.dev"
source: hosted
version: "1.10.0"
version: "1.11.0"
stream_channel:
dependency: transitive
description:
name: stream_channel
url: "https://pub.dartlang.org"
sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8"
url: "https://pub.dev"
source: hosted
version: "2.1.0"
version: "2.1.1"
string_scanner:
dependency: transitive
description:
name: string_scanner
url: "https://pub.dartlang.org"
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
url: "https://pub.dev"
source: hosted
version: "1.1.0"
version: "1.2.0"
term_glyph:
dependency: transitive
description:
name: term_glyph
url: "https://pub.dartlang.org"
sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
url: "https://pub.dev"
source: hosted
version: "1.2.0"
version: "1.2.1"
test_api:
dependency: transitive
description:
name: test_api
url: "https://pub.dartlang.org"
sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206
url: "https://pub.dev"
source: hosted
version: "0.4.9"
timezone:
dependency: transitive
description:
name: timezone
url: "https://pub.dartlang.org"
source: hosted
version: "0.8.0"
version: "0.4.16"
typed_data:
dependency: transitive
description:
name: typed_data
url: "https://pub.dartlang.org"
sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5"
url: "https://pub.dev"
source: hosted
version: "1.3.0"
version: "1.3.1"
url_launcher:
dependency: "direct main"
description:
name: url_launcher
url: "https://pub.dartlang.org"
sha256: "698fa0b4392effdc73e9e184403b627362eb5fbf904483ac9defbb1c2191d809"
url: "https://pub.dev"
source: hosted
version: "6.0.20"
version: "6.1.8"
url_launcher_android:
dependency: transitive
description:
name: url_launcher_android
url: "https://pub.dartlang.org"
sha256: "3e2f6dfd2c7d9cd123296cab8ef66cfc2c1a13f5845f42c7a0f365690a8a7dd1"
url: "https://pub.dev"
source: hosted
version: "6.0.15"
version: "6.0.23"
url_launcher_ios:
dependency: transitive
description:
name: url_launcher_ios
url: "https://pub.dartlang.org"
sha256: bb328b24d3bccc20bdf1024a0990ac4f869d57663660de9c936fb8c043edefe3
url: "https://pub.dev"
source: hosted
version: "6.0.15"
version: "6.0.18"
url_launcher_linux:
dependency: transitive
description:
name: url_launcher_linux
url: "https://pub.dartlang.org"
sha256: "318c42cba924e18180c029be69caf0a1a710191b9ec49bb42b5998fdcccee3cc"
url: "https://pub.dev"
source: hosted
version: "3.0.0"
version: "3.0.2"
url_launcher_macos:
dependency: transitive
description:
name: url_launcher_macos
url: "https://pub.dartlang.org"
sha256: "41988b55570df53b3dd2a7fc90c76756a963de6a8c5f8e113330cb35992e2094"
url: "https://pub.dev"
source: hosted
version: "3.0.0"
version: "3.0.2"
url_launcher_platform_interface:
dependency: transitive
description:
name: url_launcher_platform_interface
url: "https://pub.dartlang.org"
sha256: "4eae912628763eb48fc214522e58e942fd16ce195407dbf45638239523c759a6"
url: "https://pub.dev"
source: hosted
version: "2.0.5"
version: "2.1.1"
url_launcher_web:
dependency: transitive
description:
name: url_launcher_web
url: "https://pub.dartlang.org"
sha256: "44d79408ce9f07052095ef1f9a693c258d6373dc3944249374e30eff7219ccb0"
url: "https://pub.dev"
source: hosted
version: "2.0.9"
version: "2.0.14"
url_launcher_windows:
dependency: transitive
description:
name: url_launcher_windows
url: "https://pub.dartlang.org"
sha256: b6217370f8eb1fd85c8890c539f5a639a01ab209a36db82c921ebeacefc7a615
url: "https://pub.dev"
source: hosted
version: "3.0.0"
version: "3.0.3"
vector_math:
dependency: transitive
description:
name: vector_math
url: "https://pub.dartlang.org"
sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
version: "2.1.4"
web_scraper:
dependency: "direct main"
description:
name: web_scraper
url: "https://pub.dartlang.org"
sha256: "34d41de25c1aaeeca2cd91c1d062ee3126f59db6c84ec32da17d44d082ecc177"
url: "https://pub.dev"
source: hosted
version: "0.1.4"
win32:
dependency: transitive
description:
name: win32
sha256: c9ebe7ee4ab0c2194e65d3a07d8c54c5d00bb001b76081c4a04cdb8448b59e46
url: "https://pub.dev"
source: hosted
version: "3.1.3"
xdg_directories:
dependency: transitive
description:
name: xdg_directories
url: "https://pub.dartlang.org"
sha256: bd512f03919aac5f1313eb8249f223bacf4927031bf60b02601f81f687689e86
url: "https://pub.dev"
source: hosted
version: "0.2.0+1"
xml:
dependency: transitive
description:
name: xml
url: "https://pub.dartlang.org"
source: hosted
version: "5.3.1"
version: "0.2.0+3"
sdks:
dart: ">=2.17.0-0 <3.0.0"
flutter: ">=2.10.0"
dart: ">=2.18.0 <3.0.0"
flutter: ">=3.0.0"
+4 -4
View File
@@ -1,5 +1,5 @@
name: lyricsgrabbr
description: A new Flutter project.
description: App that listens to your notifications and provides lyrics for the currently playing song.
# The following line prevents the package from being accidentally published to
# pub.dev using `flutter pub publish`. This is preferred for private packages.
@@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 0.2.1+1
version: 0.3.3+2
environment:
sdk: ">=2.16.1 <3.0.0"
@@ -31,10 +31,10 @@ dependencies:
sdk: flutter
http: ^0.13.4
flutter_local_notifications: ^9.3.2
url_launcher: ^6.0.20
web_scraper: ^0.1.4
fluttertoast: ^8.0.9
shared_preferences: ^2.0.15
provider: ^6.0.3
dev_dependencies:
flutter_test: