| Index: sky/tools/publish_apk.py
|
| diff --git a/sky/tools/publish_apk.py b/sky/tools/publish_apk.py
|
| new file mode 100755
|
| index 0000000000000000000000000000000000000000..93cecab85752f12fd73f09d0764181f5bf8e2a29
|
| --- /dev/null
|
| +++ b/sky/tools/publish_apk.py
|
| @@ -0,0 +1,108 @@
|
| +#!/usr/bin/env python
|
| +# Copyright 2015 The Chromium Authors. All rights reserved.
|
| +# Use of this source code is governed by a BSD-style license that can be
|
| +# found in the LICENSE file.
|
| +
|
| +# Modeled on examples from:
|
| +# https://github.com/googlesamples/android-play-publisher-api/tree/master/v2/python
|
| +
|
| +import argparse
|
| +import httplib2
|
| +import logging
|
| +import os
|
| +import sys
|
| +
|
| +from apiclient.discovery import build
|
| +from oauth2client import client
|
| +
|
| +
|
| +SERVICE_ACCOUNT_EMAIL = (
|
| + '69268379666-mu02g6delkg25t856t773fkdt9p90lpd@developer.gserviceaccount.com')
|
| +KEY_FILE_PATH = os.path.expanduser('~/sky_publish_key.p12')
|
| +API_AUTH_SCOPE = 'https://www.googleapis.com/auth/androidpublisher'
|
| +TRACK = 'production' # Can be
|
| +
|
| +
|
| +def read_binary_file(path):
|
| + with file(path, 'rb') as f:
|
| + return f.read()
|
| +
|
| +
|
| +def read_text_file(path):
|
| + with file(path, 'r') as f:
|
| + return f.read()
|
| +
|
| +
|
| +def publish_apk(service, package_name, apk_path, changes_text, track):
|
| + edit_request = service.edits().insert(body={}, packageName=package_name)
|
| + result = edit_request.execute()
|
| + edit_id = result['id']
|
| +
|
| + apk_response = service.edits().apks().upload(
|
| + editId=edit_id,
|
| + packageName=package_name,
|
| + media_body=apk_path).execute()
|
| +
|
| + print 'Version code %d has been uploaded' % apk_response['versionCode']
|
| +
|
| + track_response = service.edits().tracks().update(
|
| + editId=edit_id,
|
| + track=track,
|
| + packageName=package_name,
|
| + body={u'versionCodes': [apk_response['versionCode']]}).execute()
|
| +
|
| + print 'Track %s is set for version code(s) %s' % (
|
| + track_response['track'], str(track_response['versionCodes']))
|
| +
|
| + listing_response = service.edits().apklistings().update(
|
| + editId=edit_id, packageName=package_name, language='en-US',
|
| + apkVersionCode=apk_response['versionCode'],
|
| + body={'recentChanges': changes}).execute()
|
| +
|
| + print ('Listing for language %s was updated.'
|
| + % listing_response['language'])
|
| +
|
| + commit_request = service.edits().commit(
|
| + editId=edit_id, packageName=package_name).execute()
|
| +
|
| + print 'Edit "%s" has been committed' % (commit_request['id'])
|
| +
|
| +
|
| +def connect_to_service(email, key_file, auth_scope):
|
| + credentials = client.SignedJwtAssertionCredentials(
|
| + email,
|
| + read_binary_file(key_file),
|
| + scope=auth_scope)
|
| + http = httplib2.Http()
|
| + http = credentials.authorize(http)
|
| +
|
| + return build('androidpublisher', 'v2', http=http)
|
| +
|
| +
|
| +def main(argv):
|
| + logging.basicConfig()
|
| +
|
| + parser = argparse.ArgumentParser()
|
| + parser.add_argument('package_name', help='Package (e.g. com.android.sample)')
|
| + parser.add_argument('apk_path', help='Path to the APK file to upload.')
|
| + parser.add_argument('changes_file',
|
| + help='Path to file containing "What\'s new in this version?" text.')
|
| + parser.add_argument('--track', default='production',
|
| + choices=['alpha', 'beta', 'production', 'rollout'])
|
| + args = parser.parse_args()
|
| +
|
| + changes_text = read_text_file(args.changes_file)
|
| +
|
| + service = connect_to_service(SERVICE_ACCOUNT_EMAIL, KEY_FILE_PATH,
|
| + API_AUTH_SCOPE)
|
| +
|
| + try:
|
| + publish_apk(service, args.package_name, args.apk_path, changes_text,
|
| + args.track)
|
| + except client.AccessTokenRefreshError:
|
| + print ('The credentials have been revoked or expired, please re-run the '
|
| + 'application to re-authorize')
|
| +
|
| +
|
| +if __name__ == '__main__':
|
| + main(sys.argv)
|
|
|