https://github.com/kometenstaub/metadata-extractor
Obsidian Plugin that provides metadata export for use with third-party apps.
https://github.com/kometenstaub/metadata-extractor
obsidian-plugin obsidianmd
Last synced: 8 months ago
JSON representation
Obsidian Plugin that provides metadata export for use with third-party apps.
- Host: GitHub
- URL: https://github.com/kometenstaub/metadata-extractor
- Owner: kometenstaub
- License: mit
- Created: 2021-09-14T15:28:23.000Z (about 4 years ago)
- Default Branch: main
- Last Pushed: 2023-10-24T14:35:43.000Z (almost 2 years ago)
- Last Synced: 2025-01-23T05:17:22.823Z (9 months ago)
- Topics: obsidian-plugin, obsidianmd
- Language: TypeScript
- Homepage:
- Size: 155 KB
- Stars: 104
- Watchers: 2
- Forks: 7
- Open Issues: 7
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# Metadata Extractor Obsidian plugin
This plugin allows you to write Obsidian vault metadata, which is only accessible via plugin, onto the hard drive. This enables Third-party apps to access Obsidian metadata which they normally wouldn't be able to access. Exemplary use cases are launcher apps (e.g. Alfred, Ulauncher) or graph analysis software.
See [this guide](https://github.com/kometenstaub/metadata-extractor/blob/main/docs/Guide%20-%20Controlling%20Obsidian%20via%20Third-Party-App.md) for more information on Controlling Obsidian via a Third-party App.
## There are four JSON-exports
They can be executed on a schedule.
### Tag export
One writes a JSON file to disk with each tag and its corresponding file paths.
Example:
```json
[
{
"tag": "css-themes",
"tagCount": 5,
"relativePaths": ["Advanced topics/Contributing to Obsidian.md"]
},
{
"tag": "insider-build",
"tagCount": 3,
"relativePaths": ["Advanced topics/Insider builds.md"]
},
{
"tag": "anothertag",
"tagCount": 2,
"relativePaths": [
"Plugins/Zettelkasten prefixer.md",
"Advanced topics/Using obsidian URI.md"
]
}
]
```TypeScript interface:
```ts
/**
* JSON export: tagToFile[]
*/
interface tagToFile {
tag: string;
tagCount: number;
relativePaths: string[] | string;
};
```### Markdown notes metadata export
The second one writes a JSON file to disk with metadata for each file name. This is how the JSON structure is as a TypeScript interface.
```ts
/**
* JSON export: Metadata[]
*/
import {extendedFrontMatterCache} from "./interfaces";interface Metadata {
fileName: string;
relativePath: string;
tags?: string[];
headings?: { heading: string; level: number }[];
aliases?: string[];
links?: links[];
backlinks?: backlinks[];
frontmatter?: extendedFrontMatterCache;
}interface links {
link: string;
relativePath?: string;
cleanLink?: string;
displayText?: string;
}interface backlinks {
fileName: string;
link: string;
relativePath: string;
cleanLink?: string;
displayText?: string;
}interface extendedFrontMatterCache {
cssclass?: string;
publish?: boolean;
position: Pos; // Pos is from the Obsidian API
[key: string]: any;
}
```The exported array contains a JSON array with `Metadata` objects, one object for each Markdown file in your vault.
All objects have a `fileName` and a `relativePath`. `fileName` doesn't contain the `.md` extension, `relativePath` is the path from your vault root.
If a file has tags, the object has a `tags` property that contains an array of tags. Tags are all lower-cased and if a tag appears more than one time in a file, it will only appear one time in `tags`. If a file has any frontmatter it is included in `frontmatter`. The structure of the object depends on your frontmatter.
`aliases`, `links` and `backlinks` also only exist if there are any of the in a file.
#### `links` interface
The `links` contain both links to existing and non-existing files. If a file doesn't exist, the `links` won't have a `relativePath`.
`link` is the full link, exluding anything after the `|`, so if no alias is set, it also contains `#` or `#^` if there are headings or block references. If that is the case, there is also the `cleanLink` property which provides just the filename for the link (omitting the `.md` extension).
`displayText` is what is displayed by Obsidian in preview mode. It can be the alias, but also the file name if there is a heading or block reference. If it is a heading link or block reference to the same file, it excludes the `#`, just like Obsidian does in preview mode.
`cleanLink` and `displayText` don't exist if it is a normal link.
#### `backlinks` interface
Backlinks always have a `relativePath` property because the file linking to the current file (object) needs to exist.
`fileName` and `relativePath` are the file which contains the backlink.
`link`, `cleanLink` and `displayText` behave as [the links interface](#links-interface)
### Non-Markdown files metadata export
The third writes a JSON file containing both all folders and non-Markdown files. The structure is like this.
```ts
/**
* JSON export
*/
interface exceptMd {
folders: folder[];
nonMdFiles?: file[];
}interface folder {
name: string;
relativePath: string;
}interface file {
name: string;
basename: string;
relativePath: string;
}
```#### `file` interface
The `name` is the file name including the extension, `basename` excludes it. `relativePath` is the path from the vault root.
### Canvas metadata export
The fourth export writes a JSON file containing `name`, `basename` and `relativePath` of canvas files as object in an array.
```json
[
{
"name": "my-canvas.canvas",
"basename": "my-canvas",
"relativePath": "Inbox/my-canvas.canvas"
},
{
"name": "visualisation.canvas",
"basename": "visualisation",
"relativePath": "visualisation.canvas"
}
]
```## Configuration
If you don't touch any settings, the files will be saved to the plugin folder. You can configure their names in the settings.
You can however also specify absolute paths for each file. They need to include the file name and extension in this case. The setting above won't have any effect then.
You can also set the frequency for writing the JSON files in minutes (default setting is 0, so it is not enabled) and whether the JSON files should be written on launch (default setting is false).