<!-- SPDX-FileCopyrightText: 2024 FC (Fay) Stegerman <flx@obfusk.net> -->
<!-- SPDX-License-Identifier: AGPL-3.0-or-later -->
[![GitHub Release](https://img.shields.io/github/release/obfusk/apkrepotool.svg?logo=github)](https://github.com/obfusk/apkrepotool/releases)
[![PyPI Version](https://img.shields.io/pypi/v/apkrepotool.svg)](https://pypi.python.org/pypi/apkrepotool)
[![Python Versions](https://img.shields.io/pypi/pyversions/apkrepotool.svg)](https://pypi.python.org/pypi/apkrepotool)
[![CI](https://github.com/obfusk/apkrepotool/actions/workflows/ci.yml/badge.svg)](https://github.com/obfusk/apkrepotool/actions/workflows/ci.yml)
[![AGPLv3+](https://img.shields.io/badge/license-AGPLv3+-blue.svg)](https://www.gnu.org/licenses/agpl-3.0.html)
<p align="center">
<img src="icon.svg" alt="apkrepotool logo" width="160" />
</p>
# apkrepotool - manage APK repos
`apkrepotool` is a tool for managing APK repositories that can be used with an
F-Droid-compatible client; specifically, it generates v1 & v2 index JSON & JAR
files from a compatible directory structure with the required YAML metadata and
fastlane metadata & image files.
## Setup
See "Keystore & Icon" below for how to generate a keystore and use a generic
icon if you don't have one of your own; see "Configuration Files" for
configuration file examples; see "Directory Structure" for where all the
necessary files go.
### Requirements: Apps, Configuration, Metadata
* keystore (to sign the index) -- keep this safe and backed up!
* PNG icon (for the repository itself)
* YAML config file (`config.yml`) specifying the repo details and paths to the keystore etc.
* per-app YAML files (`metadata/my.app.id.yml`) specifying details for each app
* fastlane-compatible metadata files (`full_description.txt` etc.)
* fastlane-compatible image files (`icon.png`, `featureGraphic.png`, etc.)
* APK files for each app
### Requirements: Software
* Python, `apkrepotool` and its dependencies (e.g. `pip install apkrepotool`)
* OpenJDK (e.g. `apt install openjdk-11-jdk-headless`)
* `apksigner` JAR file (e.g. `apt install apksigner` or e.g.
`/path/to/Android/Sdk/build-tools/34.0.0/lib/apksigner.jar` from an installed
Android SDK)
### Keystore & Icon
NB: you probably don't want to accidentally commit your keystore and/or
passwords to git! And please make sure you pay attention to the key properties
since you can't change the signing key later.
NB: this is an example; replace `myrepo` with something more appropriate, use
sensible values for the distinguished name etc., make sure the key size and
validity are appropriate for your use.
See "Configuration Files" below for options for storing the keystore password.
```bash
$ mkdir myrepo
$ cd myrepo
$ keytool -genkey -v -keystore keystore.jks -alias myrepo -keyalg RSA -keysize 4096 -sigalg SHA512withRSA -validity 10000
$ mkdir -p repo/icons
$ wget -O repo/icons/icon.png -- https://github.com/obfusk/apkrepotool/raw/master/icon.png
$ vim config.yml
```
## CLI
```bash
$ apkrepotool update -v
Processing 'repo/catima-v2.28.0.apk'...
'me.hackerchick.catima':133 ('2.28.0')
Processing 'repo/catima-v2.29.0.apk'...
'me.hackerchick.catima':134 ('2.29.0')
Processing 'repo/jiten-webview-1.0.3.apk'...
'dev.obfusk.jiten_webview':202108010 ('1.0.3')
Processing 'metadata/dev.obfusk.jiten_webview.yml'...
Processing 'metadata/me.hackerchick.catima.yml'...
Writing index-v1.json...
Writing index-v2.json...
Writing diff/1714265787000.json...
Writing entry.json...
Writing cache/repo/1714266451000.json...
Signing index-v1.jar...
Signing entry.jar...
```
## Directory Structure
<details>
```
.
├── cache # generated by apkrepotool
├── config.yml # main config file
├── keystore.jks # don't accidentally commit this!
├── metadata
│ ├── dev.obfusk.jiten_webview # fastlane metadata
│ │ └── en-US
│ │ ├── full_description.txt
│ │ └── short_description.txt
│ ├── dev.obfusk.jiten_webview.yml # app metadata
│ ├── me.hackerchick.catima # fastlane metadata
│ │ ├── de-DE
│ │ │ ├── changelogs
│ │ │ │ ├── 133.txt
│ │ │ │ └── 134.txt
│ │ │ ├── full_description.txt
│ │ │ ├── short_description.txt
│ │ │ └── title.txt
│ │ ├── en-US
│ │ │ ├── changelogs
│ │ │ │ ├── 133.txt
│ │ │ │ └── 134.txt
│ │ │ ├── full_description.txt
│ │ │ ├── short_description.txt
│ │ │ └── title.txt
│ │ └── zh-TW
│ │ ├── full_description.txt
│ │ ├── short_description.txt
│ │ └── title.txt
│ └── me.hackerchick.catima.yml # app metadata
└── repo
├── catima-v2.28.0.apk # put APKs here
├── catima-v2.29.0.apk # put APKs here
├── dev.obfusk.jiten_webview # put images here
│ └── en-US
│ ├── featureGraphic.png
│ ├── icon.png
│ └── phoneScreenshots
│ ├── 1.png
│ ├── 2.png
│ ├── 3.png
│ ├── 4.png
│ └── 5.png
├── diff # generated by apkrepotool
├── entry.jar # generated by apkrepotool
├── entry.json # generated by apkrepotool
├── icons
│ └── icon.png # put icon.png here
├── index-v1.jar # generated by apkrepotool
├── index-v1.json # generated by apkrepotool
├── index-v2.json # generated by apkrepotool
├── jiten-webview-1.0.3.apk # put APKs here
└── me.hackerchick.catima # put images here
├── de-DE
│ └── featureGraphic.png
├── en-US
│ ├── featureGraphic.png
│ ├── icon.png
│ └── phoneScreenshots
│ ├── screenshot-01.png
│ ├── screenshot-02.png
│ ├── screenshot-03.png
│ ├── screenshot-04.png
│ ├── screenshot-05.png
│ ├── screenshot-06.png
│ ├── screenshot-07.png
│ └── screenshot-08.png
└── zh-TW
└── featureGraphic.png
```
</details>
## Configuration Files
### config.yml
NB: this example uses `cat` and simply stores the passwords unencrypted in
plaintext file -- do not commit these to git! -- but you can easily use
something like `gpg -d /path/to/.keystorepass.gpg` to decrypt an encrypted
password file instead.
```yaml
# repo information
repo_url: https://example.com/fdroid/repo
repo_name: My Repo
repo_description: >-
This is a repository of apps to be used with an F-Droid-compatible client.
Applications in this repository are official binaries built by the original
application developers.
# signing config
repo_keyalias: myrepo
keystore: /path/to/keystore.jks
keystorepass_cmd: cat /path/to/.keystorepass
keypass_cmd: cat /path/to/.keypass
# optional settings
apkrepotool_dir: /path/to/apkrepotool_dir
apksigner_jar: /path/to/apksigner.jar
java_home: /usr/lib/jvm/java-11-openjdk-amd64
```
### metadata/me.hackerchick.catima.yml
```yaml
Categories:
- Money
License: GPL-3.0-or-later
AuthorName: Sylvia van Os
AuthorEmail: catima@example.com
AuthorWebSite: https://sylviavanos.nl
WebSite: https://catima.app/
SourceCode: https://github.com/CatimaLoyalty/Android
IssueTracker: https://github.com/CatimaLoyalty/Android/issues
Translation: https://hosted.weblate.org/projects/catima/catima/
Changelog: https://github.com/CatimaLoyalty/Android/blob/HEAD/CHANGELOG.md
Donate: https://paypal.me/sylviavanos
Name: Catima
AllowedAPKSigningKeys: d405cd69ede4c22074c328fb825689a84ab3fca4b3fdf0b6cc1333af62c67eb3
CurrentVersion: 2.29.0
CurrentVersionCode: 134
```
## Installing
### Using pip
```bash
$ pip install apkrepotool
```
### From git
NB: this installs the latest development version, not the latest release.
```bash
$ git clone https://github.com/obfusk/apkrepotool.git
$ cd apkrepotool
$ pip install -e .
```
NB: you may need to add e.g. `~/.local/bin` to your `$PATH` in order to run
`apkrepotool`.
To update to the latest development version:
```bash
$ cd apkrepotool
$ git pull --rebase
```
## Dependencies
Python >= 3.8 + `click` + `ruamel.yaml` + `repro-apk` >= 0.2.6.
### Debian/Ubuntu
```bash
$ apt install python3-pip python3-click python3-ruamel.yaml
$ pip install git+https://github.com/obfusk/reproducible-apk-tools.git@v0.2.6
```
## License
[![AGPLv3+](https://www.gnu.org/graphics/agplv3-155x51.png)](https://www.gnu.org/licenses/agpl-3.0.html)
<!-- vim: set tw=70 sw=2 sts=2 et fdm=marker : -->
Raw data
{
"_id": null,
"home_page": "https://github.com/obfusk/apkrepotool",
"name": "apkrepotool",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "android apk repo",
"author": "FC (Fay) Stegerman",
"author_email": "flx@obfusk.net",
"download_url": "https://files.pythonhosted.org/packages/6c/ee/60b79c069247a1f18a6a865e2f846f4de8f1063dca5f2f397286ede574ca/apkrepotool-0.0.1.tar.gz",
"platform": null,
"description": "<!-- SPDX-FileCopyrightText: 2024 FC (Fay) Stegerman <flx@obfusk.net> -->\n<!-- SPDX-License-Identifier: AGPL-3.0-or-later -->\n\n[![GitHub Release](https://img.shields.io/github/release/obfusk/apkrepotool.svg?logo=github)](https://github.com/obfusk/apkrepotool/releases)\n[![PyPI Version](https://img.shields.io/pypi/v/apkrepotool.svg)](https://pypi.python.org/pypi/apkrepotool)\n[![Python Versions](https://img.shields.io/pypi/pyversions/apkrepotool.svg)](https://pypi.python.org/pypi/apkrepotool)\n[![CI](https://github.com/obfusk/apkrepotool/actions/workflows/ci.yml/badge.svg)](https://github.com/obfusk/apkrepotool/actions/workflows/ci.yml)\n[![AGPLv3+](https://img.shields.io/badge/license-AGPLv3+-blue.svg)](https://www.gnu.org/licenses/agpl-3.0.html)\n\n<p align=\"center\">\n <img src=\"icon.svg\" alt=\"apkrepotool logo\" width=\"160\" />\n</p>\n\n# apkrepotool - manage APK repos\n\n`apkrepotool` is a tool for managing APK repositories that can be used with an\nF-Droid-compatible client; specifically, it generates v1 & v2 index JSON & JAR\nfiles from a compatible directory structure with the required YAML metadata and\nfastlane metadata & image files.\n\n## Setup\n\nSee \"Keystore & Icon\" below for how to generate a keystore and use a generic\nicon if you don't have one of your own; see \"Configuration Files\" for\nconfiguration file examples; see \"Directory Structure\" for where all the\nnecessary files go.\n\n### Requirements: Apps, Configuration, Metadata\n\n* keystore (to sign the index) -- keep this safe and backed up!\n* PNG icon (for the repository itself)\n* YAML config file (`config.yml`) specifying the repo details and paths to the keystore etc.\n* per-app YAML files (`metadata/my.app.id.yml`) specifying details for each app\n* fastlane-compatible metadata files (`full_description.txt` etc.)\n* fastlane-compatible image files (`icon.png`, `featureGraphic.png`, etc.)\n* APK files for each app\n\n### Requirements: Software\n\n* Python, `apkrepotool` and its dependencies (e.g. `pip install apkrepotool`)\n* OpenJDK (e.g. `apt install openjdk-11-jdk-headless`)\n* `apksigner` JAR file (e.g. `apt install apksigner` or e.g.\n `/path/to/Android/Sdk/build-tools/34.0.0/lib/apksigner.jar` from an installed\n Android SDK)\n\n### Keystore & Icon\n\nNB: you probably don't want to accidentally commit your keystore and/or\npasswords to git! And please make sure you pay attention to the key properties\nsince you can't change the signing key later.\n\nNB: this is an example; replace `myrepo` with something more appropriate, use\nsensible values for the distinguished name etc., make sure the key size and\nvalidity are appropriate for your use.\n\nSee \"Configuration Files\" below for options for storing the keystore password.\n\n```bash\n$ mkdir myrepo\n$ cd myrepo\n$ keytool -genkey -v -keystore keystore.jks -alias myrepo -keyalg RSA -keysize 4096 -sigalg SHA512withRSA -validity 10000\n$ mkdir -p repo/icons\n$ wget -O repo/icons/icon.png -- https://github.com/obfusk/apkrepotool/raw/master/icon.png\n$ vim config.yml\n```\n\n## CLI\n\n```bash\n$ apkrepotool update -v\nProcessing 'repo/catima-v2.28.0.apk'...\n 'me.hackerchick.catima':133 ('2.28.0')\nProcessing 'repo/catima-v2.29.0.apk'...\n 'me.hackerchick.catima':134 ('2.29.0')\nProcessing 'repo/jiten-webview-1.0.3.apk'...\n 'dev.obfusk.jiten_webview':202108010 ('1.0.3')\nProcessing 'metadata/dev.obfusk.jiten_webview.yml'...\nProcessing 'metadata/me.hackerchick.catima.yml'...\nWriting index-v1.json...\nWriting index-v2.json...\nWriting diff/1714265787000.json...\nWriting entry.json...\nWriting cache/repo/1714266451000.json...\nSigning index-v1.jar...\nSigning entry.jar...\n```\n\n## Directory Structure\n\n<details>\n\n```\n.\n\u251c\u2500\u2500 cache # generated by apkrepotool\n\u251c\u2500\u2500 config.yml # main config file\n\u251c\u2500\u2500 keystore.jks # don't accidentally commit this!\n\u251c\u2500\u2500 metadata\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev.obfusk.jiten_webview # fastlane metadata\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 en-US\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 full_description.txt\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 short_description.txt\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev.obfusk.jiten_webview.yml # app metadata\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 me.hackerchick.catima # fastlane metadata\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 de-DE\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 changelogs\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 133.txt\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 134.txt\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 full_description.txt\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 short_description.txt\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 title.txt\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 en-US\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 changelogs\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 133.txt\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 134.txt\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 full_description.txt\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 short_description.txt\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 title.txt\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 zh-TW\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 full_description.txt\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 short_description.txt\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 title.txt\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 me.hackerchick.catima.yml # app metadata\n\u2514\u2500\u2500 repo\n \u251c\u2500\u2500 catima-v2.28.0.apk # put APKs here\n \u251c\u2500\u2500 catima-v2.29.0.apk # put APKs here\n \u251c\u2500\u2500 dev.obfusk.jiten_webview # put images here\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 en-US\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 featureGraphic.png\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 icon.png\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 phoneScreenshots\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 1.png\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 2.png\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 3.png\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 4.png\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 5.png\n \u251c\u2500\u2500 diff # generated by apkrepotool\n \u251c\u2500\u2500 entry.jar # generated by apkrepotool\n \u251c\u2500\u2500 entry.json # generated by apkrepotool\n \u251c\u2500\u2500 icons\n \u2502 \u2514\u2500\u2500 icon.png # put icon.png here\n \u251c\u2500\u2500 index-v1.jar # generated by apkrepotool\n \u251c\u2500\u2500 index-v1.json # generated by apkrepotool\n \u251c\u2500\u2500 index-v2.json # generated by apkrepotool\n \u251c\u2500\u2500 jiten-webview-1.0.3.apk # put APKs here\n \u2514\u2500\u2500 me.hackerchick.catima # put images here\n \u251c\u2500\u2500 de-DE\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 featureGraphic.png\n \u251c\u2500\u2500 en-US\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 featureGraphic.png\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 icon.png\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 phoneScreenshots\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 screenshot-01.png\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 screenshot-02.png\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 screenshot-03.png\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 screenshot-04.png\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 screenshot-05.png\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 screenshot-06.png\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 screenshot-07.png\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 screenshot-08.png\n \u2514\u2500\u2500 zh-TW\n \u2514\u2500\u2500 featureGraphic.png\n```\n\n</details>\n\n## Configuration Files\n\n### config.yml\n\nNB: this example uses `cat` and simply stores the passwords unencrypted in\nplaintext file -- do not commit these to git! -- but you can easily use\nsomething like `gpg -d /path/to/.keystorepass.gpg` to decrypt an encrypted\npassword file instead.\n\n```yaml\n# repo information\nrepo_url: https://example.com/fdroid/repo\nrepo_name: My Repo\nrepo_description: >-\n This is a repository of apps to be used with an F-Droid-compatible client.\n Applications in this repository are official binaries built by the original\n application developers.\n\n# signing config\nrepo_keyalias: myrepo\nkeystore: /path/to/keystore.jks\nkeystorepass_cmd: cat /path/to/.keystorepass\nkeypass_cmd: cat /path/to/.keypass\n\n# optional settings\napkrepotool_dir: /path/to/apkrepotool_dir\napksigner_jar: /path/to/apksigner.jar\njava_home: /usr/lib/jvm/java-11-openjdk-amd64\n```\n\n### metadata/me.hackerchick.catima.yml\n\n```yaml\nCategories:\n - Money\nLicense: GPL-3.0-or-later\nAuthorName: Sylvia van Os\nAuthorEmail: catima@example.com\nAuthorWebSite: https://sylviavanos.nl\nWebSite: https://catima.app/\nSourceCode: https://github.com/CatimaLoyalty/Android\nIssueTracker: https://github.com/CatimaLoyalty/Android/issues\nTranslation: https://hosted.weblate.org/projects/catima/catima/\nChangelog: https://github.com/CatimaLoyalty/Android/blob/HEAD/CHANGELOG.md\nDonate: https://paypal.me/sylviavanos\n\nName: Catima\n\nAllowedAPKSigningKeys: d405cd69ede4c22074c328fb825689a84ab3fca4b3fdf0b6cc1333af62c67eb3\n\nCurrentVersion: 2.29.0\nCurrentVersionCode: 134\n```\n\n## Installing\n\n### Using pip\n\n```bash\n$ pip install apkrepotool\n```\n\n### From git\n\nNB: this installs the latest development version, not the latest release.\n\n```bash\n$ git clone https://github.com/obfusk/apkrepotool.git\n$ cd apkrepotool\n$ pip install -e .\n```\n\nNB: you may need to add e.g. `~/.local/bin` to your `$PATH` in order to run\n`apkrepotool`.\n\nTo update to the latest development version:\n\n```bash\n$ cd apkrepotool\n$ git pull --rebase\n```\n\n## Dependencies\n\nPython >= 3.8 + `click` + `ruamel.yaml` + `repro-apk` >= 0.2.6.\n\n### Debian/Ubuntu\n\n```bash\n$ apt install python3-pip python3-click python3-ruamel.yaml\n$ pip install git+https://github.com/obfusk/reproducible-apk-tools.git@v0.2.6\n```\n\n## License\n\n[![AGPLv3+](https://www.gnu.org/graphics/agplv3-155x51.png)](https://www.gnu.org/licenses/agpl-3.0.html)\n\n<!-- vim: set tw=70 sw=2 sts=2 et fdm=marker : -->\n",
"bugtrack_url": null,
"license": "AGPLv3+",
"summary": "manage APK repos",
"version": "0.0.1",
"project_urls": {
"Homepage": "https://github.com/obfusk/apkrepotool"
},
"split_keywords": [
"android",
"apk",
"repo"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "7b792842597be16023970b1f1a7352fdeb7a036b5d3df7103794ddbc8e472105",
"md5": "3995a22428b52ce0d15605b060e95697",
"sha256": "a354b32ab899debebdc29dbc29f4b821101b28287da7da66da658bdbd07da3ac"
},
"downloads": -1,
"filename": "apkrepotool-0.0.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "3995a22428b52ce0d15605b060e95697",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 30220,
"upload_time": "2024-05-16T23:33:31",
"upload_time_iso_8601": "2024-05-16T23:33:31.880283Z",
"url": "https://files.pythonhosted.org/packages/7b/79/2842597be16023970b1f1a7352fdeb7a036b5d3df7103794ddbc8e472105/apkrepotool-0.0.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "6cee60b79c069247a1f18a6a865e2f846f4de8f1063dca5f2f397286ede574ca",
"md5": "8a3c9ed0d01416c6b09418901a5bb510",
"sha256": "e515ca1174185ce4cc197dc3ed091c39d799b591dc7f280d7bb9ae41465cdd7d"
},
"downloads": -1,
"filename": "apkrepotool-0.0.1.tar.gz",
"has_sig": false,
"md5_digest": "8a3c9ed0d01416c6b09418901a5bb510",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 60075,
"upload_time": "2024-05-16T23:33:33",
"upload_time_iso_8601": "2024-05-16T23:33:33.714454Z",
"url": "https://files.pythonhosted.org/packages/6c/ee/60b79c069247a1f18a6a865e2f846f4de8f1063dca5f2f397286ede574ca/apkrepotool-0.0.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-05-16 23:33:33",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "obfusk",
"github_project": "apkrepotool",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "apkrepotool"
}