Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
5d4525e
Add numpy to pip installed packages
tedwaine Mar 26, 2026
d4d7c4e
Tweak for set video range action
tedwaine Mar 30, 2026
e190838
Handle missing Decklink hardware when drivers are installed (#238)
xShirae Mar 30, 2026
2d350e8
Initial checkin of filesystem_plugin prior to refactor.
richardssam Jan 28, 2026
05d7851
A ffmpeg constant changed, I believe the older one FF_PROFILE_UNKOWN …
richardssam Jan 25, 2026
eff5735
Cleanup GUI
richardssam Jan 29, 2026
30682b1
Adding fileseq for the python libraries for the FileSystem Browser.
richardssam Jan 29, 2026
d9bc3c5
Got the progress bar to work correctly.
richardssam Jan 29, 2026
215308d
Fix for color scheme for right click menu.
richardssam Jan 29, 2026
b7613e9
Add readme.
richardssam Jan 29, 2026
f92f6ad
Adding copyright/license info.
richardssam Jan 29, 2026
aca6205
Adding (c).
richardssam Jan 29, 2026
9963db9
Dont be quite so agressive updating the UI, only do it every 5 secs o…
richardssam Jan 29, 2026
eec6ff0
Swapped file-browser with a history view.
richardssam Feb 1, 2026
d495a54
Updated readme.
richardssam Feb 1, 2026
565ca41
Fixing QML issue.
richardssam Feb 3, 2026
823243a
Demo of widget as a floating window.
richardssam Feb 3, 2026
3f881dc
Filtering fixes.
richardssam Feb 3, 2026
7c0a8cf
Switched to a tree-view with some "smart" collapsing of directories.
richardssam Feb 3, 2026
b9a13d4
Fixed the file-loading issue, it was trying to load a relative path.
richardssam Feb 3, 2026
f314a27
Double clicking on a directory changes the overall search window path.
richardssam Feb 3, 2026
14a5381
Make the search case insensitive.
richardssam Feb 3, 2026
edd7bdd
Adding different types of tree view. and recursion depths.
richardssam Feb 11, 2026
83c81fb
Minor tweak to prune empty folders if we are filtering.
richardssam Feb 11, 2026
d6e6b81
Adding a directory view.
richardssam Feb 12, 2026
a699eb9
Filtering all the time.
richardssam Feb 14, 2026
55e2343
GUI update:
richardssam Feb 27, 2026
b751312
Added a preview mode, so when you click on a clip, it will automatica…
richardssam Mar 1, 2026
8a13e7f
Updated to have a common style, and synced style with xstudio.
richardssam Apr 1, 2026
c788f5e
More style fixes, and also making menu options consistent between ico…
richardssam Apr 2, 2026
e5fd32a
Adding a show-in-finder menu option.
richardssam Apr 2, 2026
6e2b762
MInor bug fixes, cleaning threading.
richardssam Apr 2, 2026
2471d75
Some code refactoring to simplify it, in particular the dispatch table.
richardssam Apr 2, 2026
cb69655
Setup a interface class, so that if you want to change the back end y…
richardssam Apr 2, 2026
7bffd1d
Removed some debug output and removed an un-necesary header.
richardssam Apr 3, 2026
6082ae5
Fixed a padding issue.
richardssam Apr 3, 2026
6882baf
Added ability to set the directory root.
richardssam Apr 3, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ if (USE_VCPKG)
message(FATAL_ERROR "Failed to ensurepip.")
else()
execute_process(
COMMAND "${Python_EXECUTABLE}" -m pip install setuptools sphinx breathe sphinx-rtd-theme OpenTimelineIO-Plugins importlib_metadata zipp
COMMAND "${Python_EXECUTABLE}" -m pip install setuptools sphinx breathe sphinx-rtd-theme OpenTimelineIO-Plugins importlib_metadata zipp numpy fileseq
RESULT_VARIABLE PIP_RESULT
)
if(PIP_RESULT)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,8 @@ def _plugin_metadata(self, media):
metadata = media.media_source().get_metadata(
"/colour_pipeline"
)
if not metadata:
metadata = {}
return metadata.get("ocio_py_plugin", {})

def _set_plugin_metadata(self, media, plugin_metadata):
Expand Down
2 changes: 1 addition & 1 deletion src/plugin/media_metadata/ffprobe/src/ffprobe_lib.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -444,7 +444,7 @@ nlohmann::json populate_stream(AVFormatContext *avfc, int index, MediaStream *is
result["profile"] = nullptr;
if (profile = avcodec_profile_name(par->codec_id, par->profile))
result["profile"] = profile;
else if (par->profile != FF_PROFILE_UNKNOWN) {
else if (par->profile != AV_PROFILE_UNKNOWN) {
result["profile"] = std::to_string(par->profile);
}

Expand Down
68 changes: 68 additions & 0 deletions src/plugin/python_plugins/filesystem_browser/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# Filesystem Browser Plugin for xStudio

A high-performance, multi-threaded filesystem browser for xStudio, designed to handle large directories and image sequences efficiently.

## Features

- **Fast Multi-threaded Scanning**: Uses a thread pool and BFS algorithm to scan directories quickly without freezing the UI.
- **Image Sequence Detection**: Automatically detects and groups file sequences (e.g., `shot_001.1001.exr` -> `shot_001.####.exr`). Supports exclusion of specific extensions (e.g., `.mov`, `.mp4`) via configuration.
- **Smart Filtering**:
- **Text Filter**: Supports "AND" logic (space-separated terms). E.g., `comp exr` finds files matchings both "comp" and "exr".
- **Time Filter**: Filter by modification time (Last 1 day, 1 week, etc.).
- **Version Filter**: Filter to show only the latest version or latest 2 versions of a shot.
- **Navigation**:
- Native Directory Picker integration.
- Path completion/suggestions.
- History tracking (via sticky attributes).
- **Playback Integration**:
- **Double-Click**: Loads media and immediately starts playback using the playlist's playhead logic.
- **Context Menu**:
- **Replace**: Replaces the currently viewed media with the selected item.
- **Compare with**: Loads the selected item and sets up an A/B comparison with the current media.

## Usage

1. **Open the Browser**:
- Go to `View` -> `Panels` -> `Filesystem Browser`.
- Or use the hotkey **'B'**.
2. **Navigation**:
- Enter a path in the text field or click the folder icon to browse.
- **Double-click** a folder to navigate into it.
- **Quick Access (▼)**: Click the arrow next to the path field to open the Quick Access list.
- **History**: Shows recently visited directories.
- **Pinned**: Shows your pinned locations for easy access.
- **Pinning**: Click the "Pin" icon (📌) next to any item to pin or unpin it. Pinned items appear at the top in gold.

## Configuration

### Environment Variables

- `XSTUDIO_BROWSER_PINS`: Pre-define a list of pinned directories.
- Format: JSON list of objects or simple path string (colon-separated on Unix, semicolon on Windows).
- Example (JSON): `'[{"name": "Show", "path": "/jobs/show"}, "/home/user"]'`
- Example (Simple): `/jobs/show:/home/user`

3. **Loading Media**:
- **Double-click** a file/sequence to load it into the current or new playlist.
- **Right-click** for advanced actions (Replace, Compare).

## Logic & Performance

- **Scanning**: The scanner runs in a background thread, reporting partial results to the UI to keep it responsive.
- **Sequences**: Uses the `fileseq` library (for robust sequence parsing.

## Testing

A benchmark script is included to test the scanner performance:

```bash
python scanner_benchmark.py --threads 2 /shots/MYSHOW/MYSHOT
```

This allows you to test the scanning performance at different thread speeds for the specified directory.

```bash
python test_scanner.py
```
Unit test for scanner.

1 change: 1 addition & 0 deletions src/plugin/python_plugins/filesystem_browser/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .filesystem_browser import create_plugin_instance
42 changes: 42 additions & 0 deletions src/plugin/python_plugins/filesystem_browser/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
{
"extensions": [
".mov",
".mp4",
".mkv",
".exr",
".jpg",
".jpeg",
".png",
".dpx",
".tiff",
".tif",
".wav",
".mp3",
".pdf"
],
"ignore_dirs": [
".git",
".quarantine",
"eryx_unreal_plugin",
".DS_Store"
],
"root_ignore_dirs": [
"/Applications",
"/bin",
"/cores",
"/dev",
"/etc",
"/Library",
"/opt",
"/private",
"/sbin",
"/System",
"/usr",
"/var",
"/proc",
"/sys",
"/snap"
],
"max_recursion_depth": 6,
"auto_scan_threshold": 4
}
Loading