用于与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_assetSession.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())

待办事项

按优先级大致排序。

  • 文档字符串
  • 社区功能请求?
  • 单元测试
  • 电阻式温度检测器
  • 状态更新的挂接点(如长时间下载的进度条)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
JavaHTTP。请求侦听器   java Selenium webdriver遍历行并仅检索某些列   JavaSpring批处理在启动运行方法之前启动SimpleZoblancher运行方法   maven如何使用Maven2从javadoc生成java源代码?   java为什么我的Unicodont(Slick2D)不画画?   java取消对未使用对象的引用是否会提高冗长方法的性能?   java可执行Jar的画布比使用Eclipse Runner的小   为什么我的for循环在Android studio中与eclipse(java)产生不同的结果   java代码段字节数组到端口号   java在DynamoDB范围键中插入项   java 安卓。看法WindowManager$BadTokenException:无法添加窗口,您的活动正在运行吗?   java我想要两个列表视图同时滚动   java测试数据分离   java Saxon:每次重新部署后都需要重新启动Glassfish