Implement OPML subscription export#1392
Conversation
There was a problem hiding this comment.
Pull request overview
This PR implements OPML (Outline Processor Markup Language) export functionality for YouTube subscriptions, allowing users to export their channel subscriptions to a standardized format that can be imported into other RSS readers or applications.
Changes:
- Added OPML export functionality with support for both Storage Access Framework (Android 4.4+) and legacy file system access
- Created comprehensive unit tests for OPML generation and XML formatting
- Updated UI preferences to include OPML export option
Reviewed changes
Copilot reviewed 8 out of 8 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| app/src/test/java/free/rm/skytube/businessobjects/opml/OpmlExporterTest.java | Comprehensive test suite covering OPML generation, XML escaping, and edge cases |
| app/src/main/res/xml/preference_backup.xml | Added preference entry for OPML export option in backup settings |
| app/src/main/res/values/strings_preferences.xml | Added localized strings for OPML export UI elements and messages |
| app/src/main/java/free/rm/skytube/gui/fragments/preferences/BackupPreferenceFragment.java | Wired up OPML export preference click handler and removed deprecated onActivityResult |
| app/src/main/java/free/rm/skytube/gui/fragments/SubscriptionsFeedFragment.java | Removed unused Logger import |
| app/src/main/java/free/rm/skytube/gui/businessobjects/SubscriptionsBackupsManager.java | Implemented OPML export with SAF and legacy support, refactored to use ActivityResultLauncher |
| app/src/main/java/free/rm/skytube/businessobjects/opml/OpmlExporter.java | Core OPML export logic with XML generation and escaping utilities |
| app/src/main/java/free/rm/skytube/businessobjects/db/SubscriptionsDb.java | Added public method to retrieve subscribed channels for export |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| public void testGenerateOpmlCorrect() throws ParserConfigurationException, IOException, SAXException { | ||
| String opmlContent = OpmlExporter.generateOpmlContent(testChannels); | ||
|
|
||
| isOpmlIsValidXml(opmlContent, 3); |
There was a problem hiding this comment.
The method name 'isOpmlIsValidXml' contains a redundant 'is' prefix. It should be renamed to 'assertOpmlIsValidXml' or 'validateOpmlXml' to better reflect that it performs validation/assertions rather than returning a boolean.
app/src/test/java/free/rm/skytube/businessobjects/opml/OpmlExporterTest.java
Outdated
Show resolved
Hide resolved
app/src/main/java/free/rm/skytube/gui/businessobjects/SubscriptionsBackupsManager.java
Outdated
Show resolved
Hide resolved
|
|
||
| try (OutputStream outputStream = context.getContentResolver().openOutputStream(outputUri)) { | ||
| if (outputStream != null) { | ||
| byte[] bytes = opmlContent.getBytes("UTF-8"); |
There was a problem hiding this comment.
Use StandardCharsets.UTF_8 instead of the string literal "UTF-8" to avoid potential UnsupportedEncodingException and follow modern Java best practices. Change to: opmlContent.getBytes(StandardCharsets.UTF_8)
No description provided.