-
Notifications
You must be signed in to change notification settings - Fork 133
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
118 changed files
with
6,737 additions
and
940 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
[submodule ".flutter"] | ||
path = .flutter | ||
url = https://github.com/flutter/flutter.git | ||
branch = stable |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
# Finamp 1.0 Plan - Downloads Rewrite | ||
|
||
## Introduction | ||
|
||
This document outlines the core plan and motivation for Finamp 1.0. This change will need a major version bump as it will introduce breaking changes. As such, we will have to ensure that users are notified well in advance. | ||
|
||
## Motivations | ||
|
||
Finamp's downloading infrastructure is currently very poor. It was mostly written before I had any formal computer science experience. Because of this, it is very finnicky, and frequently breaks between updates. Some highlights include: | ||
|
||
* Download items being tracked across five key-value databases that all need to be kept in sync: | ||
* `DownloadedItems` - stores downloaded song data. | ||
* `DownloadedParents` - stores data about parents (albums, playlists), with links to children. | ||
* By link, I mean a copy of the Jellyfin metadata stored in `DownloadedItems`. Syncing between the two is done manually. | ||
* `DownloadIds` - a copy of the data stored in `DownloadedItems`, but indexed by the `flutter_downloader` download ID so that we can track the download ID back to the actual song. | ||
* `DownloadedImages` - stores downloaded image data. | ||
* `DownloadedImageIds` - same as `DownloadIds`, but for images. | ||
* `DownloadIds` cannot be used for images, as it takes a `DownloadedSong` data type (yes, a complete copy). | ||
* In the past, I stored absolute paths. The `DownloadedSong` data-type has to account for this, and update as it goes along. | ||
* This is especially problematic on iOS, where the internal app directory changes every update. | ||
* Off the top of my head, there is no clean way to add support for downloaded artists, or especially genres | ||
|
||
The download system also makes use of the [flutter_downloader](https://pub.dev/packages/flutter_downloader) package. In the new system, I will be replacing it with [background_downloader](https://pub.dev/packages/background_downloader) for the following reasons: | ||
|
||
* Desktop support - While downloading isn't 100% essential for desktop, it will be nice to have a complete version of Finamp on desktop. Desktop support will also be required for Linux phones. | ||
* Better looking API - `flutter_downloader` is extremely finnicky, especially around listening for updates. This is why download indicators have never really worked in Finamp. | ||
* Scoped storage support - Finamp's support for external directories is currently practically broken. It seems to be a pretty niche feature, but it would be nice to have working again. | ||
* Relative path handling by default - this will solve the absolute path issue I mentioned earlier. | ||
* Better stability - `flutter_downloader` has had a history of spurious bugs causing crashes and other issues. Most recently, [downloads on iOS failed to get marked as complete](https://github.com/jmshrv/finamp/issues/433), causing downloads to effectively break on iOS. I haven't tried `background_downloader` myself yet, but it has a much more rigid testing setup which should help it catch regressions like this. | ||
|
||
Finamp also uses [Hive](https://pub.dev/packages/hive) for all of its databases. Hive is a great database, but it isn't intended for complex use-cases like this. The same people behind Hive have created [Isar](https://pub.dev/packages/isar), which supports more advanced use-cases. I didn't use this initially as it was still in early development during Finamp's initial development, but it is now stable. For downloads, it will allow me to actually model relations in the database to make adding and removing downloads more reliable. I will also likely replace Finamp's other Hive databases with Isar databases. | ||
|
||
## Impacts | ||
|
||
Doing all of this will be an extremely damaging breaking change. Finamp's last breaking change was [0.5.0](https://github.com/jmshrv/finamp/releases/tag/0.5.0), which required all users to clear their app data (loading databases from before 0.5.0 failed). This was almost acceptable back then - Finamp was still in its early days and hadn't yet been released on the App Store or Play Store (0.5.0 was the first release). Now, Finamp has roughly 25,000 downloads (thank you!). I can't just release an update that breaks everything without giving months of notice, especially since the app will be auto-updated to 1.0. | ||
|
||
While the app won't fail to launch like 0.5.0 did, it will effectively log the user out (as the user database will be replaced). Downloads will also be wiped by deleting the internal song directory. Users must be aware that this is happening - one of the first "actions" of this will be to add a visible warning to the app linking here (with a brief explanation at the top). |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
Lots of bug fixes. Full changelog at https://github.com/jmshrv/finamp/releases/tag/0.6.11 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
Fixed issue that broke downloading from HTTP servers |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
Downloader fixes, and a language selector. Full changelog at https://github.com/jmshrv/finamp/releases/tag/0.6.13 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
Downloader fixes, and a language selector. Full changelog at https://github.com/jmshrv/finamp/releases/tag/0.6.14 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
New features and bug fixes. Full changelog at https://github.com/jmshrv/finamp/releases/tag/0.6.15 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
Fixed a bug created in 0.6.15. Full changelog at https://github.com/jmshrv/finamp/releases/tag/0.6.16 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
Fix F-Droid build. Changes from 0.6.16 (which was missed) can be seen at https://github.com/jmshrv/finamp/releases/tag/0.6.16 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
#!/usr/bin/env sh | ||
|
||
############################################################################## | ||
## | ||
## Flutter start up script for UN*X | ||
## Version: v1.3.1 | ||
## Date: 2023-04-12 16:58:43 | ||
## | ||
## Use this flutter wrapper to bundle Flutter within your project to make | ||
## sure everybody builds with the same version. | ||
## | ||
## Read about the install and uninstall process in the README on GitHub | ||
## https://github.com/passsy/flutter_wrapper | ||
## | ||
## Inspired by gradle-wrapper. | ||
## | ||
############################################################################## | ||
|
||
echoerr() { echo "$@" 1>&2; } | ||
|
||
# Attempt to set APP_HOME | ||
# Resolve links: $0 may be a link | ||
PRG="$0" | ||
# Need this for relative symlinks. | ||
while [ -h "$PRG" ]; do | ||
ls=$(ls -ld "$PRG") | ||
link=$(expr "$ls" : '.*-> \(.*\)$') | ||
if expr "$link" : '/.*' >/dev/null; then | ||
PRG="$link" | ||
else | ||
PRG=$(dirname "$PRG")"/$link" | ||
fi | ||
done | ||
SAVED="$(pwd)" | ||
cd "$(dirname "$PRG")/" >/dev/null | ||
APP_HOME="$(pwd -P)" | ||
cd "$SAVED" >/dev/null | ||
|
||
FLUTTER_SUBMODULE_NAME='.flutter' | ||
GIT_HOME=$(git -C "${APP_HOME}" rev-parse --show-toplevel) | ||
FLUTTER_DIR="${GIT_HOME}/${FLUTTER_SUBMODULE_NAME}" | ||
|
||
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong | ||
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then | ||
cd "$(dirname "$0")" | ||
fi | ||
|
||
# Fix not initialized flutter submodule | ||
if [ ! -f "${FLUTTER_DIR}/bin/flutter" ]; then | ||
echoerr "$FLUTTER_SUBMODULE_NAME submodule not initialized. Initializing..." | ||
git submodule update --init "${FLUTTER_DIR}" | ||
fi | ||
|
||
# Detect detach HEAD and fix it. commands like upgrade expect a valid branch, not a detached HEAD | ||
FLUTTER_SYMBOLIC_REF=$(git -C "${FLUTTER_DIR}" symbolic-ref -q HEAD) | ||
if [ -z "${FLUTTER_SYMBOLIC_REF}" ]; then | ||
FLUTTER_REV=$(git -C "${FLUTTER_DIR}" rev-parse HEAD) | ||
FLUTTER_CHANNEL=$(git -C "${GIT_HOME}" config -f .gitmodules submodule.${FLUTTER_SUBMODULE_NAME}.branch) | ||
|
||
if [ -z "${FLUTTER_CHANNEL}" ]; then | ||
echoerr "Warning: Submodule '$FLUTTER_SUBMODULE_NAME' doesn't point to an official Flutter channel \ | ||
(one of stable|beta|dev|master). './flutterw upgrade' will fail without a channel." | ||
echoerr "Fix this by adding a specific channel with:" | ||
echoerr " - './flutterw channel <channel>' or" | ||
echoerr " - Add 'branch = <channel>' to '$FLUTTER_SUBMODULE_NAME' submodule in .gitmodules" | ||
else | ||
echoerr "Fixing detached HEAD: '$FLUTTER_SUBMODULE_NAME' submodule points to a specific commit $FLUTTER_REV, not channel '$FLUTTER_CHANNEL' (as defined in .gitmodules)." | ||
# Make sure channel is fetched | ||
# Remove old channel branch because it might be moved to an unrelated commit where fast-forward pull isn't possible | ||
git -C "${FLUTTER_DIR}" branch -q -D "${FLUTTER_CHANNEL}" 2> /dev/null || true | ||
git -C "${FLUTTER_DIR}" fetch -q origin | ||
|
||
# bind current HEAD to channel defined in .gitmodules | ||
git -C "${FLUTTER_DIR}" checkout -q -b "${FLUTTER_CHANNEL}" "${FLUTTER_REV}" | ||
git -C "${FLUTTER_DIR}" branch -q -u "origin/${FLUTTER_CHANNEL}" "${FLUTTER_CHANNEL}" | ||
echoerr "Fixed! Migrated to channel '$FLUTTER_CHANNEL' while staying at commit $FLUTTER_REV. './flutterw upgrade' now works without problems!" | ||
git -C "${FLUTTER_DIR}" status -bs | ||
fi | ||
fi | ||
|
||
# Wrapper tasks done, call flutter binary with all args | ||
set -e | ||
"$FLUTTER_DIR/bin/flutter" "$@" | ||
set +e | ||
|
||
# Post flutterw tasks. exit code from /bin/flutterw will be used as final exit | ||
FLUTTER_EXIT_STATUS=$? | ||
if [ ${FLUTTER_EXIT_STATUS} -eq 0 ]; then | ||
|
||
# ./flutterw channel CHANNEL | ||
if echo "$@" | grep -q "channel"; then | ||
if [ -n "$2" ]; then | ||
# make sure .gitmodules is updated as well | ||
CHANNEL=${2} # second arg | ||
git config -f "${GIT_HOME}/.gitmodules" "submodule.${FLUTTER_SUBMODULE_NAME}.branch" "${CHANNEL}" | ||
# makes sure nobody forgets to do commit all changed files | ||
git add "${GIT_HOME}/.gitmodules" | ||
git add "${FLUTTER_DIR}" | ||
fi | ||
fi | ||
|
||
# ./flutterw upgrade | ||
if echo "$@" | grep -q "upgrade"; then | ||
# makes sure nobody forgets to do commit the changed submodule | ||
git add "${FLUTTER_DIR}" | ||
# flutter packages get runs automatically. Stage those changes as well | ||
if [ -f pubspec.lock ]; then | ||
git add pubspec.lock | ||
fi | ||
fi | ||
fi | ||
|
||
exit ${FLUTTER_EXIT_STATUS} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.