Skip to content

Commit 25db754

Browse files
committed
Release v1.0.0: Finalize app source, build workflow, and docs
1 parent ff5ce3c commit 25db754

File tree

13 files changed

+222
-81
lines changed

13 files changed

+222
-81
lines changed

.gitattributes

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
.github/ export-ignore
2+
docs/ export-ignore
3+
.gitattributes export-ignore
4+
.gitignore export-ignore
Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,6 @@ jobs:
3737
echo "VERSION=$ver" >> $env:GITHUB_ENV
3838
Write-Host "Detected Version: $ver"
3939
40-
- name: Update Changelog and Push
41-
run: |
42-
python update_changelog.py $env:VERSION
43-
44-
git config --global user.name "GitHub Action"
45-
git config --global user.email "[email protected]"
46-
47-
git add CHANGELOG.md
48-
git commit -m "Auto-update Changelog for version $env:VERSION [skip ci]" || Write-Host "No changes to commit"
49-
git push
50-
5140
- name: Generate Version Info for Exe
5241
run: |
5342
python create_version.py $env:VERSION

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,4 @@ audioshelf.db
2323
# Temporary Updates
2424
audioshelf_updater.bat
2525
version_info.txt
26+
update_changelog.py

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8-
## [1.0.0] - 2025-12-04
8+
## [1.0.0] - 2025-12-06
99

1010
### 🎉 Initial Release
1111
First public release of AudioShelf! A precision-focused audiobook player designed for accessibility and power users.

dialogs/shortcuts_dialog.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@ def _populate_list(self):
7777
self._add_item(_("Jump to Pinned Books"), "Alt + P")
7878
self._add_item(_("Jump to Finished Books"), "Alt + 9")
7979
self._add_item(_("Jump to Shelf 2..8"), "Alt + 2..8")
80-
self._add_item(_("Previous Shelf"), "Ctrl + PageUp")
81-
self._add_item(_("Next Shelf"), "Ctrl + PageDown")
80+
self._add_item(_("Previous Shelf"), "Alt + PageUp")
81+
self._add_item(_("Next Shelf"), "Alt + PageDown")
8282

8383
# Player: Playback
8484
self._add_header(_("Player: Playback"))
@@ -100,8 +100,8 @@ def _populate_list(self):
100100
self._add_item(_("Go to 50% of File"), "Ctrl + Backspace")
101101
self._add_item(_("Go to 30s before End"), "Shift + Backspace")
102102
self._add_item(_("Go To Time..."), "G")
103-
self._add_item(_("Go To File Number..."), "Ctrl + G")
104103
self._add_item(_("Show File List"), "F")
104+
self._add_item(_("Go To File Number..."), "Ctrl + F")
105105

106106
# Player: Audio
107107
self._add_header(_("Player: Audio"))

dialogs/user_guide_dialog.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
- Play/Pause: Space
3838
- Stop (and reset to start): Shift + Space
3939
- Volume: Up/Down Arrows
40-
- Speed Control: J (Slower), H (Faster), K (Reset). Hold Shift for larger steps (0.5x).
40+
- Speed Control: J (Faster), H (Slower), K (Reset). Hold Shift for larger steps (0.5x).
4141
4242
* Navigation:
4343
- Seek: Left/Right Arrows (Short jump), Ctrl+Left/Right (Long jump).

