用于与opengameart.org资产交互的库
oga的Python项目详细描述
主要是从OpenGAMART查询和下载资产。此库不管理集合、发布或编辑 评论。将来,它可能用于上载或修改您的资产。
安装
pip install oga
使用cli
cli可用于搜索、下载和描述资产。
$ oga --help Usage: oga [OPTIONS] COMMAND [ARGS]... Search and download assets from OpenGameArt.org Options: --config-path PATH --root-dir DIRECTORY --url TEXT --max-conns INTEGER --help Show this message and exit. Commands: describe Look up a single ASSET. download Download files for a single ASSET. search Search for an asset.
示例命令
描述单个资产。资产id是opengameart url中/content/之后的所有内容:
$ oga describe imminent-threat imminent-threat music (24 favorites, 23 tags) $ oga describe imminent-threat --verbose { "author": "matthew-pablo", "favorites": 24, "files": [ { "etag": "2e9386d-4f63b81cc5d00", "id": "Imminent Threat Collection.zip", "size": 48838765 } ], "id": "imminent-threat", "licenses": [ "CC-BY-SA 3.0" ], "tags": [ "Action", "stealth", # ... ], "type": "Music" }
下载单个资产:
$ oga download imminent-threat
使用简单的基于每个文件ETag的缓存可避免重新下载相同的blob:
$ time oga download imminent-threat real 0m8.443s user 0m1.944s sys 0m0.592s $ time oga download imminent-threat real 0m0.780s user 0m0.444s sys 0m0.080s
今后,对于最近查询到的包,描述和下载操作应该比现在快得多, 不检查资产etag,也不缓存资产描述(仅缓存文件etag)。
搜索资产:
$ oga search --type music --tag epic --tag viking heroic-demise-updated-version music (86 favorites, 12 tags) battle-theme-a music (76 favorites, 6 tags) rise-of-spirit music (71 favorites, 4 tags) space-boss-battle-theme music (57 favorites, 31 tags) rpg-battle-theme-the-last-encounter-0 music (53 favorites, 26 tags) dark-descent music (44 favorites, 8 tags) dream-raid-cinematic-action-soundtrack music (44 favorites, 17 tags) space-orchestral music (41 favorites, 3 tags) # ... $ oga search --type music --tag epic --tag viking --tag-op and # no results with both tags! $ oga search --type music --license cc0 --tag epic battle-theme-a music (76 favorites, 6 tags) boss-battle-music music (19 favorites, 3 tags) new-sunrise music (9 favorites, 15 tags) the-rush music (8 favorites, 13 tags) # ...
输出格式
资源的默认输出是一个简短的摘要,可以剪切并通过管道传输到其他命令。其格式为:
<asset_id> <type> (<\d+> favorites, <\d+> tags) # oga search --submitter xmo --type 3d --type texture graveyard-and-crypt 3d (9 favorites, 11 tags) my-blender-skins texture (6 favorites, 9 tags) posable-poultry 3d (5 favorites, 9 tags)
使用常用工具,您可以将此命令传送到其他命令,例如下载:
oga search --submitter xmo --type 3d --type texture \ | cut -d" " -f1 \ | xargs -n1 oga download
使用--verbose:
$ oga describe imminent-threat --verbose { "author": "matthew-pablo", "favorites": 24, "files": [ { "etag": "2e9386d-4f63b81cc5d00", "id": "Imminent Threat Collection.zip", "size": 48838765 } ], "id": "imminent-threat", "licenses": [ "CC-BY-SA 3.0" ], "tags": [ "Action", "stealth", # ... ], "type": "Music" }
使用库
下载资产
一项资产
按5行下载资产:
>>>fromogaimportSession>>>session=Session()>>>asset_id="imminent-threat">>>asset=session.loop.run_until_complete(session.describe_asset(asset_id))>>>session.loop.run_until_complete(session.download_asset(asset))
多种资产
让我们利用异步客户机,同时下载一些资产:
>>>importasyncio>>>fromogaimportConfig,Session>>>config=Config.default()>>>config.max_conns=200# please be nice>>>session=Session(config)>>>asyncdefdownload(asset_id):...asset=awaitsession.describe_asset(asset_id)...awaitsession.download_asset(asset)...>>>asset_ids=[..."free-music-pack",..."battle-theme-a",..."rise-of-spirit",..."town-theme-rpg",..."soliloquy"]>>>task=asyncio.wait(...[download(id)foridinasset_ids],...loop=session.loop,...return_when=asyncio.ALL_COMPLETED)>>>session.loop.run_until_complete(task)
缓存
这个库使用一个非常简单的(哑)跟踪器来避免基于每个库的ETag重新下载资产文件 文件。因为oga不发布内容散列,所以可以修改下载的文件,然后 追踪。
搜索资产
搜索使用异步生成器,因此不需要获取每个结果就可以开始处理它们。
fromogaimportSessionsession=Session()# submitter name begins with or contains 'xmo'search=session.search(submitter="xmo")asyncdefcollect(async_generator):"""Helper to block and collapse an async generator into a single list"""results=[]asyncforresultinasync_generator:results.append(result)returnresultsresults=session.loop.run_until_complete(collect(search))print(results)# ['graveyard-and-crypt', 'my-blender-skins', 'posable-poultry']
同步客户端
同步客户端公开Session.download_asset和Session.describe_asset的批处理操作。
>>>fromogaimportSynchronizedSession>>>session=SynchronizedSession()>>>assets=session.batch_describe_assets([..."free-music-pack",..."battle-theme-a",..."rise-of-spirit",..."town-theme-rpg",..."soliloquy"...])>>>session.batch_download_assets(assets.values())
待办事项
按优先级大致排序。
- 文档字符串
- 社区功能请求?
- 单元测试
- 电阻式温度检测器
- 状态更新的挂接点(如长时间下载的进度条)