1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
import os
import argparse
import json
from googleapiclient.discovery import build
from google.oauth2 import service_account
# Command-line arguments
parser = argparse.ArgumentParser(description='Fetch app details from Google Play Store.')
parser.add_argument('package_name', help='Package name of the app')
parser.add_argument('--language', default=None, help='Specify the language to fetch details (default: None, fetch all supported languages)')
parser.add_argument('--list-languages', action='store_true', help='List all supported languages')
parser.add_argument('--extract-details', action='store_true', help='Extract app details')
parser.add_argument('--extract-changelog', action='store_true', help='Extract and save changelog as JSON')
parser.add_argument('--save', action='store_true', help='Save the fetched details to the correct location')
parser.add_argument('--commit', action='store_true', help='Commit changes to the Play Store')
args = parser.parse_args()
# Get the credentials file path from an environment variable
credentials_path = os.environ.get('GOOGLE_PLAY_CREDENTIALS', None)
if not credentials_path:
raise ValueError("Environment variable 'GOOGLE_PLAY_CREDENTIALS' is not set.")
# Create a service account credentials object
credentials = service_account.Credentials.from_service_account_file(
credentials_path,
scopes=['https://www.googleapis.com/auth/androidpublisher']
)
service = build('androidpublisher', 'v3', credentials=credentials, cache_discovery=False)
# Base path for Fastlane metadata
def get_metadata_path(package_name):
if package_name == "se.leap.bitmaskclient":
return 'src/normal/fastlane/metadata/android'
elif package_name == "se.leap.riseupvpn":
return 'src/custom/fastlane/metadata/android'
else:
raise ValueError(f"Unknown package name: {package_name}")
# Fetch app details
def fetch_app_details(package_name, language):
try:
# Create a new edit
edit_request = service.edits().insert(body={}, packageName=package_name)
edit_response = edit_request.execute()
edit_id = edit_response['id']
# Fetch the app listing for the specified language
app_details = service.edits().listings().get(
packageName=package_name,
editId=edit_id,
language=language
).execute()
# Commit the edit if the --commit flag is provided
if args.commit:
service.edits().commit(
packageName=package_name,
editId=edit_id,
changesNotSentForReview=True
).execute()
return app_details
except Exception as e:
print(f"Error fetching app details: {str(e)}")
return None
# Save app details in Fastlane structure
def save_app_details(app_details, package_name, language):
try:
# Determine the correct metadata path based on the package name
metadata_path = get_metadata_path(package_name)
lang_dir = os.path.join(metadata_path, language)
os.makedirs(lang_dir, exist_ok=True)
# Save `title`, `short_description`, and `full_description` as text files
with open(os.path.join(lang_dir, 'title.txt'), 'w', encoding='utf-8') as title_file:
title_file.write(app_details.get('title', ''))
with open(os.path.join(lang_dir, 'short_description.txt'), 'w', encoding='utf-8') as short_file:
short_file.write(app_details.get('shortDescription', ''))
with open(os.path.join(lang_dir, 'full_description.txt'), 'w', encoding='utf-8') as full_file:
full_file.write(app_details.get('fullDescription', ''))
print(f"App details saved successfully in {lang_dir}")
except Exception as e:
print(f"Error saving app details: {str(e)}")
# List langs in the store
def list_supported_languages(package_name):
try:
# Create a new edit
edit_request = service.edits().insert(body={}, packageName=package_name)
edit_response = edit_request.execute()
edit_id = edit_response['id']
# Fetch the app listings
listings = service.edits().listings().list(packageName=package_name, editId=edit_id).execute()
supported_languages = [listing['language'] for listing in listings['listings']]
print("Supported Languages:")
for language in supported_languages:
print(language)
# Commit the edit if the --commit flag is provided
if args.commit:
service.edits().commit(
packageName=package_name,
editId=edit_id,
changesNotSentForReview=True
).execute()
return supported_languages
except Exception as e:
print(f"Error listing languages: {str(e)}")
return []
# Main script logic
if args.list_languages:
list_supported_languages(args.package_name)
elif args.extract_details:
if args.save:
# Fetch and save details for all supported languages
supported_languages = list_supported_languages(args.package_name)
for language in supported_languages:
app_details = fetch_app_details(args.package_name, language)
if app_details:
save_app_details(app_details, args.package_name, language)
elif args.language:
# Fetch and save details for a specific language
app_details = fetch_app_details(args.package_name, args.language)
if app_details:
if args.save:
save_app_details(app_details, args.package_name, args.language)
else:
print("Fetched app details (not saved):")
print(json.dumps(app_details, indent=4))
else:
print("Please specify a language with --language or use --list-languages to list supported languages.")
else:
print("No valid action specified. Use --list-languages, --extract-details, or --extract-changelog.")
|