docs/portable/index.html

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="utf-8">
5+
<meta name="viewport" content="width=device-width, initial-scale=1">
6+
<title>AudioShelf Download</title>
7+
<style>
8+
body {
9+
background-color: #1e1e1e;
10+
color: #ffffff;
11+
font-family: sans-serif;
12+
display: flex;
13+
flex-direction: column;
14+
align-items: center;
15+
justify-content: center;
16+
height: 100vh;
17+
margin: 0;
18+
text-align: center;
19+
}
20+
.container {
21+
padding: 20px;
22+
border: 1px solid #333;
23+
border-radius: 10px;
24+
background-color: #252526;
25+
max-width: 400px;
26+
}
27+
h1 { font-size: 20px; margin-bottom: 10px; }
28+
p { color: #cccccc; margin-bottom: 20px; }
29+
.btn {
30+
display: none; /* اول مخفی است */
31+
background-color: #007acc;
32+
color: white;
33+
padding: 10px 20px;
34+
text-decoration: none;
35+
border-radius: 5px;
36+
font-weight: bold;
37+
}
38+
.btn:hover { background-color: #005f9e; }
39+
.loader {
40+
border: 4px solid #f3f3f3;
41+
border-top: 4px solid #007acc;
42+
border-radius: 50%;
43+
width: 30px;
44+
height: 30px;
45+
animation: spin 1s linear infinite;
46+
margin: 0 auto 15px auto;
47+
}
48+
@keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }
49+
</style>
50+
<script>
51+
const user = 'M-Rajabi-dev';
52+
const repo = 'AudioShelf';
53+
const filePattern = '-Portable.zip';
54+
55+
fetch(`https://api.github.com/repos/${user}/${repo}/releases/latest`)
56+
.then(response => response.json())
57+
.then(data => {
58+
const asset = data.assets.find(a => a.name.endsWith(filePattern));
59+
const status = document.getElementById('status');
60+
const manualBtn = document.getElementById('manual-link');
61+
const loader = document.getElementById('loader');
62+
63+
if (asset) {
64+
status.innerHTML = `Downloading <b>${asset.name}</b>...`;
65+
window.location.href = asset.browser_download_url;
66+
67+
manualBtn.href = asset.browser_download_url;
68+
manualBtn.style.display = 'inline-block';
69+
manualBtn.innerText = "Click here if download doesn't start";
70+
loader.style.display = 'none';
71+
} else {
72+
loader.style.display = 'none';
73+
status.innerHTML = "Error: File not found in the latest release.";
74+
}
75+
})
76+
.catch(err => {
77+
document.getElementById('loader').style.display = 'none';
78+
document.getElementById('status').innerHTML = "Connection Error.";
79+
});
80+
</script>
81+
</head>
82+
<body>
83+
<div class="container">
84+
<h1>🎧 AudioShelf</h1>
85+
<div id="loader" class="loader"></div>
86+
<p id="status">Finding latest version...</p>
87+
<a id="manual-link" class="btn" href="#">Download Manually</a>
88+
</div>
89+
</body>
90+
</html>

docs/setup/index.html

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="utf-8">
5+
<meta name="viewport" content="width=device-width, initial-scale=1">
6+
<title>AudioShelf Download</title>
7+
<style>
8+
body {
9+
background-color: #1e1e1e;
10+
color: #ffffff;
11+
font-family: sans-serif;
12+
display: flex;
13+
flex-direction: column;
14+
align-items: center;
15+
justify-content: center;
16+
height: 100vh;
17+
margin: 0;
18+
text-align: center;
19+
}
20+
.container {
21+
padding: 20px;
22+
border: 1px solid #333;
23+
border-radius: 10px;
24+
background-color: #252526;
25+
max-width: 400px;
26+
}
27+
h1 { font-size: 20px; margin-bottom: 10px; }
28+
p { color: #cccccc; margin-bottom: 20px; }
29+
.btn {
30+
display: none; /* اول مخفی است */
31+
background-color: #007acc;
32+
color: white;
33+
padding: 10px 20px;
34+
text-decoration: none;
35+
border-radius: 5px;
36+
font-weight: bold;
37+
}
38+
.btn:hover { background-color: #005f9e; }
39+
.loader {
40+
border: 4px solid #f3f3f3;
41+
border-top: 4px solid #007acc;
42+
border-radius: 50%;
43+
width: 30px;
44+
height: 30px;
45+
animation: spin 1s linear infinite;
46+
margin: 0 auto 15px auto;
47+
}
48+
@keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }
49+
</style>
50+
<script>
51+
const user = 'M-Rajabi-dev';
52+
const repo = 'AudioShelf';
53+
const filePattern = '-Setup.exe';
54+
55+
fetch(`https://api.github.com/repos/${user}/${repo}/releases/latest`)
56+
.then(response => response.json())
57+
.then(data => {
58+
const asset = data.assets.find(a => a.name.endsWith(filePattern));
59+
const status = document.getElementById('status');
60+
const manualBtn = document.getElementById('manual-link');
61+
const loader = document.getElementById('loader');
62+
63+
if (asset) {
64+
status.innerHTML = `Downloading <b>${asset.name}</b>...`;
65+
window.location.href = asset.browser_download_url;
66+
67+
manualBtn.href = asset.browser_download_url;
68+
manualBtn.style.display = 'inline-block';
69+
manualBtn.innerText = "Click here if download doesn't start";
70+
loader.style.display = 'none';
71+
} else {
72+
loader.style.display = 'none';
73+
status.innerHTML = "Error: File not found in the latest release.";
74+
}
75+
})
76+
.catch(err => {
77+
document.getElementById('loader').style.display = 'none';
78+
document.getElementById('status').innerHTML = "Connection Error.";
79+
});
80+
</script>
81+
</head>
82+
<body>
83+
<div class="container">
84+
<h1>🎧 AudioShelf</h1>
85+
<div id="loader" class="loader"></div>
86+
<p id="status">Finding latest version...</p>
87+
<a id="manual-link" class="btn" href="#">Download Manually</a>
88+
</div>
89+
</body>
90+
</html>

frames/library/list_manager.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -479,11 +479,11 @@ def on_list_char_hook(self, frame, event: wx.KeyEvent):
479479
menu_handlers.on_refresh_library(frame, None)
480480
return
481481

482-
elif ctrl_down and keycode == wx.WXK_PAGEUP:
482+
elif alt_down and keycode == wx.WXK_PAGEUP:
483483
self.navigate_to_shelf(frame, direction=-1)
484484
return
485485

486-
elif ctrl_down and keycode == wx.WXK_PAGEDOWN:
486+
elif alt_down and keycode == wx.WXK_PAGEDOWN:
487487
self.navigate_to_shelf(frame, direction=1)
488488
return
489489

frames/player/controls.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -161,14 +161,15 @@ def on_key_down(frame, event: wx.KeyEvent):
161161
elif not ctrl_down:
162162
frame.info_manager.announce_total_elapsed_time()
163163

164-
# Dialogs / Exit
164+
# Dialogs / Exit
165165
elif keycode == ord('G'):
166-
if ctrl_down:
167-
frame.dialog_manager.on_goto_file()
168-
else:
166+
if not ctrl_down:
169167
frame.dialog_manager.on_goto()
170168
elif keycode == ord('F'):
171-
frame.dialog_manager.on_show_files()
169+
if shift_down:
170+
frame.dialog_manager.on_goto_file()
171+
else:
172+
frame.dialog_manager.on_show_files()
172173
elif keycode == wx.WXK_ESCAPE:
173174
event_handlers.on_escape(frame)
174175

0 commit comments

Comments
 (0)