Merge pull request #10 from Trivernis/develop

Patch 0.13.3
pull/30/head v0.13.3
Julius Riegel 3 years ago committed by GitHub
commit 8c4f429d51
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -1,59 +0,0 @@
name: Build and test api
on:
workflow_dispatch:
push:
branches: [ main, develop ]
pull_request:
branches: [ main, develop ]
env:
CARGO_TERM_COLOR: always
jobs:
build:
defaults:
run:
shell: bash
working-directory: mediarepo-api
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v2
if: ${{ !env.ACT }}
- name: Cache build data
if: ${{ !env.ACT }}
uses: actions/cache@v2
with:
path: |
target
~/.cargo/
key: ${{ runner.os }}-cargo-${{ hashFiles('Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-
- name: Install OS-specific dependencies
uses: knicknic/os-specific-run@v1.0.3
with:
linux: |
sudo apt-get update
DEBIAN_FRONTEND=noninteractive sudo apt-get install libwebkit2gtk-4.0-dev libgtk-3-dev libappindicator3-dev -y
- name: Build
run: cargo build
- name: Build API
run: cargo build --features=client-api
- name: Build Plugin
run: cargo build --features=tauri-plugin
- name: Test
run: cargo test --all-features

@ -1,51 +0,0 @@
name: Build daemon
on:
workflow_dispatch:
push:
branches: [ main, develop ]
pull_request:
branches: [ main, develop ]
env:
CARGO_TERM_COLOR: always
jobs:
build:
defaults:
run:
shell: bash
working-directory: mediarepo-daemon
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v2
if: ${{ !env.ACT }}
- name: Cache build data
if: ${{ !env.ACT }}
uses: actions/cache@v2
with:
path: |
target
~/.cargo/
key: ${{ runner.os }}-cargo-${{ hashFiles('Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-
- name: Build
run: cargo build --release --no-default-features
- name: Upload artifacts
if: ${{ !env.ACT }}
uses: actions/upload-artifact@v2
with:
name: mediarepo-daemon-${{ runner.os }}
path: |
target/release/mediarepo-daemon*

@ -1,150 +0,0 @@
name: Build ui
on:
workflow_dispatch:
push:
branches:
- main
- develop
pull_request:
branches:
- main
- develop
jobs:
build-debug:
defaults:
run:
shell: bash
working-directory: mediarepo-ui
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
steps:
- uses: actions/checkout@v2
if: ${{ !env.ACT }}
- name: Cache Dependencies
if: ${{ !env.ACT }}
id: cache-dependencies
uses: actions/cache@v2
with:
path: |
node_modules
src-tauri/target/**/deps
/home/runner/.cargo/bin
~/.cargo
key: ${{ runner.os }}-dependencies-${{ hashFiles('src-tauri/Cargo.lock') }}-${{ hashFiles('yarn.lock') }}
restore-keys: |
${{ runner.os }}-dependencies-
${{ runner.os }}-release-dependencies-
- name: Use Node.js 16
uses: actions/setup-node@v1
with:
node-version: 16
- name: Install Tauri
run: cargo install tauri-cli --git https://github.com/tauri-apps/tauri
- name: Install Angular CLI
run: npm install -g @angular/cli
- name: Install yarn
run: npm install -g yarn
- name: Install dependencies
run: yarn install
- name: Install OS-specific dependencies
uses: knicknic/os-specific-run@v1.0.3
with:
linux: |
sudo apt-get update
DEBIAN_FRONTEND=noninteractive sudo apt-get install libwebkit2gtk-4.0-dev libgtk-3-dev libappindicator3-dev -y
- name: Build project
run: cargo tauri build --debug
- name: Upload artifacts
if: ${{ !env.ACT }}
uses: actions/upload-artifact@v2
with:
name: mediarepo-ui-${{ runner.os }}-debug
path: |
src-tauri/target/debug/bundle
src-tauri/target/debug/mediarepo-ui*
build-release:
defaults:
run:
shell: bash
working-directory: mediarepo-ui
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
steps:
- uses: actions/checkout@v2
if: ${{ !env.ACT }}
- name: Cache Dependencies
if: ${{ !env.ACT }}
id: cache-dependencies
uses: actions/cache@v2
with:
path: |
node_modules
src-tauri/target
/home/runner/.cargo
~/.cargo
key: ${{ runner.os }}-release-dependencies-${{ hashFiles('src-tauri/Cargo.lock') }}-${{ hashFiles('yarn.lock') }}
restore-keys: |
${{ runner.os }}-release-dependencies-
${{ runner.os }}-dependencies-
- name: Use Node.js 16
uses: actions/setup-node@v1
with:
node-version: 16
- name: Install Tauri
run: cargo install tauri-cli --git https://github.com/tauri-apps/tauri
- name: Install Angular CLI
run: npm install -g @angular/cli
- name: Install yarn
run: npm install -g yarn
- name: Install dependencies
run: yarn install
- name: Install OS-specific dependencies
uses: knicknic/os-specific-run@v1.0.3
with:
linux: |
sudo apt-get update
DEBIAN_FRONTEND=noninteractive sudo apt-get install libwebkit2gtk-4.0-dev libgtk-3-dev libappindicator3-dev -y
- name: Build project
run: cargo tauri build
- name: Upload artifacts
if: ${{ !env.ACT }}
uses: actions/upload-artifact@v2
with:
name: mediarepo-ui-${{ runner.os }}-release
path: |
src-tauri/target/release/bundle
src-tauri/target/release/mediarepo-ui*

@ -0,0 +1,174 @@
name: Build and test
on:
workflow_dispatch:
push:
branches: [ main, gh-actions ]
pull_request:
branches: [ main ]
env:
CARGO_TERM_COLOR: always
jobs:
build-api:
defaults:
run:
shell: bash
working-directory: mediarepo-api
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v2
if: ${{ !env.ACT }}
- name: Cache build data
if: ${{ !env.ACT }}
uses: actions/cache@v2
with:
path: |
target
~/.cargo/
key: ${{ runner.os }}-cargo-${{ hashFiles('Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-
- name: Install OS-specific dependencies
uses: knicknic/os-specific-run@v1.0.3
with:
linux: |
sudo apt-get update
DEBIAN_FRONTEND=noninteractive sudo apt-get install libwebkit2gtk-4.0-dev libgtk-3-dev libappindicator3-dev -y
- name: Build
run: cargo build
- name: Build API
run: cargo build --features=client-api
- name: Build Plugin
run: cargo build --features=tauri-plugin
- name: Test
run: cargo test --all-features
build-daemon:
# to run fewer steps in parallel
needs: build-api
defaults:
run:
shell: bash
working-directory: mediarepo-daemon
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v2
if: ${{ !env.ACT }}
- name: Cache build data
if: ${{ !env.ACT }}
uses: actions/cache@v2
with:
path: |
target
~/.cargo/
key: ${{ runner.os }}-cargo-${{ hashFiles('Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-
- name: Build
run: cargo build --release --no-default-features
- name: Upload artifacts
if: ${{ !env.ACT }}
uses: actions/upload-artifact@v2
with:
name: mediarepo-daemon-${{ runner.os }}
path: |
target/release/mediarepo-daemon*
build-ui:
# to run fewer steps in parallel
needs: build-api
defaults:
run:
shell: bash
working-directory: mediarepo-ui
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
steps:
- uses: actions/checkout@v2
if: ${{ !env.ACT }}
- name: Cache Dependencies
if: ${{ !env.ACT }}
id: cache-dependencies
uses: actions/cache@v2
with:
path: |
node_modules
src-tauri/target
/home/runner/.cargo
~/.cargo
key: ${{ runner.os }}-release-dependencies-${{ hashFiles('src-tauri/Cargo.lock') }}-${{ hashFiles('yarn.lock') }}
restore-keys: |
${{ runner.os }}-release-dependencies-
${{ runner.os }}-dependencies-
- name: Use Node.js 16
uses: actions/setup-node@v1
with:
node-version: 16
- name: Install Tauri
run: cargo install tauri-cli --git https://github.com/tauri-apps/tauri
- name: Install Angular CLI
run: npm install -g @angular/cli
- name: Install yarn
run: npm install -g yarn
- name: Install dependencies
run: yarn install
- name: Install OS-specific dependencies
uses: knicknic/os-specific-run@v1.0.3
with:
linux: |
sudo apt-get update
DEBIAN_FRONTEND=noninteractive sudo apt-get install libwebkit2gtk-4.0-dev libgtk-3-dev libappindicator3-dev -y
- name: Build project
run: cargo tauri build
- name: Upload artifacts
if: ${{ !env.ACT }}
uses: actions/upload-artifact@v2
with:
name: mediarepo-ui-${{ runner.os }}-release
path: |
src-tauri/target/release/bundle
src-tauri/target/release/mediarepo-ui*

@ -2,34 +2,43 @@
mediarepo mediarepo
</h1> </h1>
<p align="center"> <p align="center">
<img src="https://github.com/Trivernis/mediarepo-ui/raw/main/src-tauri/icons/64x64.png"/> <img src="https://github.com/Trivernis/mediarepo/raw/main/mediarepo-ui/src-tauri/icons/64x64.png"/>
</p>
<h3 align="center" style="color:red">mediarepo is a work in progress</h3>
<p align="center">
<a href="https://github.com/Trivernis/mediarepo/actions/workflows/build.yml">
<img src="https://img.shields.io/github/workflow/status/trivernis/mediarepo/Build%20and%20test?style=for-the-badge">
</a>
<a href="https://mediarepo.trivernis.dev">
<img src="https://img.shields.io/website?style=for-the-badge&url=https%3A%2F%2Fmediarepo.trivernis.dev">
</a>
<a href="https://aur.archlinux.org/packages/mediarepo">
<img src="https://img.shields.io/aur/version/mediarepo?style=for-the-badge">
</a>
<img src="https://img.shields.io/aur/license/mediarepo?style=for-the-badge">
</p> </p>
<h3 align="center" style="color:red">This repository is a work in progress</h3>
- - - - - -
Mediarepo is a tool for managing media files. Mediarepo is a tool for managing media files.
It works similar to image boards (boorus) as it allows one to assign tags to media entries and It works similar to image boards (boorus) as it allows one to assign tags to media entries and
search for entries by using those tags. It is heavily inspired by [hydrus](https://github.com/hydrusnetwork/hydrus/). search for entries by using those tags. It is inspired by [hydrus](https://github.com/hydrusnetwork/hydrus/) with the goal to provide a good looking and fast
way to organize all kinds of media.
## Usage ## Installation
1. Initialize an empty repository In order to use mediarepo, the mediarepo daemon and UI application need to be installed.
``` Both can be downloaded from the [Releases](https://github.com/Trivernis/mediarepo/releases) page or the AUR.
mediarepo --repo "where/your/repo/should/be" init
```
2. Import some images ```sh
``` yay -S mediarepo-daemon mediarepo
mediarepo --repo "path/to/your/repo" import "path/to/your/files/as/**/glob/*.png"
``` ```
3. Start the daemon When installing manually the `mediarepo-daemon` binary needs to be accessible in the `PATH` variable.
```
mediarepo --repo "path/to/your/repo start ## Usage and Further Information
```
4. Open the mediarepo-ui and connect to the repository Please consult the [official website](https://mediarepo.trivernis.dev) for more information.
## License ## License

@ -1226,7 +1226,7 @@ dependencies = [
[[package]] [[package]]
name = "mediarepo-daemon" name = "mediarepo-daemon"
version = "0.13.2" version = "0.13.3"
dependencies = [ dependencies = [
"console-subscriber", "console-subscriber",
"glob", "glob",

@ -4,7 +4,7 @@ default-members = ["mediarepo-core", "mediarepo-database", "mediarepo-logic", "m
[package] [package]
name = "mediarepo-daemon" name = "mediarepo-daemon"
version = "0.13.2" version = "0.13.3"
edition = "2018" edition = "2018"
license = "gpl-3" license = "gpl-3"
repository = "https://github.com/Trivernis/mediarepo-daemon" repository = "https://github.com/Trivernis/mediarepo-daemon"

@ -132,6 +132,8 @@ fn build_tag_condition(tag: AddTagDto) -> Condition {
.add(tag::Column::Name.eq(tag.name)) .add(tag::Column::Name.eq(tag.name))
.add(namespace::Column::Name.eq(namespace)) .add(namespace::Column::Name.eq(namespace))
} else { } else {
Condition::all().add(tag::Column::Name.eq(tag.name)) Condition::all()
.add(tag::Column::Name.eq(tag.name))
.add(tag::Column::NamespaceId.is_null())
} }
} }

@ -0,0 +1,90 @@
use crate::dao::tag::{map_tag_dto, TagDao};
use crate::dto::TagDto;
use mediarepo_core::error::RepoResult;
use mediarepo_core::itertools::Itertools;
use mediarepo_database::entities::{content_descriptor, content_descriptor_tag, namespace, tag};
use sea_orm::prelude::*;
use std::collections::HashMap;
impl TagDao {
#[tracing::instrument(level = "debug", skip(self, cds))]
pub async fn all_for_cds_map(
&self,
cds: Vec<Vec<u8>>,
) -> RepoResult<HashMap<Vec<u8>, Vec<TagDto>>> {
let mut cd_tag_map = cds
.iter()
.cloned()
.map(|cd| (cd, Vec::new()))
.collect::<HashMap<Vec<u8>, Vec<TagDto>>>();
let tag_cd_entries = tags_for_cds(&self.ctx.db, cds).await?;
let tag_ids: Vec<i64> = tag_cd_entries
.iter()
.map(|(t, _)| t.tag_id)
.unique()
.collect();
let tags = tags_for_tag_ids(&self.ctx.db, tag_ids).await?;
let tag_id_map = tags
.into_iter()
.map(|t| (t.id(), t))
.collect::<HashMap<i64, TagDto>>();
let existing_cds_with_tags = create_cd_tag_map(tag_cd_entries, tag_id_map);
cd_tag_map.extend(existing_cds_with_tags.into_iter());
Ok(cd_tag_map)
}
}
async fn tags_for_cds(
db: &DatabaseConnection,
cds: Vec<Vec<u8>>,
) -> RepoResult<
Vec<(
content_descriptor_tag::Model,
Option<content_descriptor::Model>,
)>,
> {
let tag_cd_entries = content_descriptor_tag::Entity::find()
.find_also_related(content_descriptor::Entity)
.filter(content_descriptor::Column::Descriptor.is_in(cds))
.all(db)
.await?;
Ok(tag_cd_entries)
}
async fn tags_for_tag_ids(db: &DatabaseConnection, ids: Vec<i64>) -> RepoResult<Vec<TagDto>> {
let tags = tag::Entity::find()
.find_also_related(namespace::Entity)
.filter(tag::Column::Id.is_in(ids))
.all(db)
.await?
.into_iter()
.map(map_tag_dto)
.collect();
Ok(tags)
}
fn create_cd_tag_map(
tag_cd_entries: Vec<(
content_descriptor_tag::Model,
Option<content_descriptor::Model>,
)>,
tag_id_map: HashMap<i64, TagDto>,
) -> HashMap<Vec<u8>, Vec<TagDto>> {
let cd_tag_map = tag_cd_entries
.into_iter()
.filter_map(|(t, cd)| Some((cd?, tag_id_map.get(&t.tag_id)?.clone())))
.sorted_by_key(|(cd, _)| cd.id)
.group_by(|(cd, _)| cd.descriptor.to_owned())
.into_iter()
.map(|(key, group)| (key, group.map(|(_, t)| t).collect::<Vec<TagDto>>()))
.collect();
cd_tag_map
}

@ -5,7 +5,6 @@ use std::collections::HashMap;
use std::iter::FromIterator; use std::iter::FromIterator;
use mediarepo_core::error::RepoResult; use mediarepo_core::error::RepoResult;
use mediarepo_core::itertools::Itertools;
use mediarepo_core::utils::parse_namespace_and_tag; use mediarepo_core::utils::parse_namespace_and_tag;
use mediarepo_database::entities::{content_descriptor, content_descriptor_tag, namespace, tag}; use mediarepo_database::entities::{content_descriptor, content_descriptor_tag, namespace, tag};
@ -15,6 +14,7 @@ use crate::dao::{DaoContext, DaoProvider};
use crate::dto::{NamespaceDto, TagDto}; use crate::dto::{NamespaceDto, TagDto};
pub mod add; pub mod add;
pub mod all_for_cds_map;
pub mod by_name; pub mod by_name;
pub mod mappings; pub mod mappings;
@ -81,51 +81,6 @@ impl TagDao {
Ok(tags) Ok(tags)
} }
#[tracing::instrument(level = "debug", skip(self, cds))]
pub async fn all_for_cds_map(
&self,
cds: Vec<Vec<u8>>,
) -> RepoResult<HashMap<Vec<u8>, Vec<TagDto>>> {
let tag_cd_entries: Vec<(
content_descriptor_tag::Model,
Option<content_descriptor::Model>,
)> = content_descriptor_tag::Entity::find()
.find_also_related(content_descriptor::Entity)
.filter(content_descriptor::Column::Descriptor.is_in(cds))
.all(&self.ctx.db)
.await?;
let tag_ids: Vec<i64> = tag_cd_entries
.iter()
.map(|(t, _)| t.tag_id)
.unique()
.collect();
let tags: Vec<TagDto> = tag::Entity::find()
.find_also_related(namespace::Entity)
.filter(tag::Column::Id.is_in(tag_ids))
.all(&self.ctx.db)
.await?
.into_iter()
.map(map_tag_dto)
.collect();
let tag_id_map = tags
.into_iter()
.map(|t| (t.id(), t))
.collect::<HashMap<i64, TagDto>>();
let cd_tag_map = tag_cd_entries
.into_iter()
.filter_map(|(t, cd)| Some((cd?, tag_id_map.get(&t.tag_id)?.clone())))
.sorted_by_key(|(cd, _)| cd.id)
.group_by(|(cd, _)| cd.descriptor.to_owned())
.into_iter()
.map(|(key, group)| (key, group.map(|(_, t)| t).collect::<Vec<TagDto>>()))
.collect();
Ok(cd_tag_map)
}
#[tracing::instrument(level = "debug", skip(self))] #[tracing::instrument(level = "debug", skip(self))]
pub async fn tags_for_cd(&self, cd_id: i64) -> RepoResult<Vec<TagDto>> { pub async fn tags_for_cd(&self, cd_id: i64) -> RepoResult<Vec<TagDto>> {
let tags = tag::Entity::find() let tags = tag::Entity::find()

@ -1,6 +1,6 @@
{ {
"name": "mediarepo-ui", "name": "mediarepo-ui",
"version": "0.13.2", "version": "0.13.3",
"scripts": { "scripts": {
"ng": "ng", "ng": "ng",
"start": "ng serve", "start": "ng serve",

@ -40,7 +40,7 @@ checksum = "94a45b455c14666b85fc40a019e8ab9eb75e3a124e05494f5397122bc9eb06e0"
[[package]] [[package]]
name = "app" name = "app"
version = "0.13.2" version = "0.13.3"
dependencies = [ dependencies = [
"mediarepo-api", "mediarepo-api",
"serde", "serde",

@ -1,6 +1,6 @@
[package] [package]
name = "app" name = "app"
version = "0.13.2" version = "0.13.3"
description = "The UI for the mediarepo media management tool" description = "The UI for the mediarepo media management tool"
authors = ["you"] authors = ["you"]
license = "" license = ""

@ -1,7 +1,7 @@
{ {
"package": { "package": {
"productName": "mediarepo-ui", "productName": "mediarepo-ui",
"version": "0.13.2" "version": "0.13.3"
}, },
"build": { "build": {
"distDir": "../dist/mediarepo-ui", "distDir": "../dist/mediarepo-ui",

Loading…
Cancel
Save