visualizations/charts for media collections, based on mediainfo

Overview

Media Collection Viewer

Early WIP!

Demo is live

Description

Upload a mediainfo.json (mediainfo ~/path/to/audiovideo/files/* --Output=JSON > mediainfo.json) to get charts that provide you with a high-level overview of your collections.

WIP -- can't guarantee success! 😅

Project goals

  • Fast (and not fall over or freeze trying to process data)
  • Sturdy (not needing a lot of assistance)
  • Client-side only / no sending data anywhere (safe to use without contacting your org's lawyers)
  • Deployable for free (no breaking my bank)
  • Easy to use (anyone with the right data should be able to use)

Charts

  • How many tracks are in each file?
  • What kind of formats?
  • What are the file extensions?
  • What kind of audio codecs?
  • What kind of video codecs?
  • What are the bit depths (color)?
  • What are the bit depths (audio)?
  • What are the color spaces?
  • Standard? (NTSC, PAL, Other)
  • What are the dimensions?
  • Chroma subsampling?
  • What are the duration outliers (videos very short or very long)? - novice version implemented
  • Which files have timecodes?
  • Any files in which audio duration and video duration differ?

Code

yew documentation

How to install

npm install

How to run in debug mode

# Builds the project and opens it in a new browser tab. Auto-reloads when the project changes.
npm start

How to build in release mode

# Builds the project and places it into the `dist` folder.
npm run build

How to run unit tests

# Runs tests
npm test
You might also like...
a rust crate for drawing fancy pie charts in the terminal
a rust crate for drawing fancy pie charts in the terminal

piechart piechart is a rust crate for drawing fancy pie charts in the terminal. Example usage: use piechart::{Chart, Color, Data}; fn main() { le

A Foundry plugin that enables you to plot charts within solidity.

🖌️ solplot A Foundry plugin that enables you to plot charts within solidity. Installation First, make sure that you have Rust installed. Then install

A small program that converts midi files to RPE (Re: Phigros Edit) Charts

Midi to RPE(Re: Phigros Edit) chart converter $ mid2json --help Usage: mid2json [OPTIONS] MIDI_PATH Arguments: MIDI_PATH Name of the input fil

It's like
It's like "docker stats" but with beautiful, real-time charts into your terminal. 📊

📊 ds - Real-time Stats with Terminal Charts Visualize container stats with beautiful, real-time charts directly in your terminal. Why ds? Missing Cha

Exploration of using Storage instead of Allocator to parameterize collections in Rust

storage-poc aims at exploring the usage of custom Storages, rather than custom Allocators. Goals This is a Proof-of-Concept aiming at: Demonstrating t

A number of collections, such as linked-lists, binary-trees, or B-Trees are most easily implemented with aliasing pointers.

StaticRc is a safe reference-counted pointer, similar to Rc or Arc, though performing its reference-counting at compile-time rather than run-time, and

A framework for iterating over collections of types implementing a trait without virtual dispatch
A framework for iterating over collections of types implementing a trait without virtual dispatch

zero_v Zero_V is an experiment in defining behavior over collections of objects implementing some trait without dynamic polymorphism.

🚀  efficient approximate nearest neighbor search algorithm collections library written in Rust 🦀 .
🚀 efficient approximate nearest neighbor search algorithm collections library written in Rust 🦀 .

🚀 efficient approximate nearest neighbor search algorithm collections library written in Rust 🦀 .

🔎 A simple in-memory search for collections and key-value stores.
🔎 A simple in-memory search for collections and key-value stores.

Indicium Search 🔎 A simple in-memory search for collections (Vec, HashMap, BTreeMap, etc) and key-value stores. Features autocompletion. There are ma

Some collections to store a fixed number of elements of a specific type.

This repo provide some useful data-structures, such as: Array, HashMap, HashSet, BTreeMap, BTreeSet, etc... That lives on the stack. It's a good choic

Darwinia networks' tracing runtime override collections

Darwinia Runtime Overrides USAGE: runtime-overrides [OPTIONS] --runtime CHAIN OPTIONS: -h, --help Print help information

A discord bot to view & monitor OpenSea collections, written in Rust

Titan What is this This is a discord bot to monitor OpenSea collections and get info about them, including: Floor Price Activity Sales per Hour And mo

A direct replacement for `assert_eq` for unordered collections
A direct replacement for `assert_eq` for unordered collections

assert_unordered A direct replacement for assert_eq for unordered collections This macro is useful for any situation where the ordering of the collect

An interface for managing collections of labeled items and generating random subsets with specified restrictions

An interface for managing collections of labeled items and generating random subsets with specified restrictions

Lexer and parser collections.

laps Lexer and parser collections. With laps, you can build parsers by just defining ASTs and deriving Parse trait for them. Usage Add laps to your pr

Human-friendly indexed collections

Indexical: Human-Friendly Indexed Collections Indexical is a library for conveniently and efficiently working with indexed collections of objects. "In

Fast, Concurrent, Rust based Tidal-Media-Downloader implementation.

tdl tdl is a rust implementation of the Python Script Tidal-Media-Downloader. Overview tdl offers significant performance improvements over the origin

A simple CLI for UPnP media file streaming

Slingr A simple CLI for streaming media files over a local network to UPnP media renderers. Designed to work with cheap HDMI/DLNA/UPnP/Miracast Dongle

A small and modular media manager
A small and modular media manager

Bookshelf - a small and modular media manager Bookshelf is made for managing media, mainly books. Modules are to be made by the user (or stolen from t

Comments
  • Failed to generate charts for AV dataset  - iPres2022 Bake Off

    Failed to generate charts for AV dataset - iPres2022 Bake Off

    Hi Ashley,

    Not sure what happened, but "Build charts" return empty charts for the iPres2022 Bake Off AV dataset. I've included the errors from Console below. I've also extracted just the AV data set and shared it via my own Google Drive. Inside the Google Drive are the MediaInfo generate JSONs.

    Happy to supply more logs or information to diagnose this error.

    Challenge: https://ipres2022.scot/call-for-contributions-2/digital-preservation-bake-off-challenge/ AV Data Set + generated JSON Full Data Set: https://ipres2022.scot/call-for-contributions-2/data-set/

    1st error:

    wasm-loader.js:293 panicked at 'called Option::unwrap() on a None value', src/components/charts.rs:227:52

    Stack:

    parcelRequire<.fISM</.__wbg_new_59cb74e423758ede@https://bits.ashleyblewer.com/media-collection-viewer/static.91ea28f3.js:22:3851 @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[322]:0x48638 @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[811]:0x59aab @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[462]:0x52b57 @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[522]:0x5558e @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[679]:0x58d8f @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[659]:0x5899f @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[680]:0x58dc5 @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[641]:0x584f9 @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[87]:0x90cc @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[156]:0x2cdb8 @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[197]:0x369ba @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[195]:0x36314 @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[421]:0x50536 @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[173]:0x31359 @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[655]:0x58865 O@https://bits.ashleyblewer.com/media-collection-viewer/static.91ea28f3.js:22:2624 c@https://bits.ashleyblewer.com/media-collection-viewer/static.91ea28f3.js:22:2229 EventListener.handleEvent*parcelRequire<.fISM</.__wbg_addEventListener_c11a938b8469ab06<@https://bits.ashleyblewer.com/media-collection-viewer/static.91ea28f3.js:22:6290 parcelRequire<.fISM</k/<@https://bits.ashleyblewer.com/media-collection-viewer/static.91ea28f3.js:22:2828 @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[628]:0x58127 @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[371]:0x4cbb0 @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[203]:0x37c52 @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[127]:0x23924 @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[119]:0x20958 @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[197]:0x369ba @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[195]:0x36314 @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[255]:0x40761 @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[443]:0x519de @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[653]:0x587fa @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[655]:0x58865 O@https://bits.ashleyblewer.com/media-collection-viewer/static.91ea28f3.js:22:2624 c@https://bits.ashleyblewer.com/media-collection-viewer/static.91ea28f3.js:22:2229 EventListener.handleEventparcelRequire<.fISM</.__wbg_addEventListener_c11a938b8469ab06<@https://bits.ashleyblewer.com/media-collection-viewer/static.91ea28f3.js:22:6290 parcelRequire<.fISM</k/<@https://bits.ashleyblewer.com/media-collection-viewer/static.91ea28f3.js:22:2828 @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[628]:0x58127 @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[324]:0x489e5 @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[91]:0x11b2c @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[191]:0x3551a @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[159]:0x2dbdb @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[90]:0x1087f @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[91]:0x12002 @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[191]:0x3551a @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[159]:0x2dbdb @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[90]:0x1087f @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[91]:0x12002 @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[191]:0x3551a @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[136]:0x27034 @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[197]:0x369ba @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[227]:0x3c231 @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[307]:0x46d6a @https://bits.ashleyblewer.com/media-collection-viewer/media_collection_viewer_bg.1e878511.wasm:wasm-function[687]:0x58eff parcelRequire<.fISM</.run@https://bits.ashleyblewer.com/media-collection-viewer/static.91ea28f3.js:22:3479 parcelRequire<.QCba<@https://bits.ashleyblewer.com/media-collection-viewer/static.91ea28f3.js:12:211 f@https://bits.ashleyblewer.com/media-collection-viewer/static.91ea28f3.js:1:468 p@https://bits.ashleyblewer.com/media-collection-viewer/static.91ea28f3.js:1:544 parcelRequire<[0]</<@https://bits.ashleyblewer.com/media-collection-viewer/static.91ea28f3.js:24:143 promise callbackparcelRequire<[0]<@https://bits.ashleyblewer.com/media-collection-viewer/static.91ea28f3.js:24:120 f@https://bits.ashleyblewer.com/media-collection-viewer/static.91ea28f3.js:1:468 parcelRequire<@https://bits.ashleyblewer.com/media-collection-viewer/static.91ea28f3.js:1:772 @https://bits.ashleyblewer.com/media-collection-viewer/static.91ea28f3.js:1:1023

    wasm-loader.js:293 __wbg_error_4bb6c2a97407129a wasm-loader.js:293 media_collection_viewer_bg.1e878511.wasm:296685 media_collection_viewer_bg.1e878511.wasm:367275 media_collection_viewer_bg.1e878511.wasm:338775 media_collection_viewer_bg.1e878511.wasm:349582 media_collection_viewer_bg.1e878511.wasm:363919 media_collection_viewer_bg.1e878511.wasm:362911 media_collection_viewer_bg.1e878511.wasm:363973 media_collection_viewer_bg.1e878511.wasm:361721 media_collection_viewer_bg.1e878511.wasm:37068 media_collection_viewer_bg.1e878511.wasm:183736 media_collection_viewer_bg.1e878511.wasm:223674 media_collection_viewer_bg.1e878511.wasm:221972 media_collection_viewer_bg.1e878511.wasm:329014 media_collection_viewer_bg.1e878511.wasm:201561 media_collection_viewer_bg.1e878511.wasm:362597 O wasm-loader.js:226 c wasm-loader.js:194 (Async: EventListener.handleEvent) __wbg_addEventListener_c11a938b8469ab06 wasm-loader.js:419 k wasm-loader.js:241 media_collection_viewer_bg.1e878511.wasm:360743 media_collection_viewer_bg.1e878511.wasm:314288 media_collection_viewer_bg.1e878511.wasm:228434 media_collection_viewer_bg.1e878511.wasm:145700 media_collection_viewer_bg.1e878511.wasm:133464 media_collection_viewer_bg.1e878511.wasm:223674 media_collection_viewer_bg.1e878511.wasm:221972 media_collection_viewer_bg.1e878511.wasm:264033 media_collection_viewer_bg.1e878511.wasm:334302 media_collection_viewer_bg.1e878511.wasm:362490 media_collection_viewer_bg.1e878511.wasm:362597 O wasm-loader.js:226 c wasm-loader.js:194 (Async: EventListener.handleEvent) __wbg_addEventListener_c11a938b8469ab06 wasm-loader.js:419 k wasm-loader.js:241 media_collection_viewer_bg.1e878511.wasm:360743 media_collection_viewer_bg.1e878511.wasm:297445 media_collection_viewer_bg.1e878511.wasm:72492 media_collection_viewer_bg.1e878511.wasm:218394 media_collection_viewer_bg.1e878511.wasm:187355 media_collection_viewer_bg.1e878511.wasm:67711 media_collection_viewer_bg.1e878511.wasm:73730 media_collection_viewer_bg.1e878511.wasm:218394 media_collection_viewer_bg.1e878511.wasm:187355 media_collection_viewer_bg.1e878511.wasm:67711 media_collection_viewer_bg.1e878511.wasm:73730 media_collection_viewer_bg.1e878511.wasm:218394 media_collection_viewer_bg.1e878511.wasm:159796 media_collection_viewer_bg.1e878511.wasm:223674 media_collection_viewer_bg.1e878511.wasm:246321 media_collection_viewer_bg.1e878511.wasm:290154 media_collection_viewer_bg.1e878511.wasm:364287 run wasm-loader.js:235 QCba index.ts:5 f static.91ea28f3.js:1 p static.91ea28f3.js:1 parcelRequire<[0]</< static.91ea28f3.js:24 (Async: promise callback) parcelRequire<[0]< static.91ea28f3.js:24 f static.91ea28f3.js:1 parcelRequire static.91ea28f3.js:1 static.91ea28f3.js:1

    Second error:

    media_collection_viewer_bg.1e878511.wasm:338829:1 Uncaught RuntimeError: unreachable executed O wasm-loader.js:226 c wasm-loader.js:194 __wbg_addEventListener_c11a938b8469ab06 wasm-loader.js:419 k wasm-loader.js:241 O wasm-loader.js:226 c wasm-loader.js:194 __wbg_addEventListener_c11a938b8469ab06 wasm-loader.js:419 k wasm-loader.js:241 run wasm-loader.js:235 QCba index.ts:5 f static.91ea28f3.js:1 p static.91ea28f3.js:1 parcelRequire<[0]</< static.91ea28f3.js:24 promise callback*parcelRequire<[0]< static.91ea28f3.js:24 f static.91ea28f3.js:1 parcelRequire static.91ea28f3.js:1 static.91ea28f3.js:1 media_collection_viewer_bg.1e878511.wasm:338829:1 media_collection_viewer_bg.1e878511.wasm:338829 media_collection_viewer_bg.1e878511.wasm:349582 media_collection_viewer_bg.1e878511.wasm:363919 media_collection_viewer_bg.1e878511.wasm:362911 media_collection_viewer_bg.1e878511.wasm:363973 media_collection_viewer_bg.1e878511.wasm:361721 media_collection_viewer_bg.1e878511.wasm:37068 media_collection_viewer_bg.1e878511.wasm:183736 media_collection_viewer_bg.1e878511.wasm:223674 media_collection_viewer_bg.1e878511.wasm:221972 media_collection_viewer_bg.1e878511.wasm:329014 media_collection_viewer_bg.1e878511.wasm:201561 media_collection_viewer_bg.1e878511.wasm:362597 O wasm-loader.js:226 c wasm-loader.js:194 (Async: EventListener.handleEvent) __wbg_addEventListener_c11a938b8469ab06 wasm-loader.js:419 k wasm-loader.js:241 media_collection_viewer_bg.1e878511.wasm:360743 media_collection_viewer_bg.1e878511.wasm:314288 media_collection_viewer_bg.1e878511.wasm:228434 media_collection_viewer_bg.1e878511.wasm:145700 media_collection_viewer_bg.1e878511.wasm:133464 media_collection_viewer_bg.1e878511.wasm:223674 media_collection_viewer_bg.1e878511.wasm:221972 media_collection_viewer_bg.1e878511.wasm:264033 media_collection_viewer_bg.1e878511.wasm:334302 media_collection_viewer_bg.1e878511.wasm:362490 media_collection_viewer_bg.1e878511.wasm:362597 O wasm-loader.js:226 c wasm-loader.js:194 (Async: EventListener.handleEvent) __wbg_addEventListener_c11a938b8469ab06 wasm-loader.js:419 k wasm-loader.js:241 media_collection_viewer_bg.1e878511.wasm:360743 media_collection_viewer_bg.1e878511.wasm:297445 media_collection_viewer_bg.1e878511.wasm:72492 media_collection_viewer_bg.1e878511.wasm:218394 media_collection_viewer_bg.1e878511.wasm:187355 media_collection_viewer_bg.1e878511.wasm:67711 media_collection_viewer_bg.1e878511.wasm:73730 media_collection_viewer_bg.1e878511.wasm:218394 media_collection_viewer_bg.1e878511.wasm:187355 media_collection_viewer_bg.1e878511.wasm:67711 media_collection_viewer_bg.1e878511.wasm:73730 media_collection_viewer_bg.1e878511.wasm:218394 media_collection_viewer_bg.1e878511.wasm:159796 media_collection_viewer_bg.1e878511.wasm:223674 media_collection_viewer_bg.1e878511.wasm:246321 media_collection_viewer_bg.1e878511.wasm:290154 media_collection_viewer_bg.1e878511.wasm:364287 run wasm-loader.js:235 QCba index.ts:5 f static.91ea28f3.js:1 p static.91ea28f3.js:1 parcelRequire<[0]</< static.91ea28f3.js:24 (Async: promise callback) parcelRequire<[0]< static.91ea28f3.js:24 f static.91ea28f3.js:1 parcelRequire static.91ea28f3.js:1 static.91ea28f3.js:1

    opened by joshuatj 5
  • Retrieve which files are associated with specific category of results (in chart)

    Retrieve which files are associated with specific category of results (in chart)

    This would take a major refactoring, to be able to pull in which files are featured in certain categories (i.e. WHICH two files are NTSC instead of PAL?"). It's too much to per-emptively load to the page, so it'll have to be some kind of callback. This data isn't even being pulled in/down right now.

    opened by ablwr 0
  • Build charts on load rather than with a button click

    Build charts on load rather than with a button click

    This involves working out the relationship between the Chart.js code and updating the yew components. Again, have an idea about this but haven't had the time.

    opened by ablwr 0
  • Clean delivery of JS objects to charts

    Clean delivery of JS objects to charts

    Right now, this is done in a super embarrassing and unhelpful way! I recently did some refactoring that can help allow this to happen, but haven't gone in to give it a try yet.

    opened by ablwr 0
Releases(v0.91)
Owner
Ashley
Too many extracurricular activities. Now: @daily-co Prev. @artefactual @recursecenter @bavc @mipops @MediaArea @amiaopensource
Ashley
A high-performance SVG renderer, powered by Rust based resvg and napi-rs.

resvg-js resvg-js is a high-performance SVG renderer, powered by Rust based resvg and napi-rs. Fast, safe and zero dependencies! No need for node-gyp

一丝 744 Jan 7, 2023
Additional Rust collections not found in std::collections

More collections Rust crate with additional collections not found in std::collections. Multimaps Completion Name Behaves like ?? ?? ?? ⬜️ ⬜️ HashSetMu

Rinde van Lon 4 Dec 21, 2022
Easy c̵̰͠r̵̛̠ö̴̪s̶̩̒s̵̭̀-t̶̲͝h̶̯̚r̵̺͐e̷̖̽ḁ̴̍d̶̖̔ ȓ̵͙ė̶͎ḟ̴͙e̸̖͛r̶̖͗ë̶̱́ṉ̵̒ĉ̷̥e̷͚̍ s̷̹͌h̷̲̉a̵̭͋r̷̫̊ḭ̵̊n̷̬͂g̵̦̃ f̶̻̊ơ̵̜ṟ̸̈́ R̵̞̋ù̵̺s̷̖̅ţ̸͗!̸̼͋

Rust S̵̓i̸̓n̵̉ I̴n̴f̶e̸r̵n̷a̴l mutability! Howdy, friendly Rust developer! Ever had a value get m̵̯̅ð̶͊v̴̮̾ê̴̼͘d away right under your nose just when

null 294 Dec 23, 2022
Media Cleaner is a simple CLI tool to clean up your media library based on your Overseerr requests and Tautulli history, written in Rust.

Media Cleaner Media Cleaner is a simple CLI tool to clean up your media library based on your Overseerr requests and Tautulli history, written in Rust

Felix Bjerhem Aronsson 21 Mar 22, 2023
CLI and utilities for converting media files (images/videos) to ascii outputs (output media file or print to console)

CLI and utilities for converting media files (images/videos) to ascii outputs (output media file or print to console). Supports most standard image formats, and some video formats.

Michael 30 Jan 1, 2023
An attempt to build full-featured WebAssembly-based monolith charts

Graphima Graphima (Greek: γράφημα) is an attempt to build full-featured WebAssembly-based monolith charts. See "Can I Use" WebAssembly for browser sup

Nikita Almakov 5 Jun 9, 2023
Ember is a minimalistic Rust library for creating 2D graphics, games, and interactive visualizations with ease and simplicity.

Ember Ember is a simple and fun 2D rendering library for Rust, allowing you to quickly create graphics and interactive applications with ease. It uses

null 8 May 4, 2023
CLI app to display list of trending anime, music charts or recommend anime to watch or song to listen to.

Description Anitrendz is a cli app that uses data from the anitiop api to list the top anime and songs or recommend a random anime to watch or song to

Jimmy 9 Jun 11, 2022
Zenith - sort of like top or htop but with zoom-able charts, CPU, GPU, network, and disk usage

Zenith - sort of like top or htop but with zoom-able charts, CPU, GPU, network, and disk usage

Benjamin Vaisvil 1.6k Jan 4, 2023