AstroTune (Previously known as Foobar Controller Mobile) is a mobile app that uses the BeefWeb API to allow users to control Foobar2000 and DeaDBeeF remotely.
This project was created for Preston Chapman's Student Innovation Project (SIP) at the University of Advancing Technology (UAT). The SIP is UAT's equivalent of a master’s thesis; all students graduating with a bachelor's degree are required to innovate and create a product. For more information, view https://www.uat.edu/student-innovation-projects.
UAT does not own this project; however, it has been granted a non-exclusive, royalty-free license to use, copy, display, describe, mark-on, modify, retain, or make other use of the student’s work. For more information, view https://www.uat.edu/catalog.
Information in the README and LICENSE may not properly reflect the above at the moment.
Please view the Wiki - Setup for a full guide on setting up the application.
-
– Can the user control playback of Foobar2000? (i.e., Pause, Play, Skip, Seek, Volume)
-
– Is the application Open Sourced?
-
– Does the application follow the licenses of all dependencies and third-party assets?
-
– Can the user view their music library?
-
– Can the user view their playlists?
-
– Can the user change the playing song from their Library?
-
– Is the app free to use?
-
– Does the app NOT have ads?
-
– Does the app work fully without an internet connection?
-
– Can the user use the app without crashing or bugs?
-
– Does the app have a good User Interface? (UI)
-
– Does the app have a good User Experience? (UX)
-
– Is the app customizable?
-
– Does the app follow the methodologies of Foobar2000? (Freeware and advanced)
-
– Is the app secure and follow best practices for network traffic? 1
Details
ACS.1: Document the software development process to analyze a problem and to design, build, and test software solutions
This project has full Git Management, with Releases, Versions, and Tags. This project also features a Wiki that provides explanations about the project and how to use the application. Multiple documents have been created documenting the process of creating this application, along with the use of services such as Trello.
Although this project does not store any data locally, Foobar2000 uses SQLite to store its data. The Beefweb API provides a uniform way to retrieve data from Foobar2000, including now-playing information, libraries, album art, tags, and more. Understanding how the tags work in Foobar is crucial for this app to function, since all the requests use the tags like %title%
This project is created in React Native, which means it is supported on Android and iOS. This project can even be modified to work with React Native Web as well, which would allow a web-based interface. However, having this fully client-sided and supported on the web would require a rework, so that is currently not an option. This project is created to be a link between a Computer running any Foobar2000-supported operating system and the user's mobile device.
ACS.5 Design, develop, and maintain object-oriented software solutions utilizing inheritance, encapsulation, polymorphism, and abstraction.
This project uses OOP in multiple places, ranging from the base classes for the API, custom elements, as well as types and interfaces. This project uses inheritance with classes like the Themes, as well as the Settings and Settings Groups. All classes use public/private methods, and some even with get methods. Multiple Settings classes override methods as needed by their setting type. All Settings are generic, which allows for subtypes of different values. The Themes use an abstract base class, where each one overrides and fills in the missing values. This allows for each theme to be its own class type, so new values can be adjusted, rather than there being objects for each Theme. Browser also uses abstraction as there is a Browser Item, which could be a Folder, or File, there is also recursion and generic, so each folder could have children folders/files, it can also be searched recursively fully, or at a specific depth level.
This application deals with a large amount of data, particularly when it comes to the browser. This will be able to recursively do API calls to be able to get the contents of a Folder, with each File/Folder inside of it. This is then displayed to the user, where they can navigate in and out of the folders, can then play the song.
- Foobar2000
- Latest APK (Downloaded from project GitHub)
- BeefWeb fb2k-component (Downloaded from hyperblast's GitHub)
- Android Phone
- Install from unknown sources must be enabled
- Visual Studio Code (Recommended)
- GitHub Desktop (Optional)
- Git (Recommended)
- Android Phone or Emulator (Physical Phone Recommended, S22 was used)
- USB or Wireless debugging enabled
- Router (Optional)
- Windows 10/11 or Linux (Windows 11 was used)
- Windows Only: WSL (Ubuntu was used)
- SDK tools
- Android Studio (Recommended, NOT USED)
- Node.js
- Node Package Manager [NPM]
Below is information regarding the assets and libraries used for this project.
Note
Assets are subject to change. All rights belong to their original owners. This application is not ready for release, so its license may prohibit the use of these icons.
- Audio
- Silence - anars GitHub (No License)
- Controls
- Icons
- Navigation
- Connection – SVG Repo (Public Domain)
- Library – SVG Repo (CC Attribution License)
- Now Playing – SVG Repo (CC Attribution License)
- Playback Queue – SVG Repo (MIT License)
- Lottie
- Loading – LottieFiles (Lottie Simple License)
- Miscellaneous
- Menu – SVG Repo (CC Attribution License)
- Album - SVG Repo (MIT License)
- Stars - Google Fonts (Apache License Version 2.0)
- Info - SVG Repo (CC Attribution License)
- Placeholder - Expo Placeholder Icon
- App Icon – Created by a 3rd party, all rights where given to Preston Chapman.
Note
Due to this project being early in development the packages below will likely be inaccurate, please reference package.json for exact modules.
@react-native-async-storage/async-storage:^2.1.2,- Storage of settings
@react-native-community/slider:4.5.6,- UI Element
@react-native-documents/picker:^11.0.3,- Export/Import Settings
@react-native-picker/picker:2.11.0,- UI Element
@react-navigation/native:^7.1.9,- Navigation
@react-navigation/native-stack:^7.3.14,- Navigation
axios:^1.12.0,- Web Requests to the Beefweb API
expo:~53.0.9,- Framework
expo-dev-client:^5.1.8,- Dev Backend
expo-screen-orientation:^8.1.6,- Horizontal and Vertical views
expo-secure-store:~14.2.3,- Storage of encrypted settings (passwords)
lottie-react-native:7.2.2,- Animated Icons
react:19.0.0,- Framework
react-native:0.79.6,- Framework
react-native-audio-pro:^9.9.1,- Audio Controller in notification bar/lock screen
react-native-elements:^3.4.3,- UI Elements
react-native-fs:^2.20.0,- Export/Import Settings
react-native-gesture-handler:^2.27.1,- Required for color picker
react-native-network-info:^5.2.1,- Finding available servers
react-native-reanimated:^3.18.0,- Required for color picker
react-native-restart:^0.0.27,- Restart the application
react-native-safe-area-context:^5.4.0,- UI Elements
react-native-screens:^4.11.1,- Navigation
react-native-svg:^15.12.0,- SVG Support
reanimated-color-picker:^4.1.0- Color Picker
This is a list of all VSCode extensions that were used for this project.
- ADB QR (Aakash P) [AakashP.adb-qr]
- Error Lense (Alexander) [usernamehw.errorlens]
- ESLint (Microsoft) [dbaeumer.vscode-eslint]
- Expo Tools (Expo) [expo.vscode-expo-tools]
- GitLens (GitKraken) [eamodio.gitlens]
- Prettier (Prettier) [esbenp.prettier-vscode]
- React Native Tools (Microsoft) [msjsdiag.vscode-react-native]
- Tasks (actboy168) [actboy168.tasks]
- Todo Tree (Gruntfuggly) [Gruntfuggly.todo-tree]
- Version Lens [pflannery.vscode-versionlens]
- WSL (Microsoft) [ms-vscode-remote.remote-wsl]
Footnotes
-
Due to the API using HTTP only, the network traffic is not encrypted. ↩