|
|
@@ -0,0 +1,142 @@
|
|
|
+# 2025-06-06 - CodeMCP: Explore Adding Open Tabs to Playlist Export
|
|
|
+
|
|
|
+## User Request
|
|
|
+the popup menu has a button to "export" the playlists. it currently puts the `playlists` and the `playbackHistory` into a json object along with the `exportDate`, and triggers the browser to download it. how feasible would it be to add `openTabs` to the export, containing a url and page title for each? don't make any code changes yet, just propose a plan for now.
|
|
|
+
|
|
|
+## Analysis
|
|
|
+
|
|
|
+### Current Export Implementation
|
|
|
+The export functionality is in `popup.js` lines 435-474 in the `exportPlaylists()` method:
|
|
|
+- Gets playlists from browser.storage.local
|
|
|
+- Gets playback history from browser.storage.local
|
|
|
+- Creates export data object with playlists, playbackHistory, and exportDate
|
|
|
+- Downloads as JSON file
|
|
|
+
|
|
|
+### Feasibility Assessment for Adding Open Tabs
|
|
|
+
|
|
|
+**HIGHLY FEASIBLE** - The implementation would be straightforward:
|
|
|
+
|
|
|
+#### Permissions ✅
|
|
|
+- Extension already has `"tabs"` permission in manifest.json
|
|
|
+- Firefox WebExtensions API `browser.tabs.query()` available to get all open tabs
|
|
|
+
|
|
|
+#### Technical Implementation ✅
|
|
|
+- Add `browser.tabs.query({})` call to get all open tabs
|
|
|
+- Extract URL and title from each tab
|
|
|
+- Add `openTabs` array to export data object
|
|
|
+- Minimal code changes (~10 lines)
|
|
|
+
|
|
|
+### Proposed Plan
|
|
|
+
|
|
|
+#### 1. Modify `exportPlaylists()` method
|
|
|
+```javascript
|
|
|
+// Add after getting history data:
|
|
|
+const tabsResult = await browser.tabs.query({});
|
|
|
+const openTabs = tabsResult
|
|
|
+ .filter(tab => tab.url && !tab.url.startsWith('moz-extension://') && !tab.url.startsWith('about:'))
|
|
|
+ .map(tab => ({
|
|
|
+ url: tab.url,
|
|
|
+ title: tab.title
|
|
|
+ }));
|
|
|
+
|
|
|
+// Add to export data:
|
|
|
+const exportData = {
|
|
|
+ playlists,
|
|
|
+ playbackHistory,
|
|
|
+ openTabs,
|
|
|
+ exportDate: new Date().toISOString(),
|
|
|
+};
|
|
|
+```
|
|
|
+
|
|
|
+#### 2. Error Handling
|
|
|
+- Wrap tabs query in try-catch
|
|
|
+- Gracefully handle permission or API issues
|
|
|
+- Provide fallback if tabs can't be accessed
|
|
|
+
|
|
|
+#### 3. Optional Filtering
|
|
|
+- Filter out extension internal pages
|
|
|
+- Filter out browser internal pages (about:, chrome://, etc.)
|
|
|
+- Consider deduplicating identical URLs
|
|
|
+
|
|
|
+### Benefits
|
|
|
+- **Minimal complexity**: Only ~10 lines of additional code
|
|
|
+- **No breaking changes**: Existing exports continue to work
|
|
|
+- **Useful data**: Open tabs represent current interests/research
|
|
|
+- **Consistent format**: Follows existing data structure pattern
|
|
|
+
|
|
|
+### Considerations
|
|
|
+- **Privacy**: Users should know open tabs are being exported
|
|
|
+- **Performance**: Large number of tabs (~100+) would create larger files
|
|
|
+- **Optional feature**: Could add checkbox to include/exclude open tabs
|
|
|
+
|
|
|
+### Recommendation
|
|
|
+**Proceed with implementation** - This is a low-risk, high-value addition that fits naturally with the existing export functionality.
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## Implementation
|
|
|
+
|
|
|
+### Changes Made
|
|
|
+
|
|
|
+#### 1. Modified `exportPlaylists()` method in popup.js
|
|
|
+- Added `browser.tabs.query({})` call to retrieve all open tabs
|
|
|
+- Added filtering to exclude browser internal pages:
|
|
|
+ - `moz-extension://` URLs (Firefox extension pages)
|
|
|
+ - `about:` URLs (Firefox internal pages)
|
|
|
+ - `chrome://` URLs (Chrome internal pages)
|
|
|
+- Added error handling with try-catch around tabs query
|
|
|
+- Added `openTabs` array to export data structure
|
|
|
+
|
|
|
+#### 2. Updated TODO list
|
|
|
+- Marked "include currently open tabs in export" as completed (X)
|
|
|
+
|
|
|
+### Final Implementation
|
|
|
+```javascript
|
|
|
+// Get open tabs
|
|
|
+let openTabs = [];
|
|
|
+try {
|
|
|
+ const tabsResult = await browser.tabs.query({});
|
|
|
+ openTabs = tabsResult
|
|
|
+ .filter(tab => tab.url &&
|
|
|
+ !tab.url.startsWith('moz-extension://') &&
|
|
|
+ !tab.url.startsWith('about:') &&
|
|
|
+ !tab.url.startsWith('chrome://'))
|
|
|
+ .map(tab => ({
|
|
|
+ url: tab.url,
|
|
|
+ title: tab.title || 'Untitled'
|
|
|
+ }));
|
|
|
+} catch (error) {
|
|
|
+ console.warn("Could not retrieve open tabs:", error);
|
|
|
+ openTabs = [];
|
|
|
+}
|
|
|
+
|
|
|
+// Create export data object
|
|
|
+const exportData = {
|
|
|
+ playlists,
|
|
|
+ playbackHistory,
|
|
|
+ openTabs,
|
|
|
+ exportDate: new Date().toISOString(),
|
|
|
+};
|
|
|
+```
|
|
|
+
|
|
|
+### Export Data Structure
|
|
|
+The exported JSON now includes:
|
|
|
+```json
|
|
|
+{
|
|
|
+ "playlists": { /* existing playlist data */ },
|
|
|
+ "playbackHistory": { /* existing history data */ },
|
|
|
+ "openTabs": [
|
|
|
+ {
|
|
|
+ "url": "https://example.com",
|
|
|
+ "title": "Example Page Title"
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ "exportDate": "2025-06-06T..."
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+### Features
|
|
|
+- **Graceful degradation**: If tabs can't be accessed, exports still work with empty `openTabs` array
|
|
|
+- **Privacy-conscious filtering**: Excludes internal browser/extension pages
|
|
|
+- **Fallback titles**: Uses 'Untitled' if tab has no title
|
|
|
+- **Non-breaking**: Existing import functionality will ignore the new `openTabs` field
|