{"id":36443269,"url":"https://github.com/josephcaillet/boris","last_synced_at":"2026-01-11T22:01:10.950Z","repository":{"id":57613674,"uuid":"131426904","full_name":"JosephCaillet/boris","owner":"JosephCaillet","description":"Automatic music library organizer","archived":false,"fork":false,"pushed_at":"2018-07-06T22:12:27.000Z","size":865,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-06-21T06:11:18.300Z","etag":null,"topics":["automatic","configurable","golang-application","music-library","organizer","templating"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/JosephCaillet.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-04-28T16:42:47.000Z","updated_at":"2023-08-18T03:46:53.000Z","dependencies_parsed_at":"2022-09-10T23:31:34.130Z","dependency_job_id":null,"html_url":"https://github.com/JosephCaillet/boris","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/JosephCaillet/boris","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JosephCaillet%2Fboris","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JosephCaillet%2Fboris/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JosephCaillet%2Fboris/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JosephCaillet%2Fboris/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JosephCaillet","download_url":"https://codeload.github.com/JosephCaillet/boris/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JosephCaillet%2Fboris/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28324835,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-11T18:42:50.174Z","status":"ssl_error","status_checked_at":"2026-01-11T18:39:13.842Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automatic","configurable","golang-application","music-library","organizer","templating"],"created_at":"2026-01-11T22:01:10.242Z","updated_at":"2026-01-11T22:01:10.945Z","avatar_url":"https://github.com/JosephCaillet.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# boris\nA magic tool that uses music file's tags to automaticaly organize your music in folders, using a user provided template.\n\n## Installation\nThe following commands requires a working golang instalation.\n```\ngo get https://github.com/JosephCaillet/boris\ngo install https://github.com/JosephCaillet/boris\n```\n\n## Basic use\n`boris -i myMusicDir -o myOrganizedMusicDir -c myConfigFile`\n\n## Exemple\n\n### Before boris\n```\n~ $ tree\n.\n└── zikIn\n    ├── 01_02 Daddy Cool.flac\n    ├── 02-01-Boney_M-Felicidad_Margherita-LLS.flac\n    ├── 02_02 Gadda-Da-Vida (7_ Version) (Full Length).flac\n    ├── Andy Fox - Tempus Fugit\n    │   ├── Andy Fox - Tempus Fugit - 01 Tempus Fugit.flac\n    │   ├── Andy Fox - Tempus Fugit - 02 Daydream (feat. Vanna).flac\n    │   ├── Andy Fox - Tempus Fugit - 06 Second Life.flac\n    │   ├── Andy Fox - Tempus Fugit - back.png\n    │   └── cover.jpg\n    ├── Annella - Perfume - Single\n    │   ├── Annella - Perfume - Single - 01 Perfume.flac\n    │   ├── cover.jpg\n    │   └── test2.txt\n    ├── Brandon - Neon Haze\n    │   ├── Brandon - Neon Haze - 01 Neon Haze.flac\n    │   ├── Brandon - Neon Haze - 03 Time Machine.flac\n    │   ├── Brandon - Neon Haze - 04 Arcade.flac\n    │   ├── cover.jpg\n    │   ├── env\n    │   │   ├── EnV - EnV - Shinto.flac\n    │   │   └── EnV - EnV - Streetlights.flac\n    │   └── test3\n    │       └── test3.txt\n    ├── fail.mp3\n    ├── マクロスMACROSS 82-99 - SAILORWAVE\n    │   ├── cover.jpg\n    │   ├── マクロスMACROSS 82-99 - SAILORWAVE - 01 NEW DAWN.flac\n    │   ├── マクロスMACROSS 82-99 - SAILORWAVE - 02 戦場.flac\n    │   └── マクロスMACROSS 82-99 - SAILORWAVE - 10 新宿区 JAZZ POINT J.flac\n    ├── Moby-Play_2014-HD_Remaster\n    │   ├── 01-01-Moby-Honey_2014_Remastered_Version-SMR.flac\n    │   ├── 01-02-Moby-Find_My_Baby_2014_Remastered_Version-SMR.flac\n    │   └── 01-08-Moby-Natural_Blues_2014_Remastered_Version-SMR.flac\n    ├── test.txt\n    └── waw\n        ├── 1.wav\n        ├── 2.wav\n        ├── 3.wav\n        └── cover.jpg\n```\n\n### Use of boris\n```\n~ $ boris -i zikIn/ -o zikOut\n⏺  Copy mode ⏺\n\n🔎  Listing files...\n\n[ 2% ][ 0s ]\n[ 2% ][ 0s ]\t↳ zikIn/\n[ 5% ][ 0s ]\t\t♫ 01_02 Daddy Cool.flac\t➜\tzikOut/Pop Rock/Boney M_/The Essential Boney M_/01-02 Daddy Cool.flac\n[ 7% ][ 0s ]\t\t♫ 02-01-Boney_M-Felicidad_Margherita-LLS.flac\t➜\tzikOut/Pop Rock/Boney M_/The Essential Boney M_/02-01 Felicidad (Margherita) (7_ Version).flac\n[ 10% ][ 0s ]\t\t♫ 02_02 Gadda-Da-Vida (7_ Version) (Full Length).flac\t➜\tzikOut/Pop Rock/Boney M_/The Essential Boney M_/02-02 Gadda-Da-Vida (7_ Version) (Full Length).flac\n[ 12% ][ 0s ]\t\t❌ error: opening tags of file \"zikIn/fail.mp3\": EOF\n[ 15% ][ 0s ]\t\t🖺 fail.mp3\t➜\tzikOut/Pop Rock/Boney M_/The Essential Boney M_/fail.mp3\n[ 15% ][ 0s ]\t\t🖺 test.txt\t➜\tzikOut/Pop Rock/Boney M_/The Essential Boney M_/test.txt\n[ 17% ][ 0s ]\n[ 17% ][ 0s ]\t↳ zikIn/Andy Fox - Tempus Fugit/\n[ 20% ][ 0s ]\t\t♫ Andy Fox - Tempus Fugit - 01 Tempus Fugit.flac\t➜\tzikOut/Unknonw genre/Andy Fox/Tempus Fugit/01 Tempus Fugit.flac\n[ 22% ][ 0s ]\t\t♫ Andy Fox - Tempus Fugit - 02 Daydream (feat. Vanna).flac\t➜\tzikOut/Unknonw genre/Andy Fox/Tempus Fugit/02 Daydream (feat. Vanna).flac\n[ 25% ][ 0s ]\t\t♫ Andy Fox - Tempus Fugit - 06 Second Life.flac\t➜\tzikOut/Unknonw genre/Andy Fox/Tempus Fugit/06 Second Life.flac\n[ 30% ][ 0s ]\t\t🖺 Andy Fox - Tempus Fugit - back.png\t➜\tzikOut/Unknonw genre/Andy Fox/Tempus Fugit/Andy Fox - Tempus Fugit - back.png\n[ 30% ][ 0s ]\t\t🖺 cover.jpg\t➜\tzikOut/Unknonw genre/Andy Fox/Tempus Fugit/cover.jpg\n[ 32% ][ 0s ]\n[ 32% ][ 0s ]\t↳ zikIn/Annella - Perfume - Single/\n[ 35% ][ 0s ]\t\t♫ Annella - Perfume - Single - 01 Perfume.flac\t➜\tzikOut/Unknonw genre/Annella/Perfume - Single/01 Perfume.flac\n[ 40% ][ 0s ]\t\t🖺 cover.jpg\t➜\tzikOut/Unknonw genre/Annella/Perfume - Single/cover.jpg\n[ 40% ][ 0s ]\t\t🖺 test2.txt\t➜\tzikOut/Unknonw genre/Annella/Perfume - Single/test2.txt\n[ 42% ][ 0s ]\n[ 42% ][ 0s ]\t↳ zikIn/Brandon - Neon Haze/\n[ 45% ][ 0s ]\t\t♫ Brandon - Neon Haze - 01 Neon Haze.flac\t➜\tzikOut/Unknonw genre/Brandon/Neon Haze/01 Neon Haze.flac\n[ 47% ][ 0s ]\t\t♫ Brandon - Neon Haze - 03 Time Machine.flac\t➜\tzikOut/Unknonw genre/Brandon/Neon Haze/03 Time Machine.flac\n[ 50% ][ 0s ]\t\t♫ Brandon - Neon Haze - 04 Arcade.flac\t➜\tzikOut/Unknonw genre/Brandon/Neon Haze/04 Arcade.flac\n[ 52% ][ 0s ]\t\t🖺 cover.jpg\t➜\tzikOut/Unknonw genre/Brandon/Neon Haze/cover.jpg\n[ 55% ][ 0s ]\n[ 55% ][ 0s ]\t↳ zikIn/Brandon - Neon Haze/env/\n[ 57% ][ 0s ]\t\t♫ EnV - EnV - Shinto.flac\t➜\tzikOut/Unknonw genre/EnV/Unknonw album/EnV - Shinto.flac\n[ 60% ][ 0s ]\t\t♫ EnV - EnV - Streetlights.flac\t➜\tzikOut/Unknonw genre/EnV/Unknonw album/EnV - Streetlights.flac\n[ 62% ][ 0s ]\n[ 62% ][ 0s ]\t↳ zikIn/Brandon - Neon Haze/test3/\n[ 65% ][ 0s ]\t\t⚠ No tagged music file found, moving file(s) below to unrecognised music directory.\n[ 65% ][ 0s ]\t\t🖺 test3.txt\t➜\tunorganizedFiles/Brandon - Neon Haze/test3/test3.txt\n[ 67% ][ 0s ]\n[ 67% ][ 0s ]\t↳ zikIn/Moby-Play_2014-HD_Remaster/\n[ 70% ][ 0s ]\t\t♫ 01-01-Moby-Honey_2014_Remastered_Version-SMR.flac\t➜\tzikOut/Electro/Moby/Play [2014 - HD Remaster]/01 Honey (2014 Remastered Version).flac\n[ 72% ][ 0s ]\t\t♫ 01-02-Moby-Find_My_Baby_2014_Remastered_Version-SMR.flac\t➜\tzikOut/Electro/Moby/Play [2014 - HD Remaster]/02 Find My Baby (2014 Remastered Version).flac\n[ 75% ][ 0s ]\t\t♫ 01-08-Moby-Natural_Blues_2014_Remastered_Version-SMR.flac\t➜\tzikOut/Electro/Moby/Play [2014 - HD Remaster]/08 Natural Blues (2014 Remastered Version).flac\n[ 77% ][ 0s ]\n[ 77% ][ 0s ]\t↳ zikIn/waw/\n[ 87% ][ 0s ]\t\t⚠ No tagged music file found, moving file(s) below to unrecognised music directory.\n[ 87% ][ 0s ]\t\t🖺 1.wav\t➜\tunorganizedFiles/waw/1.wav\n[ 87% ][ 1s ]\t\t🖺 2.wav\t➜\tunorganizedFiles/waw/2.wav\n[ 87% ][ 1s ]\t\t🖺 3.wav\t➜\tunorganizedFiles/waw/3.wav\n[ 87% ][ 1s ]\t\t🖺 cover.jpg\t➜\tunorganizedFiles/waw/cover.jpg\n[ 90% ][ 1s ]\n[ 90% ][ 1s ]\t↳ zikIn/マクロスMACROSS 82-99 - SAILORWAVE/\n[ 95% ][ 1s ]\t\t♫ マクロスMACROSS 82-99 - SAILORWAVE - 01 NEW DAWN.flac\t➜\tzikOut/Unknonw genre/マクロスMACROSS 82-99/SAILORWAVE/01 NEW DAWN.flac\n[ 97% ][ 1s ]\t\t♫ マクロスMACROSS 82-99 - SAILORWAVE - 02 戦場.flac\t➜\tzikOut/Unknonw genre/マクロスMACROSS 82-99/SAILORWAVE/02 戦場.flac\n[ 100% ][ 1s ]\t\t♫ マクロスMACROSS 82-99 - SAILORWAVE - 10 新宿区 JAZZ POINT J.flac\t➜\tzikOut/Unknonw genre/マクロスMACROSS 82-99/SAILORWAVE/10 新宿区 JAZZ POINT J.flac\n[ 100% ][ 1s ]\t\t🖺 cover.jpg\t➜\tzikOut/Unknonw genre/マクロスMACROSS 82-99/SAILORWAVE/cover.jpg\n```\n\n### After boris\n```\n~ $ tree\n.\n├── zikIn\n│   └── ...\n├── unorganizedFiles\n│   ├── Brandon - Neon Haze\n│   │   └── test3\n│   │       └── test3.txt\n│   └── waw\n│       ├── 1.wav\n│       ├── 2.wav\n│       ├── 3.wav\n│       └── cover.jpg\n└── zikOut\n    ├── Electro\n    │   └── Moby\n    │       └── Play [2014 - HD Remaster]\n    │           ├── 01 Honey (2014 Remastered Version).flac\n    │           ├── 02 Find My Baby (2014 Remastered Version).flac\n    │           └── 08 Natural Blues (2014 Remastered Version).flac\n    ├── Pop Rock\n    │   └── Boney M_\n    │       └── The Essential Boney M_\n    │           ├── 01-02 Daddy Cool.flac\n    │           ├── 02-01 Felicidad (Margherita) (7_ Version).flac\n    │           ├── 02-02 Gadda-Da-Vida (7_ Version) (Full Length).flac\n    │           ├── fail.mp3\n    │           └── test.txt\n    └── Unknonw genre\n        ├── Andy Fox\n        │   └── Tempus Fugit\n        │       ├── 01 Tempus Fugit.flac\n        │       ├── 02 Daydream (feat. Vanna).flac\n        │       ├── 06 Second Life.flac\n        │       ├── Andy Fox - Tempus Fugit - back.png\n        │       └── cover.jpg\n        ├── Annella\n        │   └── Perfume - Single\n        │       ├── 01 Perfume.flac\n        │       ├── cover.jpg\n        │       └── test2.txt\n        ├── Brandon\n        │   └── Neon Haze\n        │       ├── 01 Neon Haze.flac\n        │       ├── 03 Time Machine.flac\n        │       ├── 04 Arcade.flac\n        │       └── cover.jpg\n        ├── EnV\n        │   └── Unknonw album\n        │       ├── EnV - Shinto.flac\n        │       └── EnV - Streetlights.flac\n        └── マクロスMACROSS 82-99\n            └── SAILORWAVE\n                ├── 01 NEW DAWN.flac\n                ├── 02 戦場.flac\n                ├── 10 新宿区 JAZZ POINT J.flac\n                └── cover.jpg\n```\n\n## How does it work\nboris will scan all your music files, and for each folder found, it will:\n* lists all directs files at it's root\n\t* if a music file is found in the list, the new path for it will be determined using it's metadatas combined to a template.\n\t* if a non music file is found (an image cover for example):\n\t\t* if at least one music file as been found, it will be moved to the same location.\n\t\t* if none music files exist in the directory (for instance a list of waw file), they will be moved appart to a special directory.\n* repeat this process for each sub folders\n\nPlease note that a file is considered to be a music file only if it supports tags. Supported files types are:\n* MP3\n* M4A\n* M4B\n* M4P\n* ALAC\n* FLAC\n* OGG\n\n## Configuration\nboris can be configured by using a configuration file, or/and using command line arguments (that will overide configuration file directive if used). Default configuration values can bee seen using the -s flags. It can also be used to generate a base config file: `boris -s \u003e myConf.hjson`\n\n### Configuration file\nSee the conf.hjson example file for detailed explanations.\n\n### Command line arguments\n```\n-c string\n\t\tconfig file\n-d\tdelete input music folder after organizing\n-i string\n\t\tinput music directory (default \".\")\n-m\tmove file instead of copying them\n-o string\n\t\toutput music directory (default \"organizedMusicLibrary\")\n-p\tpreview change\n-r string\n\t\treplacement for \u003c\u003e:\"\\/|?* (default \"_\")\n-s\tshow default config, in hjson config file format\n-t string\n\t\torganizing template (default see below)\n-u string\n\t\tunorganized files directory where folders will be moved if they contains\n\t\tfiles that does not have any tags (default \"unorganizedFiles\")\n```\n\n## Templating\n- Templating will be used to compute the new path for each music file, based on it's metadatas/tags.\n- The templating syntax is based on golang emplate syntax (https://golang.org/pkg/text/template/).\n- Every tabulation and newline will be removed.\n- Available function/atribute are:\n\t* Album\n\t* Artist\n\t* AlbumArtist\n\t* Composer\n\t* Genre\n\t* Year\n\t* Disk\n\t* DiskTotal\n\t* Track\n\t* TrackTotal\n\t* Ext (file extension)\n\t* OriginalFilename (with extension)\n\t*\tgolang predefined function (such as printf)\n\n### Detailed example of the default template:\nThe following template wil organize music file using this patern:\u003cbr\u003e\n`genre/albumArtist/albumName/discNumber-trackNumber title.extension`\n```\n{{if .Genre}}     #\n  {{.Genre}}      # This section will be replaced by the (in order of priority):\n{{else}}          #   musical genre | default text \"Unknonw genre\"\n  Unknonw genre   #\n{{end}}           #\n\n/ # create sub folder\n\n{{if .AlbumArtist}} #\n  {{.AlbumArtist}}  #\n{{else if .Artist}} # This section will be replaced by the (in order of priority):\n  {{.Artist}}       #   album artist | artist | default text \"Unknonw artist\"\n{{else}}            #\n  Unknonw artist    #\n{{end}}             #\n\n/ # create sub folder\n\n{{if .Album}}   #\n  {{.Album}}    # This section will be replaced by the (in order of priority):\n{{else}}        #   album | default text \"Unknonw album\"\n  Unknonw album #\n{{end}}         #\n\n/ # create sub folder\n\n{{if gt .DiscTotal 1}}        # If the album is composed of more than one disc,\n  {{.Disc | printf \"%02d\"}}-  # this section will be replaced by the disc number\n{{end}}                       # on two digits, followed by a hyphen.\n\n{{if .Track}}                         # If a track number exists, this section will be\n  {{.Track | printf \"%02d\"}} {{/**/}} # replaced by it, on two digit, followed by a space.\n{{end}}                               # (The trailling comment section is just here to make\n                                      # the space more visible, and work around some text\n                                      # editor that removes trailling spaces on save.)\n\n{{if .Title}}           #\n  {{.Title}}{{.Ext}}    # This section will be replaced by the (in order of priority):\n{{else}}                #   track title followed by the original file extension | original filename\n  {{.OriginalFilename}} #\n{{end}}                 #\n```\n\n## About\nboris is made by Joseph Caillet and is released under GPL-3.0.\u003cbr\u003e\nView source code, report bug, contribute here: https://github.com/JosephCaillet/boris.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjosephcaillet%2Fboris","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjosephcaillet%2Fboris","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjosephcaillet%2Fboris/lists"}