TonieToolbox 0.1.5__py3-none-any.whl → 0.1.6__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
TonieToolbox/__init__.py CHANGED
@@ -2,4 +2,4 @@
2
2
  TonieToolbox - Convert audio files to Tonie box compatible format
3
3
  """
4
4
 
5
- __version__ = '0.1.5'
5
+ __version__ = '0.1.6'
TonieToolbox/__main__.py CHANGED
@@ -15,7 +15,7 @@ from .tonie_analysis import check_tonie_file, split_to_opus_files
15
15
  from .dependency_manager import get_ffmpeg_binary, get_opus_binary
16
16
  from .logger import setup_logging, get_logger
17
17
  from .filename_generator import guess_output_filename
18
- from .version_handler import check_for_updates
18
+ from .version_handler import check_for_updates, clear_version_cache
19
19
 
20
20
  def main():
21
21
  """Entry point for the TonieToolbox application."""
@@ -45,8 +45,15 @@ def main():
45
45
  help='Compare input file with another .taf file for debugging')
46
46
  parser.add_argument('--detailed-compare', action='store_true',
47
47
  help='Show detailed OGG page differences when comparing files')
48
- parser.add_argument('--skip-update-check', action='store_true',
48
+
49
+ # Version check options
50
+ version_group = parser.add_argument_group('Version Check Options')
51
+ version_group.add_argument('--skip-update-check', action='store_true',
49
52
  help='Skip checking for updates')
53
+ version_group.add_argument('--force-refresh-cache', action='store_true',
54
+ help='Force refresh of update information from PyPI')
55
+ version_group.add_argument('--clear-version-cache', action='store_true',
56
+ help='Clear cached version information')
50
57
 
51
58
  log_group = parser.add_argument_group('Logging Options')
52
59
  log_level_group = log_group.add_mutually_exclusive_group()
@@ -70,10 +77,22 @@ def main():
70
77
 
71
78
  setup_logging(log_level)
72
79
  logger = get_logger('main')
73
- logger.debug("Starting TonieToolbox with log level: %s", logging.getLevelName(log_level))
80
+ logger.debug("Starting TonieToolbox v%s with log level: %s", __version__, logging.getLevelName(log_level))
81
+
82
+ # Handle version cache operations
83
+ if args.clear_version_cache:
84
+ if clear_version_cache():
85
+ logger.info("Version cache cleared successfully")
86
+ else:
87
+ logger.info("No version cache to clear or error clearing cache")
74
88
 
89
+ # Check for updates
75
90
  if not args.skip_update_check:
76
- check_for_updates(quiet=args.silent or args.quiet)
91
+ logger.debug("Checking for updates (force_refresh=%s)", args.force_refresh_cache)
92
+ check_for_updates(
93
+ quiet=args.silent or args.quiet,
94
+ force_refresh=args.force_refresh_cache
95
+ )
77
96
 
78
97
  ffmpeg_binary = args.ffmpeg
79
98
  if ffmpeg_binary is None:
@@ -12,45 +12,70 @@ from urllib.error import URLError
12
12
  from . import __version__
13
13
  from .logger import get_logger
14
14
 
15
+ # Cache filename for version information
15
16
  CACHE_DIR = os.path.join(os.path.expanduser("~"), ".tonietoolbox")
16
17
  CACHE_FILE = os.path.join(CACHE_DIR, "version_cache.json")
17
18
  CACHE_EXPIRY = 86400 # 24 hours in seconds
18
19
 
19
20
 
20
- def get_pypi_version():
21
+ def get_pypi_version(force_refresh=False):
21
22
  """
22
23
  Get the latest version of TonieToolbox from PyPI.
23
24
 
25
+ Args:
26
+ force_refresh: If True, ignore the cache and fetch directly from PyPI
27
+
24
28
  Returns:
25
29
  tuple: (latest_version, None) on success, (current_version, error_message) on failure
