jpdsousa / rookit-core Goto Github PK
View Code? Open in Web Editor NEW:rocket: Rookit - A fully hackable open-source music library manager
License: MIT License
:rocket: Rookit - A fully hackable open-source music library manager
License: MIT License
When a track is parsed with a certain format, store such information in the database, in the form of:
{value: String, occurrences: Integer}
Similar to the field, formats affect the parsing score, based on the number of occurrences.
Basic list of tracks.
One of the key features of Rookit is the ability to write audio source files directly into the database.
Users can select either a file or a folder.
The output is a set of java objects:
The rookit feed provides a feed with the latest tracks added. This can be implemented by querying the database for the latest tracks added.
One other possible perspective is to get the latest tracks by release date.
As an extension, rookit might support RSS feeds.
Parser limit is already in the configuration file. Simply link it to the appropriate stream generators.
At this point Rookit only works with Smof (i.e. MongoDB), through the rookit-mongodb project. It would, however, be interesting to support other database drivers, by generalizing the driver interface.
This issue is related with #3
Planning support for:
Note: since we are planning to support multiple RDBMSs, it would be cool to investigate integration with Hibernate.
BiStream sources:
Allow Rookit to export data from the database as audio files.
Users can export:
Export formats:
Consider this scenario:
This behavior is wrong, as one would expect that the path is to be updated with the new insertion. Although, if this behavior is generalized, then the path will always be overwritten, leaving a lot of audio sources as 'dead references'.
NULL
then update the track with a new path: SOProvide a default configuration for every parameter, to avoid missing or invalid configurations.
Provide an additional parsing configuration to:
ALWAYS | ASK | NEVER
There should be an application configuration file, which should be written in JSON format.
Gson or Jackson should be used to parse the configuration file.
Configurations:
Being an application, rookit can be initialized with our without parameters
If rookit is initialized with parameters, such parameters are interpreted as a single command, such that when the command is run the application exits.
If rookit is initialized without any parameters, it generates a shell, in which multiple commands can be inputted.
This feature allows users to search for missing tracks, albums, artists, etc.., which might require fetching data from external sources.
Ignore fields are not being stored in the database.
The format is being kept in the file name.
The basis of this project is to always support plugabillity. So, we should follow an approach on how to plug the multiple pieces (i.e. modules) together.
Currently, guice is supporting plugabillity through modules. However, the configuration is defined programatically, which represents a limitation for users.
Rookit has its base code divided in multiple projects, which in some perspective can be seen as a basis for plugin support.
See: StackOverflow
See: Maven Dependency Plugin and depency:get
In order to make data less redundant, remove all tags from the audio source before inserting it into the database.
This feature might be customizable (i.e. deactivated), and might also be moved to the database project.
Note: Use this issue to suggest new third party services that rookit should support.
Rest API
SubSonic is a server that runs on a user machine, giving the user the possibility of streaming its own content to any device installed with a subsonic client.
Emby
Java API
Emby is similar to SubSonic, such that it acts as a media streaming server that runs on the user machine (where the media is located) and is able to stream it to a device that runs an Emby Client. Emby differs from SubSonic as it also supports other types of media apart from music.
Due to the similarity with subsonic, the same plugins apply:
Create a new option for Import
that automatically selects the first choice in every parsing.
Remove the audio file when the import is complete with success.
Rookit, as a music library, must have a music player.
Perhaps, creating an isolated purpose for this feature is not a bad idea.
Use a third party music player:
Rookit should support MPD.
The configuration system will be divided in three layers:
The rookit query language allows users to query the database. The initial idea is to support a querying system from the shell, built upon ExtendedCLI. As such, a list of options are required:
-q
- [required] - The Query String, which needs to be wrapped around quotes if contains spaces (does ExtCLI support this?)-t
- [optional] - The Type of element the user is looking for
It often appends that a track that represents a version of another track (e.g. cover, remix) has no information specifying so.
When a song is imported, in order to detected possible versions:
Name: 6LACK - Prblms (it's different & Kivnon Remix)
Database State: empty
Error: deserialization of enum value in track (i.e. TypeVersion
)
Hint: somewhere in the track insertion -> onInsertSuccess -> update query
Exception in thread "main" org.smof.exception.SmofException: java.lang.RuntimeException: Cannot parse value for type: version_token
at org.smof.parsers.AbstractBsonParser.handleError(AbstractBsonParser.java:53)
at org.smof.parsers.AbstractBsonParser.fromBson(AbstractBsonParser.java:113)
at org.smof.parsers.SmofParser.fromBson(SmofParser.java:129)
at org.smof.parsers.SmofParser.fromBson(SmofParser.java:122)
at org.smof.parsers.ObjectParser.buildObject(ObjectParser.java:310)
at org.smof.parsers.ObjectParser.toObject(ObjectParser.java:271)
at org.smof.parsers.ObjectParser.fromBson(ObjectParser.java:211)
at org.smof.parsers.SmofParser.fromBson(SmofParser.java:111)
at org.smof.collection.SmofCollectionImpl.execUpdate(SmofCollectionImpl.java:150)
at org.smof.collection.SmofUpdateQuery.execute(SmofUpdateQuery.java:85)
at org.smof.collection.SmofUpdateQuery.idEq(SmofUpdateQuery.java:81)
at org.smof.collection.SmofUpdateQuery.idEq(SmofUpdateQuery.java:76)
at org.smof.collection.SmofDispatcher.onInsertSuccess(SmofDispatcher.java:139)
at org.smof.collection.SmofDispatcher.insert(SmofDispatcher.java:121)
at org.smof.parsers.ObjectParser.fromElement(ObjectParser.java:138)
at org.smof.parsers.ObjectParser.toBson(ObjectParser.java:81)
at org.smof.parsers.SmofParser.toBson(SmofParser.java:164)
at org.smof.parsers.ObjectParser.fromMap(ObjectParser.java:200)
at org.smof.parsers.ObjectParser.toBson(ObjectParser.java:84)
at org.smof.parsers.SmofParser.toBson(SmofParser.java:164)
at org.smof.parsers.ObjectParser.fromObject(ObjectParser.java:154)
at org.smof.parsers.ObjectParser.toBson(ObjectParser.java:89)
at org.smof.parsers.SmofParser.toBson(SmofParser.java:164)
at org.smof.parsers.ObjectParser.fromMap(ObjectParser.java:200)
at org.smof.parsers.ObjectParser.toBson(ObjectParser.java:84)
at org.smof.parsers.SmofParser.toBson(SmofParser.java:164)
at org.smof.parsers.ObjectParser.fromObject(ObjectParser.java:154)
at org.smof.parsers.ObjectParser.fromMasterField(ObjectParser.java:124)
at org.smof.parsers.ObjectParser.toBson(ObjectParser.java:72)
at org.smof.parsers.SmofParser.toBson(SmofParser.java:136)
at org.smof.collection.SmofCollectionImpl.replace(SmofCollectionImpl.java:164)
at org.smof.collection.SmofCollectionImpl.insert(SmofCollectionImpl.java:107)
at org.smof.collection.SmofDispatcher.insert(SmofDispatcher.java:118)
at org.smof.collection.SmofDispatcher.insert(SmofDispatcher.java:109)
at org.smof.collection.Smof.insert(Smof.java:322)
at org.rookit.mongodb.DBManagerImpl.addAlbum(DBManagerImpl.java:142)
at org.rookit.runner.actions.ImportAction.handleResult(ImportAction.java:77)
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
at java.util.Iterator.forEachRemaining(Iterator.java:116)
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
at org.rookit.runner.actions.ImportAction.importDirectory(ImportAction.java:53)
at org.rookit.runner.actions.ImportAction.execute(ImportAction.java:45)
at org.extendedCLI.command.AbstractCommand.execute(AbstractCommand.java:40)
at org.extendedCLI.command.ExtendedCLI.execute(ExtendedCLI.java:29)
at org.rookit.runner.RookitShell.execute(RookitShell.java:57)
at org.rookit.runner.RookitShell.start(RookitShell.java:67)
at org.rookit.runner.RookitShell.main(RookitShell.java:81)
Caused by: java.lang.RuntimeException: Cannot parse value for type: version_token
... 55 more
Caused by: org.bson.BsonInvalidOperationException: No enum constant org.rookit.dm.track.TypeVersion.
at org.smof.bson.codecs.string.EnumCodec.decode(EnumCodec.java:34)
at org.smof.bson.codecs.string.EnumCodec.decode(EnumCodec.java:10)
at org.smof.parsers.AbstractBsonParser.deserializeWithCodec(AbstractBsonParser.java:124)
at org.smof.parsers.AbstractBsonParser.fromBson(AbstractBsonParser.java:111)
... 54 more
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.