{"id":21346637,"url":"https://github.com/darkenergyprocessor/npps4-dlapi","last_synced_at":"2026-04-21T09:33:33.749Z","repository":{"id":152421657,"uuid":"617739624","full_name":"DarkEnergyProcessor/NPPS4-DLAPI","owner":"DarkEnergyProcessor","description":"Reference Implementation of NPPS4 Download API Protocol","archived":false,"fork":false,"pushed_at":"2026-03-28T07:15:56.000Z","size":90,"stargazers_count":5,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-03-28T12:27:01.970Z","etag":null,"topics":["fastapi","llsif","lovelive"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"zlib","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DarkEnergyProcessor.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-03-23T02:15:31.000Z","updated_at":"2026-03-28T07:15:59.000Z","dependencies_parsed_at":null,"dependency_job_id":"45b3dce5-9977-4ee2-921a-819fbca77176","html_url":"https://github.com/DarkEnergyProcessor/NPPS4-DLAPI","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/DarkEnergyProcessor/NPPS4-DLAPI","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DarkEnergyProcessor%2FNPPS4-DLAPI","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DarkEnergyProcessor%2FNPPS4-DLAPI/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DarkEnergyProcessor%2FNPPS4-DLAPI/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DarkEnergyProcessor%2FNPPS4-DLAPI/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DarkEnergyProcessor","download_url":"https://codeload.github.com/DarkEnergyProcessor/NPPS4-DLAPI/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DarkEnergyProcessor%2FNPPS4-DLAPI/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32085554,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-21T06:27:27.065Z","status":"ssl_error","status_checked_at":"2026-04-21T06:27:21.250Z","response_time":128,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["fastapi","llsif","lovelive"],"created_at":"2024-11-22T02:09:54.495Z","updated_at":"2026-04-21T09:33:33.738Z","avatar_url":"https://github.com/DarkEnergyProcessor.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"NPPS4-DLAPI\n=====\n\n[![NPPS4 DLAPI Spec.: Version 1.2](https://img.shields.io/badge/NPPS4%20DLAPI%20Spec.-Version%201.2-bf88ba)](https://github.com/DarkEnergyProcessor/NPPS4-DLAPI)\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)\n\nThis is reference implementation and documentation of NPPS4 Download API protocol.\n\nSetup\n-----\n\nBefore running, ensure to have all SIF game files with these structure.\n\n```\narchive-root/\n├── {iOS,Android}/\n│   ├── update/\n│   │   ├── \u003cclient_version\u003e/\n│   │   │   ├── 1.zip\n│   │   │   ├── 1_sha256.zip (**)\n│   │   │   ├── 2.zip\n│   │   │   ├── 2_sha256.zip (**)\n│   │   │   ├── ...\n│   │   │   ├── info.json\n│   │   │   └── infov2.json (*)\n│   │   ├── info.json\n│   │   └── infov2.json (*)\n│   └── package/\n│       ├── \u003cclient_version\u003e/\n│       │   ├── \u003cpackage_type\u003e/\n│       │   │   ├── \u003cpackage_id\u003e/\n│       │   │   │   ├── 1.zip\n│       │   │   │   ├── 1_sha256.zip (**)\n│       │   │   │   ├── 2.zip\n│       │   │   │   ├── 2_sha256.zip (**)\n│       │   │   │   ├── ...\n│       │   │   │   ├── info.json\n│       │   │   │   └── infov2.json (*)\n│       │   │   └── info.json\n│       │   ├── db (*)\n│       │   │   └── *.db_\n│       │   ├── microdl/ (*)\n│       │   │   ├── assets/\n│       │   │   ├── config/\n│       │   │   ├── en/\n│       │   │   └── info.json\n│       │   └── microdl_map.json\n│       └── info.json\n├── release_info.json\n└── generation.json (*)\n```\n\n**\\***: run `update_v1.1.py` script to upgrade the directory structure!\n\n**\\*\\***: run `update_v1.2.py` script to upgrade the directory structure! Non-SHA256 suffixed filename will be removed\nafterwards\n\n### Explanation, all paths are relative to `archive-root`:\n\n* `release_info.json` - Contains all keys used to decrypt game database rows.\n\n* `{iOS,Android}` - Must be either `iOS` or `Android`. Will be referred to `\u003cOS\u003e` from now on.\n\n* `\u003cOS\u003e/update/info.json` - Contains list of available client versions in this update package, as an array.\n\n* `\u003cOS\u003e/update/\u003cclient_version\u003e` - Contains necessary file for version update to `\u003cclient_version\u003e`. Note that updates are not incremental, so for example, updating from version 59.0 to 59.4 will require serving all files for 59.1, 59.2, 59.3, and 59.4, in that order.\n\n* `\u003cOS\u003e/update/\u003cclient_version\u003e/info.json` - Contains list of files for specific update version package, relative to `\u003cOS\u003e/update/\u003cclient_version\u003e` directory, where the key is the filename and the value is the file size. The order follows the filename such that `2.zip` comes **after** `1.zip`, not `10.zip` (this sorting order will be referred to \"natural sort\" from now on).\n\n* `\u003cOS\u003e/update/\u003cclient_version\u003e/external` - Contains extracted update files. Not needed.\n\n* `\u003cOS\u003e/package/info.json` - Contains list of all fully downloaded packages by `\u003cclient_version\u003e`.\n\n* `\u003cOS\u003e/package/\u003cclient_version\u003e/microdl_map.json` - Contains mapping of files which are served using micro download functionality. The key is the asset filename and the value is the archive path where this file reside, including the `archive-root/` directory.\n\n* `\u003cOS\u003e/package/\u003cclient_version\u003e/\u003cpackage_type\u003e/info.json` - Contains list of `\u003cpackage_id\u003e`s for the corresponding `\u003cpackage_type\u003e`.\n\n* `\u003cOS\u003e/package/\u003cclient_version\u003e/\u003cpackage_type\u003e/\u003cpackage_id\u003e/info.json` - Contains list of files for specific package type and id at specific client version, relative to `\u003cOS\u003e/update/\u003cclient_version\u003e` directory, where the key is the filename and the value is the file size. Ordered by natural sorting order.\n\n### Example `release_info.json`:\n\n```json\n{\n\t\"423\": \"UDKkj/dmBRbz+CIB+Ekqyg==\",\n\t\"1870\": \"Lckl38UoH8CfOMqMSmMYsA==\",\n\t\"1871\": \"acAmAWyPOCrO+R5qY9UTtQ==\"\n}\n```\n\nProtip: Complete keys gathered by the community are bundled as `release_info.json` in this repository.\n\n### Example `\u003cOS\u003e/update/info.json`\n\n```json\n[\"59.1\", \"59.2\", \"59.3\", \"59.4\"]\n```\n\n### Example `\u003cOS\u003e/update/info.json`\n\n```json\n{\n\t\"1.zip\": 12237086,\n\t\"2.zip\": 8725394,\n\t\"3.zip\": 1612,\n\t\"4.zip\": 318\n}\n```\n\n### Example `\u003cOS\u003e/package/info.json`\n\n```json\n[\"59.1\", \"59.2\", \"59.3\", \"59.4\"]\n```\n\n### Example `\u003cOS\u003e/package/\u003cclient_version\u003e/microdl_map.json`, 10 data, random order\n\n```json\n{\n\t// ...\n\t\"en/assets/image/sticker/tx_st_107_006.texb\": \"archive-root/iOS/package/59.4/4/0/336.zip\",\n\t\"en/assets/image/secretbox/navi/tx_navi_77711124.texb\": \"archive-root/iOS/package/59.4/4/0/66.zip\",\n\t\"assets/image/secretbox/appeal/tx_appeal_1255_a.texb\": \"archive-root/iOS/package/59.4/4/1820/1.zip\",\n\t\"en/assets/image/secretbox/appeal/tx_appeal_1485_b.texb\": \"archive-root/iOS/package/59.4/4/0/277.zip\",\n\t\"assets/image/units/tx_u_normal_card_52003002.texb\": \"archive-root/iOS/package/59.4/4/147/1.zip\",\n\t\"assets/image/secretbox/title/tx_title_366_7.texb\": \"archive-root/iOS/package/59.4/4/1262/1.zip\",\n\t\"en/assets/image/secretbox/appeal/tx_appeal_9991387.texb\": \"archive-root/iOS/package/59.4/4/0/37.zip\",\n\t\"assets/image/multi_unit/scenario/tx_ch_ms_002_001.texb\": \"archive-root/iOS/package/59.4/4/248/1.zip\",\n\t\"assets/image/units/tx_u_normal_navi_42002002.texb\": \"archive-root/iOS/package/59.4/4/0/130.zip\",\n\t\"assets/sound/voice/navi/vo_na_106_0604.mp3\": \"archive-root/iOS/package/59.4/4/0/328.zip\"\n\t// ...\n}\n```\n\nNote: Usually the `microdl_map.json` is 7MB in size.\n\n### Example `\u003cOS\u003e/package/\u003cclient_version\u003e/\u003cpackage_type\u003e/info.json`, where `\u003cpackage_type\u003e` is 1\n\n```json\n[\n\t578, 579, 580, 583, 584, 585, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603,\n\t604, 605, 606, 607, 614, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 633, 634, 635, 636, 637, 638, 639, 640,\n\t641, 642, 643, 644, 645, 646, 647, 648, 649, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665,\n\t666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688,\n\t689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 712,\n\t714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736,\n\t737, 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, 759,\n\t760, 761\n]\n```\n\n### Example `\u003cOS\u003e/package/\u003cclient_version\u003e/\u003cpackage_type\u003e/\u003cpackage_id\u003e/info.json`, where `\u003cpackage_type\u003e` is 1 and `\u003cpackage_id\u003e` is 747\n\n```json\n{\n\t\"1.zip\": 2131514,\n\t\"2.zip\": 198\n}\n```\n\nFor obvious reasons we can't provide download link to those files.\n\nOnce you have those files, create new virtual environment and install the necessary dependencies.\n\n```\npython -m venv venv\n(activate venv)\npip install --upgrade pip -r requirements.txt\n```\n\nRunning\n-----\n\nAfter having your archive-root data, you need a configuration file in TOML text file before running the program.\n`config.sample.toml` can be used for reference.\n\nAfter you have your config file, run `N4DLAPI_CONFIG_FILE=path/to/config.toml uvicorn n4dlapi:app`. It will listen\non `127.0.0.1:8000` as per uvicorn defaults.\n\nProtocol\n-----\n\nAnyone are allowed to implement NPPS4 DLAPI protocol without subject to zlib license restrictions. The zlib license restriction only applies **specifically to this reference implementation!**\n\n### Shared Key\n\nTo protect from rogue requests, the DLAPI server can be protected using shared key. This is done by\nrequiring `DLAPI-Shared-Key` header to match with the server-configured one. If it doesn't match, then\na 404 will be returned for all API endpoints.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ccode\u003eGET\u003c/code\u003e \u003ccode\u003e\u003cb\u003e/api/publicinfo\u003c/b\u003e\u003c/code\u003e\u003c/summary\u003e\n\nRetrieve information about the DLAPI server. A special configuration can be specified to\nalways serve this public information without shared key header.\n\n#### Responses\n\n```jsonc\n// HTTP Code 200\n{\n\t// Can the API be accessed publicly?\n\t// This can still be false even if this endpoint is accessible.\n\t\"publicApi\": true,\n\t// NPPS4-DLAPI API compilance version.\n\t// Note that there's no \"patch\" version. Only \"major\" and \"minor\" version.\n\t\"dlapiVersion\": {\n\t\t\"major\": 1,\n\t\t\"minor\": 0\n\t},\n\t// How long the download link will last (in seconds)? 0 means last indefinitely.\n\t\"serveTimeLimit\": 0,\n\t// What's the latest game version?\n\t\"gameVersion\": \"59.4\",\n\n\t\"application\": {\n\t\t// Application-specific data goes here.\n\t}\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ccode\u003ePOST\u003c/code\u003e \u003ccode\u003e\u003cb\u003e/api/v1/update\u003c/b\u003e\u003c/code\u003e\u003c/summary\u003e\n\nGet download links for update package to the latest version available.\n\n#### Parameters\n\n\u003e | name      | type     | data type      | description                              |\n\u003e |-----------|----------|----------------|------------------------------------------|\n\u003e | version   | required | string         | Old client version                       |\n\u003e | platform  | required | int            | Platform type. 1 for iOS, 2 for Android. |\n\n#### Responses (v1.1)\n\n```jsonc\n// HTTP Code 200\n[\n\t// ... more items\n\t// For each item in this array\n\t{\n\t\t// Direct link to download.\n\t\t// Link must be publicly accessible even without Shared Key header.\n\t\t\"url\": \"http://localhost/download/update_59.4.zip\",\n\t\t// Archive size in bytes.\n\t\t\"size\": 12345,\n\t\t\"checksums\": {\n\t\t\t// For checksums, MD5 and SHA256 is required.\n\t\t\t// Other checksums for application-specific usage is allowed.\n\t\t\t\"md5\": \"d41d8cd98f00b204e9800998ecf8427e\",\n\t\t\t\"sha256\": \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\n\t\t},\n\t\t// Update version\n\t\t\"version\": \"59.4\"\n\t}\n\t// ... more items\n]\n```\n\n#### Responses (v1.0)\n\n```jsonc\n// HTTP Code 200\n[\n\t// ... more items\n\t// For each item in this array\n\t{\n\t\t// Direct link to download.\n\t\t// Link must be publicly accessible even without Shared Key header.\n\t\t\"url\": \"http://localhost/download/update_59.4.zip\",\n\t\t// Archive size in bytes.\n\t\t\"size\": 12345,\n\t\t\"checksums\": {\n\t\t\t// For checksums, MD5 and SHA256 is required.\n\t\t\t// Other checksums for application-specific usage is allowed.\n\t\t\t\"md5\": \"d41d8cd98f00b204e9800998ecf8427e\",\n\t\t\t\"sha256\": \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\n\t\t}\n\t}\n\t// ... more items\n]\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ccode\u003ePOST\u003c/code\u003e \u003ccode\u003e\u003cb\u003e/api/v1/batch\u003c/b\u003e\u003c/code\u003e\u003c/summary\u003e\n\nGet all download links of package IDs for specific package type.\n\n#### Parameters\n\n\u003e | name         | type     | data type   | description                                            |\n\u003e |--------------|----------|-------------|--------------------------------------------------------|\n\u003e | package_type | required | int         | Package type. See below for valid `package_type`s.     |\n\u003e | platform     | required | int         | Platform type. 1 for iOS, 2 for Android.               |\n\u003e | exclude      | optional | list of int | List of package ID to exclude. Defaults to empty list. |\n\n#### Possible HTTP Code\n\n* 200 - Request is fulfilled.\n* 404 - Package not found.\n\n#### Responses\n\n```jsonc\n// HTTP Code 200\n[\n\t// ... more items\n\t// For each item in this array\n\t{\n\t\t// Direct link to download.\n\t\t// Link must be publicly accessible even without Shared Key header.\n\t\t\"url\": \"http://localhost/download/0_0_59.4.zip\",\n\t\t// The package ID group of this archive.\n\t\t\"packageId\": 0,\n\t\t// Archive size in bytes.\n\t\t\"size\": 12345,\n\t\t\"checksums\": {\n\t\t\t// For checksums, MD5 and SHA256 is required.\n\t\t\t// Other checksums for application-specific usage is allowed.\n\t\t\t\"md5\": \"d41d8cd98f00b204e9800998ecf8427e\",\n\t\t\t\"sha256\": \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\n\t\t}\n\t}\n\t// ... more items\n]\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ccode\u003ePOST\u003c/code\u003e \u003ccode\u003e\u003cb\u003e/api/v1/download\u003c/b\u003e\u003c/code\u003e\u003c/summary\u003e\n\nGet download links for specific package type and package id.\n\n#### Parameters\n\n\u003e | name         | type     | data type | description                                        |\n\u003e |--------------|----------|-----------|----------------------------------------------------|\n\u003e | package_type | required | int       | Package type. See below for valid `package_type`s. |\n\u003e | package_id   | required | int       | Package ID. See below for possible `package_id`s.  |\n\u003e | platform     | required | int       | Platform type. 1 for iOS, 2 for Android.           |\n\n#### Possible HTTP Code\n\n* 200 - Request is fulfilled.\n* 404 - Package not found.\n\n#### Responses\n\n```jsonc\n// HTTP Code 200\n[\n\t// ... more items\n\t// For each item in this array\n\t{\n\t\t// Direct link to download.\n\t\t// Link must be publicly accessible even without Shared Key header.\n\t\t\"url\": \"http://localhost/download/0_0_59.4.zip\",\n\t\t// Archive size in bytes.\n\t\t\"size\": 12345,\n\t\t\"checksums\": {\n\t\t\t// For checksums, MD5 and SHA256 is required.\n\t\t\t// Other checksums for application-specific usage is allowed.\n\t\t\t\"md5\": \"d41d8cd98f00b204e9800998ecf8427e\",\n\t\t\t\"sha256\": \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\n\t\t}\n\t}\n\t// ... more items\n]\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ccode\u003eGET\u003c/code\u003e \u003ccode\u003e\u003cb\u003e/api/v1/getdb/{name}\u003c/b\u003e\u003c/code\u003e\u003c/summary\u003e\n\nGet decrypted database file.\n\n#### Parameters\n\n\u003e | name | type     | data type | description          |\n\u003e |------|----------|-----------|----------------------|\n\u003e | name | required | string    | Name of the database |\n\n#### Possible HTTP Code\n\n* 200 - Request is fulfilled. The contents of the whole SQLite3 database is sent. (`Content-Type: application/vnd.sqlite3`)\n* 404 - Database not found.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ccode\u003ePOST\u003c/code\u003e \u003ccode\u003e\u003cb\u003e/api/v1/getfile\u003c/b\u003e\u003c/code\u003e\u003c/summary\u003e\n\nGet single file from package type 4.\n\n#### Parameters\n\n\u003e | name     | type     | data type      | description                              |\n\u003e |----------|----------|----------------|------------------------------------------|\n\u003e | files    | required | list of string | List of files to retrieve.               |\n\u003e | platform | required | int            | Platform type. 1 for iOS, 2 for Android. |\n\n#### Possible HTTP Code\n\n* 200 - Request is fulfilled.\n\n#### Responses\n```jsonc\n// HTTP Code 200\n[\n\t// ... more items\n\t// For each item in this array\n\t{\n\t\t// Direct link to download.\n\t\t// Link must be publicly accessible even without Shared Key header.\n\t\t// If file is not found, then it still must provide valid-but-404 URL!\n\t\t\"url\": \"http://localhost/download/assets/image/tx_foo.texb\",\n\t\t// Archive size in bytes.\n\t\t// If the file is not found, the size must be 0.\n\t\t\"size\": 12345,\n\t\t\"checksums\": {\n\t\t\t// For checksums, MD5 and SHA256 is required.\n\t\t\t// Other checksums for application-specific usage is allowed.\n\t\t\t// If the file is not found, the hash of null input must be specified.\n\t\t\t\"md5\": \"d41d8cd98f00b204e9800998ecf8427e\",\n\t\t\t\"sha256\": \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\n\t\t}\n\t}\n\t// ... more items\n]\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003ccode\u003eGET\u003c/code\u003e \u003ccode\u003e\u003cb\u003e/api/v1/release_info\u003c/b\u003e\u003c/code\u003e\u003c/summary\u003e\n\nGet available `release_info` keys.\n\n#### Parameters\n\n\u003e | name | type     | data type | description          |\n\u003e |------|----------|-----------|----------------------|\n\u003e | name | required | string    | Name of the database |\n\n#### Possible HTTP Code\n\n* 200 - Request is fulfilled.\n\n#### Responses\n```jsonc\n// HTTP Code 200\n{\n\t// ... keys\n\t// The \"key\" is package_id for package_type 4, the value is gamedb row decryption key, base64-encoded.\n\t\"423\": \"UDKkj/dmBRbz+CIB+Ekqyg==\",\n\t\"1874\": \"T18sDsU+81wLXTjCURNxJw==\"\n\t// ... keys\n}\n```\n\n\u003c/details\u003e\n\n**Note**: Application-specific endpoint must go through `/api/app` path!\n\n### List of valid `\u003cpackage_type\u003e`s and where to find the `\u003cpackage_id\u003e`s:\n\n* 0: Always 0.\n* 1: `live_track_id` column in `live_track_m` table in `live/live.db_`\n* 2: `scenario_chapter_id` column in `scenario_chapter_m` table in `scenario/scenario.db_`.\n* 3: `unit_id` column in `subscenario_m` table in `subscenario/subscenario.db_`.\n* 4: Not available. All possible package_id is stored server-side and only exposed at certain times at `release_info.json` key ID.\n* 5: `event_scenario_id` column in `event_scenario_m` table in `event/event_common.db_`.\n* 6: `multi_unit_scenario_id` column in `multi_unit_scenario_m` table in `multi_unit_scenario/multi_unit_scenario.db_`.\n\nNote: `included_pkg_m` in `bootstrap.db_` contains list of preloaded packages.\n\nContributing\n-----\n\nCodebase in this reference implementation is formatted using [`black`](https://github.com/psf/black) formatter,\nwith max line of 120 lines (`-l 120`).\n\nThere's no CLA. Anyone is free to contribute.\n\nLicense\n-----\n\nThis reference implementation is licensed under zlib/libpng license.\n\nNote that certain helper files are licensed under MIT instead. This includes:\n\n* `update_v1.1.py`\n* `update_v1.2.py`\n* `clone.py`\n\nProtocol Change History:\n-----\n\n### v1.2\n\nRename all zip files to have SHA256 on its filename due to buggy game behavior with its download mechanism.\nNo API changes.\n\n### v1.1\n\nExpand microdl file mapping and improved information JSON file.\n\n### v1.0\n\nInitial protocol release.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdarkenergyprocessor%2Fnpps4-dlapi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdarkenergyprocessor%2Fnpps4-dlapi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdarkenergyprocessor%2Fnpps4-dlapi/lists"}