feat: add Google Drive folder filter (#22)

* feat: add support for filtering files by specified Google Drive folder IDs

* docs: update README to clarify optional folder filtering feature and provide usage examples
This commit is contained in:
JuninhoSantosMr
2025-09-26 07:46:42 -03:00
committed by GitHub
parent 8945ed79f1
commit 444f764aa5
2 changed files with 57 additions and 3 deletions
+36 -1
View File
@@ -2,7 +2,7 @@
This is a simple addon for Stremio that allows you to watch videos from Google Drive. This is a simple addon for Stremio that allows you to watch videos from Google Drive.
It searches your entire Google Drive and any shared drives you have access to for videos and presents them in Stremio. By default, it searches your entire Google Drive and any shared drives you have access to for videos and presents them in Stremio. You can optionally restrict results to specific folders via `CONFIG.driveFolderIds`.
If you combine it with some team drives, you have loads of content, all available to watch for free and without torrenting. If you combine it with some team drives, you have loads of content, all available to watch for free and without torrenting.
@@ -15,6 +15,7 @@ If you combine it with some team drives, you have loads of content, all availabl
- Catalog support - both search and full list on home page - Catalog support - both search and full list on home page
- Kitsu support. - Kitsu support.
- TMDB Meta support if TMDB api key is provided. - TMDB Meta support if TMDB api key is provided.
- Optional filtering by specific Google Drive folders (non-recursive).
- Easily configurable using the `CONFIG` object at the top of the code. (See [Configuration](#configuration)) - Easily configurable using the `CONFIG` object at the top of the code. (See [Configuration](#configuration))
- Change the addon name - Change the addon name
- Change the order of resolutions, qualities, visual tags, and filter them out if unwanted - Change the order of resolutions, qualities, visual tags, and filter them out if unwanted
@@ -233,3 +234,37 @@ This table explains the configuration options:
| `proxiedPlayback` | `boolean` | `true`, `false` | With `proxiedPlayback` enabled, the file will be streamed through the addon. If it is disabled, Stremio will stream directly from Google Drive. <br><br>If this option is disabled, streaming will not work on Stremio Web or through external players on iOS. You are also exposing your access token in the addon responses. <br><br>However, this option is experimental and may cause issues.<br><br>I recommend leaving it enabled, and only if you encounter issues, try disabling this option. <br><br>Note, that even with this enabled, anyone with your addon URL can still view your Google Drive files. | | `proxiedPlayback` | `boolean` | `true`, `false` | With `proxiedPlayback` enabled, the file will be streamed through the addon. If it is disabled, Stremio will stream directly from Google Drive. <br><br>If this option is disabled, streaming will not work on Stremio Web or through external players on iOS. You are also exposing your access token in the addon responses. <br><br>However, this option is experimental and may cause issues.<br><br>I recommend leaving it enabled, and only if you encounter issues, try disabling this option. <br><br>Note, that even with this enabled, anyone with your addon URL can still view your Google Drive files. |
| `driveQueryTerms.`<br>`episodeFormat` | `String` | `"name"`, `"fullText"` (see the Drive v3 API for more) | This setting changes the object that we perform the queries upon for the episode formats (s01e03).<br><br>I recommend leaving this to fullText. However, if you are getting incorrect matches, try switching to name | | `driveQueryTerms.`<br>`episodeFormat` | `String` | `"name"`, `"fullText"` (see the Drive v3 API for more) | This setting changes the object that we perform the queries upon for the episode formats (s01e03).<br><br>I recommend leaving this to fullText. However, if you are getting incorrect matches, try switching to name |
| `driveQueryTerms.`<br>`movieYear` | `String` | `"name"`, `"fullText"` | This setting changes the object that we perform queries upon for the release year of the movie.<br><br>I recommend leaving this to name. However, if you are getting incorrect matches, try switching to fullText. | | `driveQueryTerms.`<br>`movieYear` | `String` | `"name"`, `"fullText"` | This setting changes the object that we perform queries upon for the release year of the movie.<br><br>I recommend leaving this to name. However, if you are getting incorrect matches, try switching to fullText. |
| `driveFolderIds` | `String[]` | Google Drive folder IDs (e.g., `"1abc..."`, `"2def..."`) | Restricts both catalog and search to files **directly** inside any of the listed folders. Multiple IDs allowed. **Nonrecursive** (subfolders are ignored). |
### Folder filtering
**Quick start**
```js
const CONFIG = {
// ...
driveFolderIds: [
"<FOLDER_ID_1>",
"<FOLDER_ID_2>"
]
};
```
#### How to get the folder ID
1) **Through the browser (URL bar)**
- Open the folder in Google Drive (web).
- Copy the part **after** `/folders/` in the URL.
- Example:
`https://drive.google.com/drive/folders/1aBcD2E3fG4hiJ5k6LMnOpQRs7tuVXy-8`**ID** = `1aBcD2E3fG4hiJ5k6LMnOpQRs7tuVXy-8`
2) **By using "Get link"**
- Right-click on the folder → **Get link****Copy link**.
- The ID is the long string **between** `/folders/` and the `?` (if present) in the copied link.
3) **Shared Drives**
- Same process: open the desired folder in the shared drive and copy the ID from the URL.
> **Notes**
> - The filter is **non-recursive**: subfolders are **not** automatically included. Add each subfolder in `driveFolderIds` if you want to include it.
> - You can list **multiple** folder IDs in `driveFolderIds`.
> - Make sure the account used in OAuth has access to these folders; otherwise, nothing will be returned.
+21 -2
View File
@@ -37,6 +37,7 @@ const CONFIG = {
episodeFormat: "fullText", episodeFormat: "fullText",
titleName: "name", titleName: "name",
}, },
driveFolderIds: [],
}; };
const MANIFEST = { const MANIFEST = {
@@ -856,6 +857,11 @@ function buildBaseSearchQuery(query) {
q += ` and mimeType contains 'video/'`; q += ` and mimeType contains 'video/'`;
} }
if (CONFIG.driveFolderIds && CONFIG.driveFolderIds.length > 0) {
const folderQueries = CONFIG.driveFolderIds.map(id => `'${id}' in parents`);
q += ` and (${folderQueries.join(' or ')})`;
}
console.log({ message: "Built base search query", query: q }); console.log({ message: "Built base search query", query: q });
return q; return q;
} }
@@ -870,6 +876,11 @@ async function buildSearchQuery(streamRequest) {
? ` and (mimeType contains 'video/' or mimeType contains 'audio/')` ? ` and (mimeType contains 'video/' or mimeType contains 'audio/')`
: ` and mimeType contains 'video/'`; : ` and mimeType contains 'video/'`;
if (CONFIG.driveFolderIds && CONFIG.driveFolderIds.length > 0) {
const folderQueries = CONFIG.driveFolderIds.map(id => `'${id}' in parents`);
query += ` and (${folderQueries.join(' or ')})`;
}
const sanitisedName = name const sanitisedName = name
.replace(/[^\p{L}\p{N}\s]/gu, "") .replace(/[^\p{L}\p{N}\s]/gu, "")
.replace(/'/g, "\\'"); .replace(/'/g, "\\'");
@@ -1087,9 +1098,17 @@ async function handleRequest(request) {
console.log({ message: "Catalog request", catalogId, searchTerm }); console.log({ message: "Catalog request", catalogId, searchTerm });
if (catalogId === "gdrive_list") { if (catalogId === "gdrive_list") {
// get list of all video files const parts = [
"trashed=false",
"mimeType contains 'video/'"
];
if (CONFIG.driveFolderIds && CONFIG.driveFolderIds.length > 0) {
const ors = CONFIG.driveFolderIds.map(id => `'${id}' in parents`);
parts.push(`(${ors.join(" or ")})`);
}
const queryParams = { const queryParams = {
q: "mimeType contains 'video/'", q: parts.join(" and "),
corpora: "allDrives", corpora: "allDrives",
includeItemsFromAllDrives: "true", includeItemsFromAllDrives: "true",
supportsAllDrives: "true", supportsAllDrives: "true",