umpaper-fetch 1.0.0__tar.gz

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.
Files changed (38) hide show
  1. umpaper_fetch-1.0.0/LICENSE +22 -0
  2. umpaper_fetch-1.0.0/MANIFEST.in +10 -0
  3. umpaper_fetch-1.0.0/PKG-INFO +462 -0
  4. umpaper_fetch-1.0.0/README.md +413 -0
  5. umpaper_fetch-1.0.0/TROUBLESHOOTING.md +165 -0
  6. umpaper_fetch-1.0.0/auth/__init__.py +1 -0
  7. umpaper_fetch-1.0.0/auth/chrome_fix.py +119 -0
  8. umpaper_fetch-1.0.0/auth/um_authenticator.py +521 -0
  9. umpaper_fetch-1.0.0/downloader/__init__.py +1 -0
  10. umpaper_fetch-1.0.0/downloader/pdf_downloader.py +207 -0
  11. umpaper_fetch-1.0.0/pyproject.toml +72 -0
  12. umpaper_fetch-1.0.0/requirements.txt +8 -0
  13. umpaper_fetch-1.0.0/scraper/__init__.py +1 -0
  14. umpaper_fetch-1.0.0/scraper/paper_scraper.py +316 -0
  15. umpaper_fetch-1.0.0/setup.cfg +4 -0
  16. umpaper_fetch-1.0.0/setup.py +83 -0
  17. umpaper_fetch-1.0.0/umpaper_fetch/__init__.py +26 -0
  18. umpaper_fetch-1.0.0/umpaper_fetch/auth/__init__.py +1 -0
  19. umpaper_fetch-1.0.0/umpaper_fetch/auth/chrome_fix.py +119 -0
  20. umpaper_fetch-1.0.0/umpaper_fetch/auth/um_authenticator.py +521 -0
  21. umpaper_fetch-1.0.0/umpaper_fetch/cli.py +316 -0
  22. umpaper_fetch-1.0.0/umpaper_fetch/downloader/__init__.py +1 -0
  23. umpaper_fetch-1.0.0/umpaper_fetch/downloader/pdf_downloader.py +207 -0
  24. umpaper_fetch-1.0.0/umpaper_fetch/scraper/__init__.py +1 -0
  25. umpaper_fetch-1.0.0/umpaper_fetch/scraper/paper_scraper.py +316 -0
  26. umpaper_fetch-1.0.0/umpaper_fetch/utils/__init__.py +1 -0
  27. umpaper_fetch-1.0.0/umpaper_fetch/utils/logger.py +67 -0
  28. umpaper_fetch-1.0.0/umpaper_fetch/utils/zip_creator.py +299 -0
  29. umpaper_fetch-1.0.0/umpaper_fetch.egg-info/PKG-INFO +462 -0
  30. umpaper_fetch-1.0.0/umpaper_fetch.egg-info/SOURCES.txt +36 -0
  31. umpaper_fetch-1.0.0/umpaper_fetch.egg-info/dependency_links.txt +1 -0
  32. umpaper_fetch-1.0.0/umpaper_fetch.egg-info/entry_points.txt +2 -0
  33. umpaper_fetch-1.0.0/umpaper_fetch.egg-info/not-zip-safe +1 -0
  34. umpaper_fetch-1.0.0/umpaper_fetch.egg-info/requires.txt +15 -0
  35. umpaper_fetch-1.0.0/umpaper_fetch.egg-info/top_level.txt +8 -0
  36. umpaper_fetch-1.0.0/utils/__init__.py +1 -0
  37. umpaper_fetch-1.0.0/utils/logger.py +67 -0
  38. umpaper_fetch-1.0.0/utils/zip_creator.py +299 -0
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 UM Paper Fetch
4
+
5
+ Marcus Mah Qing Fung
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in all
14
+ copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
+ SOFTWARE.
@@ -0,0 +1,10 @@
1
+ include README.md
2
+ include requirements.txt
3
+ include TROUBLESHOOTING.md
4
+ recursive-include umpaper_fetch *.py
5
+ recursive-exclude * __pycache__
6
+ recursive-exclude * *.py[co]
7
+ exclude test_*.py
8
+ exclude debug_*.py
9
+ exclude example_*.py
10
+ exclude main.py
@@ -0,0 +1,462 @@
1
+ Metadata-Version: 2.4
2
+ Name: umpaper-fetch
3
+ Version: 1.0.0
4
+ Summary: Automated downloader for University Malaya past year exam papers
5
+ Home-page: https://github.com/MarcusMQF/umpaper-fetch
6
+ Author: Marcus Mah
7
+ Author-email: Marcus Mah <marcusmah6969@gmail.com>
8
+ License: MIT
9
+ Project-URL: Homepage, https://github.com/MarcusMQF/umpaper-fetch
10
+ Project-URL: Documentation, https://github.com/MarcusMQF/umpaper-fetch#readme
11
+ Project-URL: Repository, https://github.com/MarcusMQF/umpaper-fetch
12
+ Project-URL: Bug Reports, https://github.com/MarcusMQF/umpaper-fetch/issues
13
+ Keywords: university,malaya,um,exam,papers,downloader,automation,selenium
14
+ Classifier: Development Status :: 4 - Beta
15
+ Classifier: Intended Audience :: Education
16
+ Classifier: Topic :: Education
17
+ Classifier: Topic :: Internet :: WWW/HTTP :: Browsers
18
+ Classifier: Topic :: Utilities
19
+ Classifier: License :: OSI Approved :: MIT License
20
+ Classifier: Programming Language :: Python :: 3
21
+ Classifier: Programming Language :: Python :: 3.8
22
+ Classifier: Programming Language :: Python :: 3.9
23
+ Classifier: Programming Language :: Python :: 3.10
24
+ Classifier: Programming Language :: Python :: 3.11
25
+ Classifier: Programming Language :: Python :: 3.12
26
+ Classifier: Operating System :: OS Independent
27
+ Classifier: Environment :: Console
28
+ Requires-Python: >=3.8
29
+ Description-Content-Type: text/markdown
30
+ License-File: LICENSE
31
+ Requires-Dist: selenium>=4.15.2
32
+ Requires-Dist: requests>=2.31.0
33
+ Requires-Dist: beautifulsoup4>=4.12.2
34
+ Requires-Dist: webdriver-manager>=4.0.1
35
+ Requires-Dist: lxml>=4.9.3
36
+ Requires-Dist: urllib3>=2.0.7
37
+ Requires-Dist: certifi>=2023.7.22
38
+ Requires-Dist: tqdm>=4.66.1
39
+ Provides-Extra: dev
40
+ Requires-Dist: pytest>=7.0; extra == "dev"
41
+ Requires-Dist: pytest-cov>=4.0; extra == "dev"
42
+ Requires-Dist: black>=22.0; extra == "dev"
43
+ Requires-Dist: flake8>=5.0; extra == "dev"
44
+ Requires-Dist: mypy>=1.0; extra == "dev"
45
+ Dynamic: author
46
+ Dynamic: home-page
47
+ Dynamic: license-file
48
+ Dynamic: requires-python
49
+
50
+ # ๐ŸŽ“ UM Past Year Paper Downloader - PaperFetch
51
+
52
+ **One-click bulk download solution for University Malaya (UM) past year exam papers**
53
+
54
+ Automate the tedious process of manually downloading past year papers one by one. Simply provide your UM credentials and subject code, and get all available papers in a single organized ZIP file.
55
+
56
+ ---
57
+
58
+ ## โœจ Key Features
59
+
60
+ ### ๐Ÿš€ **Core Functionality**
61
+ - **๐Ÿ”„ One-Click Bulk Download**: Download all past year papers for any subject code automatically
62
+ - **๐Ÿ“ฆ Smart ZIP Organization**: Automatically organizes papers by year and creates a structured ZIP archive
63
+ - **๐Ÿ” Secure Authentication**: Handles complex UM OpenAthens authentication flow seamlessly
64
+ - **โšก Concurrent Downloads**: Multi-threaded downloading for faster performance
65
+ - **๐Ÿ”„ Auto-Retry Logic**: Robust error handling with configurable retry attempts
66
+ - **๐Ÿ“Š Real-time Progress**: Live progress bars and detailed status updates
67
+
68
+ ### ๐Ÿ“ **File Organization**
69
+ - **๐Ÿ“‚ Hierarchical Structure**: Papers organized by subject โ†’ year โ†’ semester
70
+ - **๐Ÿท๏ธ Smart File Naming**: Automatically detects and preserves meaningful filenames
71
+ - **๐Ÿ“‹ Auto-Generated README**: Includes download summary and paper inventory in ZIP
72
+ - **๐Ÿ—‚๏ธ Organized Output**: Individual PDFs + consolidated ZIP file
73
+ - **๐Ÿงน Optional Cleanup**: Choice to keep individual files or ZIP only
74
+
75
+ ### ๐Ÿ–ฅ๏ธ **User Experience**
76
+ - **๐Ÿ“ฑ Terminal-Based Interface**: Clean, intuitive command-line interface
77
+ - **๐ŸŽฏ Interactive Mode**: Prompts for credentials and settings when needed
78
+ - **โš™๏ธ Command-Line Mode**: Full automation with command-line arguments
79
+ - **๐Ÿ“ Custom Download Locations**: Choose where to save your papers
80
+ - **๐Ÿ” Browser Options**: Support for Edge, Chrome with auto-detection
81
+ - **๐Ÿ“ Comprehensive Logging**: Detailed logs for troubleshooting
82
+
83
+ ### ๐Ÿ”’ **Security & Reliability**
84
+ - **๐Ÿ›ก๏ธ Secure Password Input**: Hidden password entry (never stored/logged)
85
+ - **๐Ÿงน Session Cleanup**: Automatic browser data cleanup after use
86
+ - **โœ… Download Verification**: Validates PDF integrity after download
87
+ - **๐Ÿ” HTTPS Enforcement**: Secure connections to UM servers
88
+ - **โฑ๏ธ Configurable Timeouts**: Customizable session and download timeouts
89
+
90
+ ---
91
+
92
+ ## ๐Ÿ“‹ Complete Command Reference
93
+
94
+ ### **Available Commands (9 total)**
95
+
96
+ | Command | Short | Description | Default |
97
+ |---------|-------|-------------|---------|
98
+ | `--username` | `-u` | UM username (without @siswa.um.edu.my) | *prompted* |
99
+ | `--subject-code` | `-s` | Subject code to search for (e.g., WIA1005) | *prompted* |
100
+ | `--output-dir` | `-o` | Custom download directory | `./downloads` |
101
+ | `--browser` | `-b` | Browser choice: `auto`, `chrome`, `edge` | `edge` |
102
+ | `--timeout` | | Session timeout in seconds | `30` |
103
+ | `--max-retries` | | Maximum retry attempts for failed downloads | `3` |
104
+ | `--show-browser` | | Show browser window (disable headless mode) | `false` |
105
+ | `--no-location-prompt` | | Skip interactive location selection | `false` |
106
+ | `--verbose` | `-v` | Enable detailed debug logging | `false` |
107
+
108
+ ### **Usage Examples**
109
+
110
+ **1. Interactive Mode (Recommended for first-time users)**
111
+ ```bash
112
+ python main.py
113
+ ```
114
+ *Prompts for username, password, subject code, and download location*
115
+
116
+ **2. Quick Command-Line Mode**
117
+ ```bash
118
+ python main.py --username john_doe --subject-code WIA1005
119
+ ```
120
+ *Only prompts for password*
121
+
122
+ **3. Fully Automated Mode**
123
+ ```bash
124
+ python main.py -u student123 -s WXES1116 -o "C:/Downloads/Papers" --no-location-prompt
125
+ ```
126
+ *No prompts except secure password entry*
127
+
128
+ **4. Debug Mode with Visible Browser**
129
+ ```bash
130
+ python main.py --subject-code WIA1005 --show-browser --verbose
131
+ ```
132
+ *Shows browser actions and detailed logging*
133
+
134
+ **5. High-Performance Mode**
135
+ ```bash
136
+ python main.py -s WIA1005 --max-retries 5 --timeout 60
137
+ ```
138
+ *Extended timeouts and retries for slow connections*
139
+
140
+ **6. Custom Browser Selection**
141
+ ```bash
142
+ python main.py --browser chrome --subject-code CSC1025
143
+ ```
144
+ *Force use of Chrome browser*
145
+
146
+ ---
147
+
148
+ ## ๐Ÿš€ Quick Start Guide
149
+
150
+ ### **Prerequisites**
151
+ - Python 3.8+ installed
152
+ - One of these browsers: **Microsoft Edge** (recommended), Google Chrome
153
+ - UM student account with active credentials
154
+ - Stable internet connection
155
+
156
+ ### **Installation**
157
+ ```bash
158
+ # 1. Clone/download this repository
159
+ git clone <repository-url>
160
+ cd um-past-year-downloader
161
+
162
+ # 2. Install dependencies
163
+ pip install -r requirements.txt
164
+
165
+ # 3. Ready to use!
166
+ python main.py
167
+ ```
168
+
169
+ ### **First Run**
170
+ ```bash
171
+ python main.py
172
+ ```
173
+ Follow the interactive prompts:
174
+ 1. Enter your UM username (without @siswa.um.edu.my)
175
+ 2. Enter your password securely
176
+ 3. Enter subject code (e.g., WIA1005)
177
+ 4. Choose download location
178
+ 5. Confirm download of found papers
179
+
180
+ ---
181
+
182
+ ## ๐Ÿ“Š What You Get
183
+
184
+ ### **Organized File Structure**
185
+ ```
186
+ ๐Ÿ“ downloads/
187
+ โ”œโ”€โ”€ ๐Ÿ“ WIA1005/
188
+ โ”‚ โ”œโ”€โ”€ ๐Ÿ“ Year_2023/
189
+ โ”‚ โ”‚ โ”œโ”€โ”€ WIA1005_Final_2023_S1.pdf
190
+ โ”‚ โ”‚ โ””โ”€โ”€ WIA1005_Final_2023_S2.pdf
191
+ โ”‚ โ”œโ”€โ”€ ๐Ÿ“ Year_2022/
192
+ โ”‚ โ”‚ โ”œโ”€โ”€ WIA1005_Final_2022_S1.pdf
193
+ โ”‚ โ”‚ โ””โ”€โ”€ WIA1005_Final_2022_S2.pdf
194
+ โ”‚ โ””โ”€โ”€ ๐Ÿ“ Unsorted/
195
+ โ”‚ โ””โ”€โ”€ WIA1005_Additional_Papers.pdf
196
+ โ”œโ”€โ”€ ๐Ÿ“ฆ WIA1005_past_years.zip
197
+ โ””โ”€โ”€ ๐Ÿ“„ WIA1005_README.txt
198
+ ```
199
+
200
+ ### **ZIP Archive Contents**
201
+ - **Hierarchical Organization**: Subject โ†’ Year โ†’ Files
202
+ - **Automatic README**: Download summary and file inventory
203
+ - **Optimized Compression**: Balanced compression for size/speed
204
+ - **Preserve Metadata**: Original filenames and dates maintained
205
+
206
+ ### **Generated Reports**
207
+ - **Download Summary**: Shows total papers found and downloaded
208
+ - **Failed Downloads**: Lists any papers that couldn't be downloaded
209
+ - **File Inventory**: Complete list of papers with years and types
210
+ - **Timestamp**: When the download was performed
211
+
212
+ ---
213
+
214
+ ## ๐Ÿ”ง Advanced Configuration
215
+
216
+ ### **Browser Selection Guide**
217
+
218
+ | Browser | Best For | Advantages | Notes |
219
+ |---------|----------|------------|-------|
220
+ | **Edge** | Windows users | Built-in, no driver conflicts, memory efficient | **Recommended** |
221
+ | **Chrome** | Mac/Linux users | Wide compatibility, stable | May need driver updates |
222
+ | **Auto** | Uncertain | Detects best available | Falls back to Edge โ†’ Chrome |
223
+
224
+ ### **Performance Tuning**
225
+ ```bash
226
+ # For slow connections
227
+ python main.py --timeout 60 --max-retries 5
228
+
229
+ # For fast connections
230
+ python main.py --timeout 15 --max-retries 2
231
+
232
+ # For debug/troubleshooting
233
+ python main.py --verbose --show-browser
234
+ ```
235
+
236
+ ### **Output Directory Options**
237
+ - **Default**: `./downloads` (project folder)
238
+ - **Custom**: Any valid path (e.g., `C:/Users/Student/Papers`)
239
+ - **Interactive**: Choose during runtime
240
+ - **Auto**: Use `--no-location-prompt` to skip selection
241
+
242
+ ---
243
+
244
+ ## ๐Ÿงช Testing & Validation
245
+
246
+ ### **Built-in Test Scripts**
247
+
248
+ **1. Complete System Test**
249
+ ```bash
250
+ python test_setup.py
251
+ ```
252
+ *Tests Python environment, dependencies, browser drivers, and network connectivity*
253
+
254
+ **2. Authentication Test**
255
+ ```bash
256
+ python test_login.py
257
+ ```
258
+ *Tests only the UM login process (useful for credential verification)*
259
+
260
+ **3. Search Functionality Test**
261
+ ```bash
262
+ python test_search_debug.py
263
+ ```
264
+ *Tests paper search without downloading*
265
+
266
+ ### **Validation Features**
267
+ - **PDF Integrity Check**: Verifies downloaded files are valid PDFs
268
+ - **Size Validation**: Ensures files aren't empty or corrupted
269
+ - **Download Verification**: Confirms all expected papers were downloaded
270
+ - **ZIP Integrity**: Validates ZIP file creation and contents
271
+
272
+ ---
273
+
274
+ ## ๐Ÿ› ๏ธ Technical Architecture
275
+
276
+ ### **Modular Components**
277
+
278
+ **1. Authentication (`auth/um_authenticator.py`)**
279
+ - Handles complex UM OpenAthens SAML authentication
280
+ - Manages session cookies and security tokens
281
+ - Supports multiple browser backends
282
+
283
+ **2. Paper Discovery (`scraper/paper_scraper.py`)**
284
+ - Searches UM repository by subject code
285
+ - Extracts paper metadata (year, semester, type)
286
+ - Handles pagination and result filtering
287
+
288
+ **3. Download Engine (`downloader/pdf_downloader.py`)**
289
+ - Concurrent multi-threaded downloads
290
+ - Progress tracking with visual indicators
291
+ - Retry logic with exponential backoff
292
+ - File integrity validation
293
+
294
+ **4. Archive Creator (`utils/zip_creator.py`)**
295
+ - Intelligent file organization by year/semester
296
+ - Optimized compression algorithms
297
+ - Auto-generated documentation
298
+ - Metadata preservation
299
+
300
+ **5. Logging System (`utils/logger.py`)**
301
+ - Structured logging with multiple levels
302
+ - Separate log files for debugging
303
+ - Performance metrics and timing
304
+
305
+ ### **Dependencies**
306
+ - `selenium` - Web automation and browser control
307
+ - `requests` - HTTP session management
308
+ - `beautifulsoup4` - HTML parsing and data extraction
309
+ - `tqdm` - Progress bars and status indicators
310
+ - `webdriver-manager` - Automatic browser driver management
311
+
312
+ ---
313
+
314
+ ## ๐Ÿšจ Troubleshooting
315
+
316
+ ### **Common Issues & Solutions**
317
+
318
+ **โŒ Login Failed**
319
+ - โœ… Verify username/password are correct
320
+ - โœ… Check if your UM account is active
321
+ - โœ… Try using Edge browser: `--browser edge`
322
+ - โœ… Enable debug mode: `--verbose --show-browser`
323
+
324
+ **โŒ No Papers Found**
325
+ - โœ… Verify subject code is correct (e.g., WIA1005, not wia1005)
326
+ - โœ… Check if papers exist for that subject
327
+ - โœ… Try different semester/year variations
328
+
329
+ **โŒ Download Errors**
330
+ - โœ… Check internet connection stability
331
+ - โœ… Increase timeout: `--timeout 60`
332
+ - โœ… Increase retries: `--max-retries 5`
333
+ - โœ… Check disk space in output directory
334
+
335
+ **โŒ Browser/WebDriver Issues**
336
+ - โœ… **Windows users**: Use Edge first: `--browser edge`
337
+ - โœ… Update browser to latest version
338
+ - โœ… Try: `pip install --upgrade webdriver-manager`
339
+ - โœ… See `TROUBLESHOOTING.md` for detailed solutions
340
+
341
+ ### **Exit Codes**
342
+ - `0` - Success
343
+ - `1` - Authentication failure
344
+ - `2` - Network connectivity issues
345
+ - `3` - No papers found or download failed
346
+ - `4` - File system permissions error
347
+ - `130` - User cancelled (Ctrl+C)
348
+
349
+ ---
350
+
351
+ ## ๐Ÿ“ˆ Performance Metrics
352
+
353
+ ### **Typical Performance**
354
+ - **Authentication**: 5-10 seconds
355
+ - **Paper Search**: 2-5 seconds
356
+ - **Download Speed**: 2-5 MB/s per file (concurrent)
357
+ - **ZIP Creation**: 1-3 seconds
358
+ - **Total Time**: 30 seconds - 2 minutes (depending on paper count)
359
+
360
+ ### **Optimization Features**
361
+ - **Concurrent Downloads**: Up to 4 simultaneous downloads
362
+ - **Intelligent Caching**: Avoids re-downloading existing files
363
+ - **Compressed Archives**: ZIP compression reduces file size by 10-30%
364
+ - **Progress Tracking**: Real-time ETA and speed indicators
365
+
366
+ ---
367
+
368
+ ## โš–๏ธ Legal & Academic Use
369
+
370
+ ### **Terms of Use**
371
+ - โœ… **Educational Purpose Only**: For UM students' academic use
372
+ - โœ… **Respect UM Policies**: Adheres to university terms of service
373
+ - โœ… **No Circumvention**: Uses standard authentication methods
374
+ - โœ… **Rate Limiting**: Respects server load limits
375
+ - โœ… **Valid Credentials Required**: Must have active UM account
376
+
377
+ ### **What This Tool Does NOT Do**
378
+ - โŒ Bypass any security measures
379
+ - โŒ Access restricted content
380
+ - โŒ Store or share credentials
381
+ - โŒ Violate copyright or academic policies
382
+ - โŒ Access content you don't have permission for
383
+
384
+ ---
385
+
386
+ ## ๐Ÿ’ก Tips for Best Experience
387
+
388
+ ### **For Windows Users**
389
+ ```bash
390
+ # Recommended command for Windows
391
+ python main.py --browser edge --subject-code WIA1005
392
+ ```
393
+
394
+ ### **For Mac/Linux Users**
395
+ ```bash
396
+ # Recommended command for Mac/Linux
397
+ python main.py --browser chrome --subject-code WIA1005
398
+ ```
399
+
400
+ ### **For Slow Connections**
401
+ ```bash
402
+ python main.py --timeout 90 --max-retries 5 --subject-code WIA1005
403
+ ```
404
+
405
+ ### **For Batch Processing**
406
+ ```bash
407
+ # Create a batch script for multiple subjects
408
+ python main.py -s WIA1005 --no-location-prompt -o "./Papers/WIA1005"
409
+ python main.py -s WXES1116 --no-location-prompt -o "./Papers/WXES1116"
410
+ ```
411
+
412
+ ---
413
+
414
+ ## ๐Ÿค Support & Contributing
415
+
416
+ ### **Getting Help**
417
+ 1. **๐Ÿ“– Read `TROUBLESHOOTING.md`** - Comprehensive solution guide
418
+ 2. **๐Ÿ” Check logs** - Review log files for detailed error information
419
+ 3. **๐Ÿงช Run tests** - Use `python test_setup.py` to validate environment
420
+ 4. **๐Ÿ”„ Try Edge browser** - Often resolves driver issues: `--browser edge`
421
+
422
+ ### **Contributing**
423
+ Contributions welcome! Please:
424
+ 1. Fork the repository
425
+ 2. Create a feature branch
426
+ 3. Make your changes with tests
427
+ 4. Submit a pull request
428
+ 5. Follow existing code style and documentation standards
429
+
430
+ ---
431
+
432
+ ## ๐Ÿ“„ Disclaimer
433
+
434
+ **Disclaimer**: This tool is an unofficial utility created to help UM students access past year papers more efficiently. It is not affiliated with or endorsed by University Malaya. Users are responsible for complying with UM's terms of service and academic policies.
435
+
436
+ ---
437
+
438
+ ## ๐ŸŽฏ Quick Command Cheat Sheet
439
+
440
+ ```bash
441
+ # Basic usage
442
+ python main.py
443
+
444
+ # Fast automated mode
445
+ python main.py -u username -s WIA1005 --no-location-prompt
446
+
447
+ # Debug mode
448
+ python main.py --verbose --show-browser -s WIA1005
449
+
450
+ # High performance
451
+ python main.py --max-retries 5 --timeout 60 -s WXES1116
452
+
453
+ # Custom location
454
+ python main.py -o "C:/Papers" -s CSC1025
455
+
456
+ # Windows optimized
457
+ python main.py --browser edge -s WIA1005
458
+ ```
459
+
460
+ ---
461
+
462
+ *Time to lock in for your final*