The alternative last.fm client for iOS made with SwiftUI

Overview

first.fm - The alternative last.fm client for iOS

(it's actually not available on the App Store... yet)

Features

  • Your profile (top artists, tracks and albums, friends)
  • Your last scrobbles
  • Global charts (artists and tracks)
  • Trends map (top artists per country)
  • Search (artists, tracks and albums)

Features not included:

  • Scrobbling. This app does not intend to be a scrobbler
  • Reports (not available on the last.fm API 😔 )

How to run

Requirements

  • Xcode 12+
  • Swift 5+

API keys

Copy firstfm/Config/Secrets.example.xcconfig to firstfm/Config/Secrets.xcconfig and fill it:

SPOTIFY_API_TOKEN =
LASTFM_API_KEY =
LASTFM_API_SHARED_SECRET =

Last.fm API key

Get an API key by filling this form.

Fill LASTFM_API_KEY and LASTFM_API_SHARED_SECRET in firstfm/Config/Secrets.xcconfig.

Spotify API key

Create a Spotify app and get the keys on the Spotify developer dashboard.

Fill SPOTIFY_API_TOKEN in firstfm/Config/Secrets.xcconfig.

Caveats and limitations

Artworks

The last.fm API does not provide artworks anymore. Instead, it returns a default placeholder image. This is very inconvenient for us, but we have no choice to use another API. To work around this limitation, the app uses the Spotify Search API to search for the entity (artist or album), and uses the images returned by Spotify. This means that:

  • An extra call to the Spotify API has to be made for each entity displayed by the app (a list of 50 artists retrieved by a signel last.fm API call will be followed by 50 Spotify API calls). This is a waste of resources and make the whole app slower. Luckily, the app does not suffer much from this since the Spotify API is very fast, and caching + async mechanism are used.
  • Artwork do not always match in cases of homonyms ☚ī¸

Listenings reports

The listening reports (example) which are accessible on the website and the official app are not available on the public API, so this isn't part of the app.

Following/followers

On users profile, there are only "friends" (which seems to be followings). The last.fm API has not been updated to support concept of "following" or "followers", as on the website. Thus, you also can't follow or unfollow users.

App Store availability

The app is not yet available on the App Store for a few reasons:

  • It's not finished, there are still some missing views and bugs (see issues)
  • The app icon uses the last.fm logo, which I'm pretty is not allowed + not a good idea
  • I don't have a developer account ($$)
  • The Spotify API has been working pretty well (for free!) but I don't know if publishing the app on the app store would break their terms
  • (The name sucks... I think?)

Libraries used

  • Cache: memory/disk cache for Spotify Search API calls
  • CryptoSwift: used for the md5 signature ( đŸĨ˛ ) for last.fm mutating API calls
  • FancyScollView: stretchy header w/ school view (artist view)
  • Kingfisher: image handler with memory/disk cache
  • NotificationBanner: nice errors banners
  • SwiftUIRefresh: pull to refresh (charts, scrobbles)
  • Valet: KeyChain wrapper to store LastFM user key

Comments
  • Configure Renovate

    Configure Renovate

    WhiteSource Renovate

    Welcome to Renovate! This is an onboarding PR to help you understand and configure settings before regular Pull Requests begin.

    đŸšĻ To activate Renovate, merge this Pull Request. To disable Renovate, simply close this Pull Request unmerged.


    Detected Package Files

    • .github/workflows/push.yml (github-actions)

    Configuration Summary

    Based on the default config's presets, Renovate will:

    • Start dependency updates only once this onboarding PR is merged
    • Enable Renovate Dependency Dashboard creation
    • If semantic commits detected, use semantic commit type fix for dependencies and chore for all others
    • Ignore node_modules, bower_components, vendor and various test/tests directories
    • Autodetect whether to pin dependencies or maintain ranges
    • Rate limit PR creation to a maximum of two per hour
    • Limit to maximum 20 open PRs at any time
    • Group known monorepo packages together
    • Use curated list of recommended non-monorepo package groupings
    • Fix some problems with very old Maven commons versions
    • Ignore spring cloud 1.x releases
    • Ignore http4s digest-based 1.x milestones
    • Use node versioning for @types/node
    • Limit concurrent requests to reduce load on Repology servers until we can fix this properly, see issue 10133

    🔡 Would you like to change the way Renovate is upgrading your dependencies? Simply edit the renovate.json in this branch with your custom config and the list of Pull Requests in the "What to Expect" section below will be updated the next time Renovate runs.


    What to Expect

    With your current configuration, Renovate will create 2 Pull Requests:

    chore(deps): update actions/checkout action to v2
    • Schedule: ["at any time"]
    • Branch name: renovate/actions-checkout-2.x
    • Merge into: dev
    • Upgrade actions/checkout to v2
    chore(deps): update wagoid/commitlint-github-action action to v4

    ❓ Got questions? Check out Renovate's Docs, particularly the Getting Started section. If you need any further assistance then you can also request help here.


    This PR has been generated by WhiteSource Renovate. View repository job log here.

    opened by renovate[bot] 1
  • [ImgBot] Optimize images

    [ImgBot] Optimize images

    Beep boop. Your images are optimized!

    Your image file size has been reduced by 20% 🎉

    Details

    | File | Before | After | Percent reduction | |:--|:--|:--|:--| | /firstfm/Assets.xcassets/AppIcon.appiconset/0f51ef6db67a678c77e9886b77cfb325_icon-1024.png | 92.41kb | 70.64kb | 23.56% | | /firstfm/Assets.xcassets/AppIcon.appiconset/[email protected] | 10.57kb | 9.56kb | 9.54% | | /firstfm/Assets.xcassets/AppIcon.appiconset/[email protected] | 9.94kb | 9.19kb | 7.47% | | /firstfm/Assets.xcassets/AppIcon.appiconset/[email protected] | 9.05kb | 8.60kb | 5.05% | | | | | | | Total : | 121.96kb | 97.99kb | 19.66% |


    Black Lives Matter | 💰 donate | 🎓 learn | ✍🏾 sign

    📝 docs | :octocat: repo | 🙋🏾 issues | 🏅 swag | đŸĒ marketplace

    opened by imgbot[bot] 0
  • Implement artist view (tracks & albums)

    Implement artist view (tracks & albums)

    Contains a refacto for image fetching located in /Data/Entities/API/Spotify/SpotifyImage.swift.

    I also applied swiftlint --fix and fixed what couldn't be with this command.

    opened by quantumsheep 0
  • [ImgBot] Optimize images

    [ImgBot] Optimize images

    Beep boop. Your images are optimized!

    Your image file size has been reduced by 20% 🎉

    Details

    | File | Before | After | Percent reduction | |:--|:--|:--|:--| | /firstfm/Assets.xcassets/AppIcon.appiconset/0f51ef6db67a678c77e9886b77cfb325_icon-1024.png | 92.41kb | 70.64kb | 23.56% | | /firstfm/Assets.xcassets/AppIcon.appiconset/[email protected] | 10.57kb | 9.56kb | 9.54% | | /firstfm/Assets.xcassets/AppIcon.appiconset/[email protected] | 9.94kb | 9.19kb | 7.47% | | /firstfm/Assets.xcassets/AppIcon.appiconset/[email protected] | 9.05kb | 8.60kb | 5.05% | | | | | | | Total : | 121.96kb | 97.99kb | 19.66% |


    Black Lives Matter | 💰 donate | 🎓 learn | ✍🏾 sign

    📝 docs | :octocat: repo | 🙋🏾 issues | 🏅 swag | đŸĒ marketplace

    opened by imgbot[bot] 0
  • Artist charts

    Artist charts

    screenshot_2021-06-12_22-26-30

    I used the Spotify API for images because Last.fm disabled images (sometimes): https://stackoverflow.com/questions/55978243/last-fm-api-returns-same-white-star-image-for-all-artists

    So instead it returns this:

    opened by angristan 0
Releases(v1.29.0)
Owner
Stanislas
tired of computers
Stanislas
An alternative Tumblr client for iOS

BlogQuest An alternative Tumblr client for iOS. First prize winner, 2014 Tumblr Hack Day. Kinda like Facebook Paper but for Tumblr. We meant to finish

Bryan Irace 14 Feb 10, 2022
Basic Unsplash client for iOS made with SwiftUI (beta).

PapersSwiftUI Basic Unsplash client for iOS made with SwiftUI (beta). Note SwiftUI is still in beta and I'm also still learning how it works. To-Do: P

Don 19 Dec 17, 2022
An alternative gym workouts tracker written in SwiftUI.

Gymspot Gymspot is an alternative workout tracker written in SwiftUI. I decided to start working on it because: I need an easy-to-use tracker for my w

Alessio Moiso 3 Nov 22, 2022
An alternative app store for non-jailbroken iOS devices

AltStore AltStore is an alternative app store for non-jailbroken iOS devices. AltStore is an iOS application that allows you to sideload other apps (.

null 1 Dec 9, 2021
AltStore is an alternative app store for non-jailbroken iOS devices.

AltStore AltStore is an alternative app store for non-jailbroken iOS devices. AltStore is an iOS application that allows you to sideload other apps (.

Riley Testut 8.3k Jan 9, 2023
Swift iPhone and iPad Client for Polls API, using Hyperdrive API client

Polls Client This is a Swift iPhone and iPad client for the Polls API - a simple application allowing users to view polls and vote in them. Polls is a

Apiary 34 Jul 15, 2022
A shopping app fully made in SwiftUI for iOS 14.1.

A shopping app fully made in SwiftUI for iOS 14.1.

null 19 Dec 14, 2022
Budget - Income, Expense & Transfer Tracker + Budgeting app for iOS made with SwiftUI.

Budget Income, Expense & Transfer Tracker + Budgeting app for iOS made with SwiftUI. Roadmap This is a work in progress. I'm working on the following

Samuel Beaulieu 2 Dec 5, 2022
This is my first SwiftUI project, as I decided not to release it I made the codebase available here for anyone to take a look at.

Sunshine This is my first SwiftUI project, as I decided not to release it to the App Store. I made the codebase available here for anyone to take a lo

Maxime Heckel 20 Dec 14, 2022
Glassmorphism made with SwiftUI

GlassmorphismSwiftUI Output / Result What is Glassmorphism? Glassmorphism is a unified name for the popular Frosted Glass aesthetic. It has many names

Shreyas Bhike 11 Oct 21, 2022
A weather app made using swiftUI and lottie animations

Paolinsky Weather app Weather app made using swiftUI, Lottie animations and the openweather api (https://openweathermap.org/api/one-call-api) Setup Ge

PaoloTorregroza 8 Dec 6, 2022
Generate strong passwords and save them in Keychain. Made with SwiftUI.

lockd Password manager iOS app, generate strong passwords and save them in Keychain. Download lockd on the App Store: https://apps.apple.com/us/app/lo

Iliane Zedadra 56 Dec 29, 2022
Movie Database app made with SwiftUI and UIKit

HW4_DogukaanKilicarslan Movie Data Base App made with SwiftUI Movie Database app made with SwiftUI Preview Movie Data Base App : Star Wars Characters

null 1 Oct 20, 2021
📱 An app UI made with SwiftUI

This is an application interface in swiftUI that I made to improve my ios development skills.

Luiggy Tamayo 0 Apr 5, 2022
Food App Onboarding screen made with SwiftUI

OnBoardSwiftUI-Food Food App Onboarding screen made with SwiftUI. App Details Lottie Files are used for Animations. TabView is used for Screen selecti

Shreyas Bhike 12 Jan 2, 2023
DroneShopSwiftUI - Drone Shop App made with SwiftUI and Scenekit

DroneShopSwiftUI Drone Shop App made with SwiftUI and Scenekit.

Shreyas Bhike 6 Feb 22, 2022
Swipe : Date App made with SwiftUI

DateAppSwiftUI Swipe : Date App made with SwiftUI.

Shreyas Bhike 9 Aug 20, 2022
This is an app for a craft beer company called Cacique Bier that allows to see their available products and place orders. Made with Swift and SwiftUI.

Cacique Bier App This is an app for a Craft Beer company that shows their catalogue of products and in the future will allow purchases. The app is com

Augusto Galindo Ali 5 Jun 21, 2022
Simple Dice Rolling app made with SwiftUI & Core Data

Dice Roll A simple dice roller app made with SwiftUI by an undergraduate student About The Project Built With SwiftUI Core Data Combine Getting Starte

Andrew Almasi 4 Nov 22, 2022