26
30
  """
27
31
  logger = get_logger("version_handler")
32
+ logger.debug("Checking for latest version (force_refresh=%s)", force_refresh)
33
+ logger.debug("Current version: %s", __version__)
28
34
 
29
35
  try:
30
- if os.path.exists(CACHE_FILE):
36
+ # Check if we have a recent cache and should use it
37
+ if not force_refresh and os.path.exists(CACHE_FILE):
31
38
  try:
32
39
  with open(CACHE_FILE, "r") as f:
33
40
  cache_data = json.load(f)
34
41
 
35
- if time.time() - cache_data.get("timestamp", 0) < CACHE_EXPIRY:
36
- logger.debug("Using cached version info: %s", cache_data["version"])
37
- return cache_data["version"], None
42
+ cached_version = cache_data.get("version")
43
+ cache_timestamp = cache_data.get("timestamp", 0)
44
+ cache_age = time.time() - cache_timestamp
45
+
46
+ logger.debug("Cache info: version=%s, age=%d seconds (expires after %d)",
47
+ cached_version, cache_age, CACHE_EXPIRY)
48
+
49
+ if cache_age < CACHE_EXPIRY:
50
+ logger.debug("Using cached version info: %s", cached_version)
51
+ return cached_version, None
52
+ else:
53
+ logger.debug("Cache expired (%d seconds old), refreshing from PyPI", cache_age)
38
54
  except (json.JSONDecodeError, KeyError) as e:
39
55
  logger.debug("Cache file corrupt, will fetch from PyPI: %s", e)
56
+ else:
57
+ if force_refresh:
58
+ logger.debug("Forced refresh requested, bypassing cache")
59
+ else:
60
+ logger.debug("No cache found, fetching from PyPI")
40
61
 
62
+ # Fetch from PyPI
41
63
  logger.debug("Fetching latest version from PyPI")
42
64
  with request.urlopen("https://pypi.org/pypi/TonieToolbox/json", timeout=2) as response:
43
65
  pypi_data = json.loads(response.read().decode("utf-8"))
44
66
  latest_version = pypi_data["info"]["version"]
45
67
 
68
+ # Update cache
46
69
  if not os.path.exists(CACHE_DIR):
47
70
  os.makedirs(CACHE_DIR, exist_ok=True)
48
71
 
49
72
  with open(CACHE_FILE, "w") as f:
50
- json.dump({
73
+ cache_data = {
51
74
  "version": latest_version,
52
75
  "timestamp": time.time()
53
- }, f)
76
+ }
77
+ json.dump(cache_data, f)
78
+ logger.debug("Updated cache: %s", cache_data)
54
79
 
55
80
  logger.debug("Latest version from PyPI: %s", latest_version)
56
81
  return latest_version, None
@@ -74,27 +99,43 @@ def compare_versions(v1, v2):
74
99
  Returns:
75
100
  int: -1 if v1 < v2, 0 if v1 == v2, 1 if v1 > v2
76
101
  """
77
- v1_parts = [int(x) for x in v1.split('.')]
78
- v2_parts = [int(x) for x in v2.split('.')]
102
+ logger = get_logger("version_handler")
103
+ logger.debug("Comparing versions: '%s' vs '%s'", v1, v2)
79
104
 
80
- for i in range(max(len(v1_parts), len(v2_parts))):
81
- v1_part = v1_parts[i] if i < len(v1_parts) else 0
82
- v2_part = v2_parts[i] if i < len(v2_parts) else 0
105
+ try:
106
+ v1_parts = [int(x) for x in v1.split('.')]
107
+ v2_parts = [int(x) for x in v2.split('.')]
108
+
109
+ logger.debug("Version parts: %s vs %s", v1_parts, v2_parts)
83
110
 
84
- if v1_part < v2_part:
85
- return -1
86
- elif v1_part > v2_part:
87
- return 1
111
+ for i in range(max(len(v1_parts), len(v2_parts))):
112
+ v1_part = v1_parts[i] if i < len(v1_parts) else 0
113
+ v2_part = v2_parts[i] if i < len(v2_parts) else 0
114
+
115
+ logger.debug("Comparing part %d: %d vs %d", i, v1_part, v2_part)
88
116
 
