diff --git a/README.md b/README.md index 165128b..dc8660c 100644 --- a/README.md +++ b/README.md @@ -9,12 +9,35 @@ This is a script repository for scraping Zotero addon collections for [Zotero](h The script utilizes the GitHub API and GitHub Actions to automatically scrape and parse addon information from the [addons](addons) folder, and publish to [`publish`](https://github.com/syt2/zotero-addons-scraper/blob/publish/addon_infos.json) branch and the latest release every day. ## Contributing New Addons -If you have new add-ons to parse, add the json information of the add-on with the name format of `repo.replace('/', '#').json` in the [addons](addons) folder with the format +If you have a new add-on to add, add an add-on information file in the [addons](addons) folder. + +> typically, name it with `repo.replace('/', '#').json` +> +> If an add-on has different IDs for different Zotero versions, split them into multiple JSON files with different filename. + +The file format should be as follows: + ``` json { "id": "zoteroAddons@ytshen.com", "name": "Zotero Addons", "repo": "syt2/zotero-addons", + "releases": [ + { + "targetZoteroVersion": "7", + "tagName": "latest" + }, + { + "targetZoteroVersion": "6", + "tagName": "0.6.0-3" + } + ] +} +``` +or +``` json +{ + "repo": "syt2/zotero-scipdf", "releases": [ { "targetZoteroVersion": "7", @@ -24,72 +47,6 @@ If you have new add-ons to parse, add the json information of the add-on with th } ``` -## Addon Information Format +## Generated Format +The output format for add-on information follows the format specified in [zotero-chinese/zotero-plugins](https://github.com/zotero-chinese/zotero-plugins). -The output format for add-on information follows the format specified in [zotero-chinese/zotero-plugins](https://github.com/zotero-chinese/zotero-plugins), which is as follows: -```ts -export interface PluginInfo { - id?: string; - /** - * 插件名称 - */ - name: string; - /** - * 插件仓库 - * - * 例如:northword/zotero-format-metadata - * - * 注意前后均无 `/` - */ - repo: string; - /** - * 插件的发布地址信息 - */ - releases: Array<{ - /** - * 当前发布版对应的 Zotero 版本 - */ - targetZoteroVersion: string; - /** - * 当前发布版对应的下载通道 - * - * `latest`:最新正式发布; - * `pre`:最新预发布; - * `string`:发布对应的 `git.tag_name`; - * 注意 `git.tag_name` 有的有 `v` 而有的没有,可以通过发布链接来判断 - */ - tagName: "latest" | "pre" | string; - - currentVersion?: string; - xpiDownloadUrl?: { - github: string; - gitee: string; - ghProxy: string; - jsdeliver: string; - kgithub: string; - }; - releaseData?: string; - downloadCount?: number; - assetId?: number; - - /** - * 从插件中解析的信息 - * - * TODO:后续视 zotero-chinese/zotero-plugins 的情况更新 - */ - xpiInfo?: { - id?: string; - name?: string; - currentVersion?: string; - }; - }>; - - description?: string; - star?: number; - author?: { - name: string; - url: string; - avatar: string; - }; -} -``` diff --git a/addon_keys.py b/addon_keys.py index d70c531..8b65c24 100644 --- a/addon_keys.py +++ b/addon_keys.py @@ -19,39 +19,29 @@ star = "star" author = "author" url = "url" avatar = "avatar" -xpiInfo = "xpiInfo" # from https://github.com/zotero-chinese/zotero-plugins/blob/main/src/plugins.ts # export interface PluginInfo { -# /** -# * 插件名称 -# */ -# name: string; -# /** -# * 插件仓库 -# * -# * 例如:northword/zotero-format-metadata -# * -# * 注意前后均无 `/` -# */ +# // plugin id +# id?: string; +# +# // plugin name +# name?: string; +# +# // plugin repository address on GitHub +# // e.g., syt2/zotero-addons # repo: string; -# /** -# * 插件的发布地址信息 -# */ +# +# // plugin releases information # releases: Array<{ -# /** -# * 当前发布版对应的 Zotero 版本 -# */ +# // Zotero version corresponding to current release # targetZoteroVersion: string; -# /** -# * 当前发布版对应的下载通道 -# * -# * `latest`:最新正式发布; -# * `pre`:最新预发布; -# * `string`:发布对应的 `git.tag_name`; -# * 注意 `git.tag_name` 有的有 `v` 而有的没有,可以通过发布链接来判断 -# */ +# +# // Download channel corresponding to the current release version +# // `latest`: Latest stable release +# // `pre`: Latest pre-release +# // `string`: Corresponding to the `git.tag_name` of the release; # tagName: "latest" | "pre" | string; # # currentVersion?: string; @@ -65,13 +55,6 @@ xpiInfo = "xpiInfo" # releaseData?: string; # downloadCount?: number; # assetId?: number; -# -# TODO:视 zotero-chinese/zotero-plugins情况更新 -# xpiInfo?: { -# id?: string; -# name?: string; -# currentVersion?: string; -# }; # }>; # # description?: string; @@ -81,4 +64,4 @@ xpiInfo = "xpiInfo" # url: string; # avatar: string; # }; -# } \ No newline at end of file +# } diff --git a/main.py b/main.py index daa7cbf..8679e4a 100644 --- a/main.py +++ b/main.py @@ -144,16 +144,36 @@ def parse(plugin, **kwargs): details = addon_details(xpi_filepath) except Exception as e: print(f'fetch addon detail of {plugin[repo]} failed: {e}') + # 对齐zotero-chinese的格式 + # if details: + # xpi_info = {} + # if "id" in details: + # xpi_info[id] = details["id"] + # if "name" in details: + # xpi_info[name] = details["name"] + # if "version" in details: + # xpi_info[currentVersion] = details["version"] + # if xpi_info: + # release[xpiInfo] = xpi_info + if details: - xpi_info = {} - if "id" in details: - xpi_info[id] = details["id"] - if "name" in details: - xpi_info[name] = details["name"] - if "version" in details: - xpi_info[currentVersion] = details["version"] - if xpi_info: - release[xpiInfo] = xpi_info + if detail_id := details.get('id'): + if plugin.get(id) and plugin[id] != detail_id: + print('🆘🆘🆘🆘🆘🆘🆘🆘🆘🆘🆘🆘🆘🆘🆘🆘🆘🆘') + print(f'Addon id not matched in {plugin[repo]}') + print(f'{plugin[id]} <===> {detail_id}') + print('🆘🆘🆘🆘🆘🆘🆘🆘🆘🆘🆘🆘🆘🆘🆘🆘🆘🆘') + plugin[id] = detail_id + if not plugin.get(name) and (detail_name := details.get('name')): + plugin[name] = detail_name + if detail_version := details.get('version'): + release[currentVersion] = detail_version + if not plugin.get(description) and (detail_desc := details.get('description')): + if detail_desc != '__MSG_description__': + plugin[description] = detail_desc + else: + # todo: read from i18n + pass release_infos.append(release) except Exception as e: diff --git a/moz_addons.py b/moz_addons.py index 6e566a2..a3fbe3e 100644 --- a/moz_addons.py +++ b/moz_addons.py @@ -19,7 +19,7 @@ def addon_details(addon_path): 'unpack': False } # whether to unpack the addon """ - details = {"id": None, "unpack": False, "name": None, "version": None} + details = {"id": None, "unpack": False, "name": None, "version": None, "description": None} def get_namespace_id(doc, url): attributes = doc.documentElement.attributes @@ -80,6 +80,7 @@ def addon_details(addon_path): if is_webext: details["version"] = manifest["version"] details["name"] = manifest["name"] + details["description"] = manifest["description"] # Bug 1572404 - we support two locations for gecko-specific # metadata. for location in ("applications", "browser_specific_settings"):