dylanljones / pyrekordbox

Inofficial Python package for interacting with the database and other files (XML, ANLZ, MySettings) of Pioneers Rekordbox DJ software
https://pyrekordbox.readthedocs.io/en/latest/
MIT License
176 stars 22 forks source link

Passing in incorrect key to Rekordbox6Database class does not raise exception #105

Closed ben-hearn-sb closed 9 months ago

ben-hearn-sb commented 9 months ago

Describe the bug If you pass in the incorrect key into the Rekordbox6Database class, the init function still runs through and tries to run some SQL commands.

To Reproduce Steps to reproduce the behavior:

db = Rekordbox6Database(key='iamthewrongkey')

The resulting error is:

Traceback (most recent call last):
  File "/Users/benhearn/miniconda3/envs/traxmanager_dev_venv/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1969, in _exec_single_context
    self.dialect.do_execute(
  File "/Users/benhearn/miniconda3/envs/traxmanager_dev_venv/lib/python3.9/site-packages/sqlalchemy/engine/default.py", line 922, in do_execute
    cursor.execute(statement, parameters)
sqlcipher3.dbapi2.DatabaseError: file is not a database

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/Users/benhearn/Documents/traxmanager_dev/TraxManager/traxmanager/utils/rekordbox_utils.py", line 180, in <module>
    change_file_name(move_to, 'Sweely - Nice or Ugly (Test Name Change Mix)')
  File "/Users/benhearn/Documents/traxmanager_dev/TraxManager/traxmanager/utils/rekordbox_utils.py", line 53, in inner
    content_obj = get_folder_path_content_object(db, orig_path)
  File "/Users/benhearn/Documents/traxmanager_dev/TraxManager/traxmanager/utils/rekordbox_utils.py", line 121, in get_folder_path_content_object
    success = content_obj.all()
  File "/Users/benhearn/miniconda3/envs/traxmanager_dev_venv/lib/python3.9/site-packages/sqlalchemy/orm/query.py", line 2693, in all
    return self._iter().all()  # type: ignore
  File "/Users/benhearn/miniconda3/envs/traxmanager_dev_venv/lib/python3.9/site-packages/sqlalchemy/orm/query.py", line 2847, in _iter
    result: Union[ScalarResult[_T], Result[_T]] = self.session.execute(
  File "/Users/benhearn/miniconda3/envs/traxmanager_dev_venv/lib/python3.9/site-packages/sqlalchemy/orm/session.py", line 2308, in execute
    return self._execute_internal(
  File "/Users/benhearn/miniconda3/envs/traxmanager_dev_venv/lib/python3.9/site-packages/sqlalchemy/orm/session.py", line 2190, in _execute_internal
    result: Result[Any] = compile_state_cls.orm_execute_statement(
  File "/Users/benhearn/miniconda3/envs/traxmanager_dev_venv/lib/python3.9/site-packages/sqlalchemy/orm/context.py", line 293, in orm_execute_statement
    result = conn.execute(
  File "/Users/benhearn/miniconda3/envs/traxmanager_dev_venv/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1416, in execute
    return meth(
  File "/Users/benhearn/miniconda3/envs/traxmanager_dev_venv/lib/python3.9/site-packages/sqlalchemy/sql/elements.py", line 516, in _execute_on_connection
    return connection._execute_clauseelement(
  File "/Users/benhearn/miniconda3/envs/traxmanager_dev_venv/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1639, in _execute_clauseelement
    ret = self._execute_context(
  File "/Users/benhearn/miniconda3/envs/traxmanager_dev_venv/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1848, in _execute_context
    return self._exec_single_context(
  File "/Users/benhearn/miniconda3/envs/traxmanager_dev_venv/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1988, in _exec_single_context
    self._handle_dbapi_exception(
  File "/Users/benhearn/miniconda3/envs/traxmanager_dev_venv/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 2343, in _handle_dbapi_exception
    raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
  File "/Users/benhearn/miniconda3/envs/traxmanager_dev_venv/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1969, in _exec_single_context
    self.dialect.do_execute(
  File "/Users/benhearn/miniconda3/envs/traxmanager_dev_venv/lib/python3.9/site-packages/sqlalchemy/engine/default.py", line 922, in do_execute
    cursor.execute(statement, parameters)
sqlalchemy.exc.DatabaseError: (sqlcipher3.dbapi2.DatabaseError) file is not a database
[SQL: SELECT "djmdContent"."ID" AS "djmdContent_ID", "djmdContent"."FolderPath" AS "djmdContent_FolderPath", "djmdContent"."FileNameL" AS "djmdContent_FileNameL", "djmdContent"."FileNameS" AS "djmdContent_FileNameS", "djmdContent"."Title" AS "djmdContent_Title", "djmdContent"."ArtistID" AS "djmdContent_ArtistID", "djmdContent"."AlbumID" AS "djmdContent_AlbumID", "djmdContent"."GenreID" AS "djmdContent_GenreID", "djmdContent"."BPM" AS "djmdContent_BPM", "djmdContent"."Length" AS "djmdContent_Length", "djmdContent"."TrackNo" AS "djmdContent_TrackNo", "djmdContent"."BitRate" AS "djmdContent_BitRate", "djmdContent"."BitDepth" AS "djmdContent_BitDepth", "djmdContent"."Commnt" AS "djmdContent_Commnt", "djmdContent"."FileType" AS "djmdContent_FileType", "djmdContent"."Rating" AS "djmdContent_Rating", "djmdContent"."ReleaseYear" AS "djmdContent_ReleaseYear", "djmdContent"."RemixerID" AS "djmdContent_RemixerID", "djmdContent"."LabelID" AS "djmdContent_LabelID", "djmdContent"."OrgArtistID" AS "djmdContent_OrgArtistID", "djmdContent"."KeyID" AS "djmdContent_KeyID", "djmdContent"."StockDate" AS "djmdContent_StockDate", "djmdContent"."ColorID" AS "djmdContent_ColorID", "djmdContent"."DJPlayCount" AS "djmdContent_DJPlayCount", "djmdContent"."ImagePath" AS "djmdContent_ImagePath", "djmdContent"."MasterDBID" AS "djmdContent_MasterDBID", "djmdContent"."MasterSongID" AS "djmdContent_MasterSongID", "djmdContent"."AnalysisDataPath" AS "djmdContent_AnalysisDataPath", "djmdContent"."SearchStr" AS "djmdContent_SearchStr", "djmdContent"."FileSize" AS "djmdContent_FileSize", "djmdContent"."DiscNo" AS "djmdContent_DiscNo", "djmdContent"."ComposerID" AS "djmdContent_ComposerID", "djmdContent"."Subtitle" AS "djmdContent_Subtitle", "djmdContent"."SampleRate" AS "djmdContent_SampleRate", "djmdContent"."DisableQuantize" AS "djmdContent_DisableQuantize", "djmdContent"."Analysed" AS "djmdContent_Analysed", "djmdContent"."ReleaseDate" AS "djmdContent_ReleaseDate", "djmdContent"."DateCreated" AS "djmdContent_DateCreated", "djmdContent"."ContentLink" AS "djmdContent_ContentLink", "djmdContent"."Tag" AS "djmdContent_Tag", "djmdContent"."ModifiedByRBM" AS "djmdContent_ModifiedByRBM", "djmdContent"."HotCueAutoLoad" AS "djmdContent_HotCueAutoLoad", "djmdContent"."DeliveryControl" AS "djmdContent_DeliveryControl", "djmdContent"."DeliveryComment" AS "djmdContent_DeliveryComment", "djmdContent"."CueUpdated" AS "djmdContent_CueUpdated", "djmdContent"."AnalysisUpdated" AS "djmdContent_AnalysisUpdated", "djmdContent"."TrackInfoUpdated" AS "djmdContent_TrackInfoUpdated", "djmdContent"."Lyricist" AS "djmdContent_Lyricist", "djmdContent"."ISRC" AS "djmdContent_ISRC", "djmdContent"."SamplerTrackInfo" AS "djmdContent_SamplerTrackInfo", "djmdContent"."SamplerPlayOffset" AS "djmdContent_SamplerPlayOffset", "djmdContent"."SamplerGain" AS "djmdContent_SamplerGain", "djmdContent"."VideoAssociate" AS "djmdContent_VideoAssociate", "djmdContent"."LyricStatus" AS "djmdContent_LyricStatus", "djmdContent"."ServiceID" AS "djmdContent_ServiceID", "djmdContent"."OrgFolderPath" AS "djmdContent_OrgFolderPath", "djmdContent"."Reserved1" AS "djmdContent_Reserved1", "djmdContent"."Reserved2" AS "djmdContent_Reserved2", "djmdContent"."Reserved3" AS "djmdContent_Reserved3", "djmdContent"."Reserved4" AS "djmdContent_Reserved4", "djmdContent"."ExtInfo" AS "djmdContent_ExtInfo", "djmdContent".rb_file_id AS "djmdContent_rb_file_id", "djmdContent"."DeviceID" AS "djmdContent_DeviceID", "djmdContent"."rb_LocalFolderPath" AS "djmdContent_rb_LocalFolderPath", "djmdContent"."SrcID" AS "djmdContent_SrcID", "djmdContent"."SrcTitle" AS "djmdContent_SrcTitle", "djmdContent"."SrcArtistName" AS "djmdContent_SrcArtistName", "djmdContent"."SrcAlbumName" AS "djmdContent_SrcAlbumName", "djmdContent"."SrcLength" AS "djmdContent_SrcLength", "djmdContent"."UUID" AS "djmdContent_UUID", "djmdContent".rb_data_status AS "djmdContent_rb_data_status", "djmdContent".rb_local_data_status AS "djmdContent_rb_local_data_status", "djmdContent".rb_local_deleted AS "djmdContent_rb_local_deleted", "djmdContent".rb_local_synced AS "djmdContent_rb_local_synced", "djmdContent".usn AS "djmdContent_usn", "djmdContent".rb_local_usn AS "djmdContent_rb_local_usn", "djmdContent".created_at AS "djmdContent_created_at", "djmdContent".updated_at AS "djmdContent_updated_at" 
FROM "djmdContent" 
WHERE "djmdContent"."FolderPath" = ?]
[parameters: ('/Users/benhearn/Music/test_folder copy/_backup_test_folder/test_folder/test_demo_02/Sweely - Nice Or Ugly.wav',)]
(Background on this error at: https://sqlalche.me/e/20/4xp6)

Expected behavior Expected an exception to be raised

Environment

dylanljones commented 9 months ago

This should do the trick. If the key is passed manually the first few characters are checked. If it doesn't seem valid a ValueError is raised.