89
- return 0
117
+ if v1_part < v2_part:
118
+ logger.debug("Result: '%s' is OLDER than '%s'", v1, v2)
119
+ return -1
120
+ elif v1_part > v2_part:
121
+ logger.debug("Result: '%s' is NEWER than '%s'", v1, v2)
122
+ return 1
123
+
124
+ logger.debug("Result: versions are EQUAL")
125
+ return 0
126
+ except Exception as e:
127
+ logger.debug("Error comparing versions '%s' and '%s': %s", v1, v2, e)
128
+ # On error, assume versions are equal
129
+ return 0
90
130
 
91
131
 
92
- def check_for_updates(quiet=False):
132
+ def check_for_updates(quiet=False, force_refresh=False):
93
133
  """
94
134
  Check if the current version of TonieToolbox is the latest.
95
135
 
96
136
  Args:
97
137
  quiet: If True, will not log any information messages
138
+ force_refresh: If True, bypass cache and check PyPI directly
98
139
 
99
140
  Returns:
100
141
  tuple: (is_latest, latest_version, message)
@@ -105,12 +146,17 @@ def check_for_updates(quiet=False):
105
146
  logger = get_logger("version_handler")
106
147
  current_version = __version__
107
148
 
108
- latest_version, error = get_pypi_version()
149
+ logger.debug("Starting update check (quiet=%s, force_refresh=%s)", quiet, force_refresh)
150
+ latest_version, error = get_pypi_version(force_refresh)
109
151
 
110
152
  if error:
153
+ logger.debug("Error occurred during update check: %s", error)
111
154
  return True, current_version, error
112
155
 
113
- is_latest = compare_versions(current_version, latest_version) >= 0
156
+ compare_result = compare_versions(current_version, latest_version)
157
+ is_latest = compare_result >= 0 # current >= latest
158
+
159
+ logger.debug("Version comparison result: %d (is_latest=%s)", compare_result, is_latest)
114
160
 
115
161
  if is_latest:
116
162
  message = f"You are using the latest version of TonieToolbox ({current_version})"
@@ -122,4 +168,26 @@ def check_for_updates(quiet=False):
122
168
  logger.info(message)
123
169
  logger.info("Consider upgrading with: pip install --upgrade TonieToolbox")
124
170
 
125
- return is_latest, latest_version, message
171
+ return is_latest, latest_version, message
172
+
173
+
174
+ def clear_version_cache():
175
+ """
176
+ Clear the version cache file to force a refresh on next check.
177
+
178
+ Returns:
179
+ bool: True if cache was cleared, False otherwise
180
+ """
181
+ logger = get_logger("version_handler")
182
+
183
+ try:
184
+ if os.path.exists(CACHE_FILE):
185
+ logger.debug("Removing version cache file: %s", CACHE_FILE)
186
+ os.remove(CACHE_FILE)
187
+ return True
188
+ else:
189
+ logger.debug("No cache file to remove")
190
+ return False
191
+ except Exception as e:
192
+ logger.debug("Error clearing cache: %s", e)
193
+ return False
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: TonieToolbox
3
- Version: 0.1.5
3
+ Version: 0.1.6
4
4
  Summary: Convert audio files to Tonie box compatible format
5
5
  Home-page: https://github.com/Quentendo64/TonieToolbox
6
6
  Author: Quentendo64
@@ -1,5 +1,5 @@
1
- TonieToolbox/__init__.py,sha256=GWKHuNGUgyxzsQA6MMamoyPceyqIYi7kmsdxdMgwreg,96
2
- TonieToolbox/__main__.py,sha256=c1D_6YP2Y-aBB6sl1aFZPyiwnmdMY8vM3taPcDLWX_Q,7385
1
+ TonieToolbox/__init__.py,sha256=LTELDMNigo883omB6nSwss4YveBM23FSsESuIQyqSGg,96
2
+ TonieToolbox/__main__.py,sha256=zMaoT7-0JUT3PiU5A2xKNgig6NS1PUh4vDKUebJVdYg,8280
3
3
  TonieToolbox/audio_conversion.py,sha256=10PayO1VQDGee2bcO6JD8zRSFoJRJhO2pBeba5k15vk,7998
4
4
  TonieToolbox/constants.py,sha256=QQWQpnCI65GByLlXLOkt2n8nALLu4m6BWp0zuhI3M04,2021
5
5
  TonieToolbox/dependency_manager.py,sha256=sr7PMBsqQ26bYszM-7Ay-UbKPuBJGyeJV3y1BPAOiBQ,15028
@@ -11,10 +11,10 @@ TonieToolbox/tonie_analysis.py,sha256=4eOzxHL_g0TJFhuexNHcZXivxZ7eb5xfb9-efUZ02W
11
11
  TonieToolbox/tonie_file.py,sha256=nIS4qhpBKIyPvTU39yYljRidpY6cz78halXlz3HJy9w,15294
12
12
  TonieToolbox/tonie_header.proto,sha256=WaWfwO4VrwGtscK2ujfDRKtpeBpaVPoZhI8iMmR-C0U,202
13
13
  TonieToolbox/tonie_header_pb2.py,sha256=s5bp4ULTEekgq6T61z9fDkRavyPM-3eREs20f_Pxxe8,3665
14
- TonieToolbox/version_handler.py,sha256=XVvxaRx1h2SjIG57-ninjf0XBSn0wmyHgS1u_mGKlZY,4211
15
- tonietoolbox-0.1.5.dist-info/licenses/LICENSE.md,sha256=rGoga9ZAgNco9fBapVFpWf6ri7HOBp1KRnt1uIruXMk,35190
16
- tonietoolbox-0.1.5.dist-info/METADATA,sha256=JVTZeD9xtYoYrip9yw08VA025YjCurSE-lN2lvz_H4Y,8971
17
- tonietoolbox-0.1.5.dist-info/WHEEL,sha256=lTU6B6eIfYoiQJTZNc-fyaR6BpL6ehTzU3xGYxn2n8k,91
18
- tonietoolbox-0.1.5.dist-info/entry_points.txt,sha256=oqpeyBxel7aScg35Xr4gZKnf486S5KW9okqeBwyJxxc,60
19
- tonietoolbox-0.1.5.dist-info/top_level.txt,sha256=Wkkm-2p7I3ENfS7ZbYtYUB2g-xwHrXVlERHfonsOPuE,13
20
- tonietoolbox-0.1.5.dist-info/RECORD,,
14
+ TonieToolbox/version_handler.py,sha256=KU7rS07RL6IZZL2rk4TJ9oKrAutiWvPBOr7qgZLIogI,7108
15
+ tonietoolbox-0.1.6.dist-info/licenses/LICENSE.md,sha256=rGoga9ZAgNco9fBapVFpWf6ri7HOBp1KRnt1uIruXMk,35190
16
+ tonietoolbox-0.1.6.dist-info/METADATA,sha256=xjwX7xRYP52Vs-flUlTtrxTUlaRMCLMrhtSbw9dOZDo,8971
17
+ tonietoolbox-0.1.6.dist-info/WHEEL,sha256=lTU6B6eIfYoiQJTZNc-fyaR6BpL6ehTzU3xGYxn2n8k,91
18
+ tonietoolbox-0.1.6.dist-info/entry_points.txt,sha256=oqpeyBxel7aScg35Xr4gZKnf486S5KW9okqeBwyJxxc,60
19
+ tonietoolbox-0.1.6.dist-info/top_level.txt,sha256=Wkkm-2p7I3ENfS7ZbYtYUB2g-xwHrXVlERHfonsOPuE,13
20
+ tonietoolbox-0.1.6.dist-info/RECORD,,