diff --git a/docs/developer_api.md b/docs/developer_api.md index baa62dd5..f509a0ae 100644 --- a/docs/developer_api.md +++ b/docs/developer_api.md @@ -322,6 +322,8 @@ Arguments (in JSON): : * `hash`: (an SHA256 hash for a file in 64 characters of hexadecimal) * `hashes`: (a list of SHA256 hashes) +* `file_id`: (a numerical file id) +* `file_ids`: (a list of numerical file ids) * `file_service_name`: (optional, selective, string, the local file domain from which to delete, or all local files) * `file_service_key`: (optional, selective, hexadecimal, the local file domain from which to delete, or all local files) * `reason`: (optional, string, the reason attached to the delete action) @@ -352,6 +354,8 @@ Arguments (in JSON): : * `hash`: (an SHA256 hash for a file in 64 characters of hexadecimal) * `hashes`: (a list of SHA256 hashes) +* `file_id`: (a numerical file id) +* `file_ids`: (a list of numerical file ids) * `file_service_name`: (optional, selective, string, the local file domain to which to undelete) * `file_service_key`: (optional, selective, hexadecimal, the local file domain to which to undelete) @@ -382,6 +386,8 @@ Arguments (in JSON): : * `hash`: (an SHA256 hash for a file in 64 characters of hexadecimal) * `hashes`: (a list of SHA256 hashes) +* `file_id`: (a numerical file id) +* `file_ids`: (a list of numerical file ids) ```json title="Example request body" {"hash": "78f92ba4a786225ee2a1236efa6b7dc81dd729faf4af99f96f3e20bad6d8b538"} @@ -410,6 +416,8 @@ Arguments (in JSON): : * `hash`: (an SHA256 hash for a file in 64 characters of hexadecimal) * `hashes`: (a list of SHA256 hashes) +* `file_id`: (a numerical file id) +* `file_ids`: (a list of numerical file ids) ```json title="Example request body" {"hash": "78f92ba4a786225ee2a1236efa6b7dc81dd729faf4af99f96f3e20bad6d8b538"} @@ -544,6 +552,8 @@ Arguments (in JSON): : * `hash`: (selective A, an SHA256 hash for a file in 64 characters of hexadecimal) * `hashes`: (selective A, a list of SHA256 hashes) +* `file_id`: (a numerical file id) +* `file_ids`: (a list of numerical file ids) * `service_names_to_tags`: (selective B, an Object of service names to lists of tags to be 'added' to the files) * `service_keys_to_tags`: (selective B, an Object of service keys to lists of tags to be 'added' to the files) * `service_names_to_actions_to_tags`: (selective B, an Object of service names to content update actions to lists of tags) @@ -816,6 +826,8 @@ Arguments (in JSON): * `urls_to_delete`: (a list of urls you want to disassociate from the file(s)) * `hash`: (an SHA256 hash for a file in 64 characters of hexadecimal) * `hashes`: (a list of SHA256 hashes) + * `file_id`: (a numerical file id) + * `file_ids`: (a list of numerical file ids) All of these are optional, but you obviously need to have at least one of `url` arguments and one of the `hash` arguments. The single/multiple arguments work the same--just use whatever is convenient for you. Unless you really know what you are doing with URL Classes, I strongly recommend you stick to associating URLs with just one single 'hash' at a time. Multiple hashes pointing to the same URL is unusual and frequently unhelpful. ```json title="Example request body" @@ -1164,7 +1176,9 @@ Required Headers: Arguments (in JSON): : * `page_key`: (the page key for the page you wish to add files to) + * `file_id`: (selective, a numerical file id) * `file_ids`: (selective, a list of numerical file ids) + * `hash`: (selective, a hexadecimal SHA256 hash) * `hashes`: (selective, a list of hexadecimal SHA256 hashes) You need to use either file_ids or hashes. The files they refer to will be appended to the given page, just like a thumbnail drag and drop operation. The page key is the same as fetched in the [/manage\_pages/get\_pages](#manage_pages_get_pages) call. @@ -1228,7 +1242,7 @@ Arguments (in percent-encoded JSON): * `tag_service_key`: (optional, selective, hexadecimal, the tag domain on which to search) * `file_sort_type`: (optional, integer, the results sort method) * `file_sort_asc`: true or false (optional, the results sort order) - * `return_hashes`: true or false (optional, default false, returns hex hashes instead of file ids) + * `return_hashes`: true or false (optional, default false, returns hex hashes in addition to file ids, hashes and file ids are in the same order) * _`system_inbox`: true or false (obsolete, use tags)_ * _`system_archive`: true or false (obsolete, use tags)_ @@ -1375,7 +1389,8 @@ Response: "1b04c4df7accd5a61c5d02b36658295686b0abfebdc863110e7d7249bba3f9ad", "fe416723c731d679aa4d20e9fd36727f4a38cd0ac6d035431f0f452fad54563f", "b53505929c502848375fbc4dab2f40ad4ae649d34ef72802319a348f81b52bad" - ] + ], + "file_ids": [125462, 4852415, 123] } ``` @@ -1394,7 +1409,9 @@ Required Headers: n/a Arguments (in percent-encoded JSON): : + * `file_id`: (selective, a numerical file id) * `file_ids`: (selective, a list of numerical file ids) + * `hash`: (selective, a hexadecimal SHA256 hash) * `hashes`: (selective, a list of hexadecimal SHA256 hashes) * `only_return_identifiers`: true or false (optional, defaulting to false) * `detailed_url_information`: true or false (optional, defaulting to false) diff --git a/hydrus/client/networking/ClientLocalServerResources.py b/hydrus/client/networking/ClientLocalServerResources.py index 33f19dd8..b746d1be 100644 --- a/hydrus/client/networking/ClientLocalServerResources.py +++ b/hydrus/client/networking/ClientLocalServerResources.py @@ -446,6 +446,24 @@ def ParseHashes( request: HydrusServerRequest.HydrusRequest ): hashes.update( more_hashes ) + if 'file_id' in request.parsed_request_args: + + hash_id = request.parsed_request_args.GetValue( 'file_id', int ) + + hash_ids_to_hashes = HG.client_controller.Read( 'hash_ids_to_hashes', hash_ids = [ hash_id ] ) + + hashes.update( hash_ids_to_hashes.values() ) + + + if 'file_ids' in request.parsed_request_args: + + hash_ids = request.parsed_request_args.GetValue( 'file_ids', list, expected_list_type = int ) + + hash_ids_to_hashes = HG.client_controller.Read( 'hash_ids_to_hashes', hash_ids = hash_ids ) + + hashes.update( hash_ids_to_hashes.values() ) + + CheckHashLength( hashes ) return hashes @@ -2099,7 +2117,7 @@ class HydrusResourceClientAPIRestrictedGetFilesSearchFiles( HydrusResourceClient hash_ids_to_hashes = HG.client_controller.Read( 'hash_ids_to_hashes', hash_ids = hash_ids ) # maintain sort - body_dict = { 'hashes' : [ hash_ids_to_hashes[ hash_id ].hex() for hash_id in hash_ids ] } + body_dict = { 'hashes' : [ hash_ids_to_hashes[ hash_id ].hex() for hash_id in hash_ids ], 'file_ids' : list( hash_ids ) } else: @@ -2178,9 +2196,15 @@ class HydrusResourceClientAPIRestrictedGetFilesFileMetadata( HydrusResourceClien try: - if 'file_ids' in request.parsed_request_args: + if 'file_ids' in request.parsed_request_args or 'file_id' in request.parsed_request_args: - file_ids = request.parsed_request_args.GetValue( 'file_ids', list, expected_list_type = int ) + if 'file_ids' in request.parsed_request_args: + + file_ids = request.parsed_request_args.GetValue( 'file_ids', list, expected_list_type = int ) + + else: + + file_ids = [ request.parsed_request_args.GetValue( 'file_id', int ) ] request.client_api_permissions.CheckPermissionToSeeFiles( file_ids ) @@ -2193,11 +2217,17 @@ class HydrusResourceClientAPIRestrictedGetFilesFileMetadata( HydrusResourceClien media_results = HG.client_controller.Read( 'media_results_from_ids', file_ids, sorted = True ) - elif 'hashes' in request.parsed_request_args: + elif 'hashes' in request.parsed_request_args or 'hash' in request.parsed_request_args: request.client_api_permissions.CheckCanSeeAllFiles() - hashes = request.parsed_request_args.GetValue( 'hashes', list, expected_list_type = bytes ) + if 'hashes' in request.parsed_request_args: + + hashes = request.parsed_request_args.GetValue( 'hashes', list, expected_list_type = bytes ) + + else: + + hashes = [ request.parsed_request_args.GetValue( 'hash', bytes ) ] CheckHashLength( hashes ) @@ -2724,7 +2754,15 @@ class HydrusResourceClientAPIRestrictedManagePagesAddFiles( HydrusResourceClient page_key = request.parsed_request_args.GetValue( 'page_key', bytes ) - if 'hashes' in request.parsed_request_args: + if 'hash' in request.parsed_request_args: + + hashes = [ request.parsed_request_args.GetValue( 'hash', bytes ) ] + + CheckHashLength( hashes ) + + media_results = HG.client_controller.Read( 'media_results', hashes, sorted = True ) + + elif 'hashes' in request.parsed_request_args: hashes = request.parsed_request_args.GetValue( 'hashes', list, expected_list_type = bytes ) @@ -2732,6 +2770,12 @@ class HydrusResourceClientAPIRestrictedManagePagesAddFiles( HydrusResourceClient media_results = HG.client_controller.Read( 'media_results', hashes, sorted = True ) + elif 'file_id' in request.parsed_request_args: + + hash_ids = [ request.parsed_request_args.GetValue( 'file_id', int ) ] + + media_results = HG.client_controller.Read( 'media_results_from_ids', hash_ids, sorted = True ) + elif 'file_ids' in request.parsed_request_args: hash_ids = request.parsed_request_args.GetValue( 'file_ids', list, expected_list_type = int )