lyoko

joined 1 year ago
[–] lyoko@lemm.ee 15 points 3 months ago* (last edited 3 months ago)

I have the same problem with navidrome so I've written a new Opensubsonic server in Rust with a permision model. You can check it out here: https://github.com/vnghia/nghe

[–] lyoko@lemm.ee 1 points 5 months ago* (last edited 5 months ago)

Thank you very much for your kind word! I've seen that scanner already but decided to reimplement anyway because I want to choose a different design from the start and have the flexibility to add some new features myself (some kind of ML integration like immich and S3 integration). At worse case, I will still use this so no problems :D

[–] lyoko@lemm.ee 1 points 5 months ago* (last edited 5 months ago) (2 children)

Is Rust that much better than Go?

IMHO, rust and go are two differents things. The reason I choose Rust is because it is fast and calling C code from rust is supported really well since Rust's goal is to become a system language. Navidrome is just calling the ffmpeg binary. While in my project, I've compiled the neccessary parts of ffmpeg myself (thanks to vcpkg) and call the function directly from Rust. It leads to smaller and fully static final binary (because no ffmpeg bin) as well as faster transcoding time since we don't have to wait for the ffmpeg binary to finish transcoding the whole file before load the result from the filesystem to the memory.

Would it have been impossible to submit your changes to Navidrome as pull requests?

You can see here. This is the biggest reason why I've decided to start my own implementation. Beside, I share my server with several friends so I want a mechanism to prevent mixing musics from different people.

Does this import the Navidrome database?

This could be a feature request in the future. I could add a python script to import users/songs/playlists/playcount/etc from Navidrome.

 

I am selfhosting Navidrome for sometimes but its lacks of support for multiple values really bugs me. Since I am having some free time, I've decided to write an opensubsonic server in rust (why rust? you guess). The notable features are:

  • In-memory transcoding with ffmpeg c api. Faster transcoding with no ffmpeg binary required and no need for pre-configurated transcoding profile.
  • Multiple values for artists/album artists/etc.
  • Permission models music folder per user.

It is still actively developped and lacks some Opensubsonic features (playlist/starr) and some external integrations like lastfm. However I would like to post it get some feedback about it.

Thank you very much!

[–] lyoko@lemm.ee 2 points 10 months ago

In my experience, I found that rclone mount a crypt remote is not as stable as a direct mount. But I will try to do it again. Thank you very much !

[–] lyoko@lemm.ee 8 points 1 year ago (3 children)

I usually try different custom ROMs and have to format my phone frequently. Will that eSIM survive that format or not ?

[–] lyoko@lemm.ee 8 points 1 year ago (1 children)

How do you keep your Spotify recommendations update ? Don't you have to listen to songs on it to get updated recommendations ?

[–] lyoko@lemm.ee 1 points 1 year ago

That sounds like what I need. Thank you very much !

[–] lyoko@lemm.ee 1 points 1 year ago (2 children)

I dont think Ansible is a general templating engine ? I do templating for all most everything and not only docker compose, for example this for traefik configuration.

[–] lyoko@lemm.ee 1 points 1 year ago

so you are also generating the docker-compose from code. I think I am looking for something that aware of both templating and docker-compose deployment because right now, at the end of the day, I am still have to run docker-compose up -f ... while helm can do both templating and deployment.

[–] lyoko@lemm.ee 3 points 1 year ago (1 children)

I actually need more than merging. For example, right now my traefik.template will look like this:

[http.routers.{{ router_name }}]
  rule = "{{ router_rule }}"
  service = "{{ service_name }}"
  middlewares = [{{ middlewares | map("tojson") | join(", ") }}]
{% block router %}{% endblock %}
  [http.routers.{{ router_name }}.tls]
    certResolver = "leresolver_http"

{% if service_host is defined %}
[[http.services.{{ service_name }}.loadBalancer.servers]]
  url = "{{ 'https' if service_use_https is defined else 'http' }}://{{ service_host }}{{ ':' ~ service_port if service_port is defined else '' }}"
{% endif %}

and then one of my traefik.toml could look like this

{% extends "template/traefik.jinja" %}

{% set router_name = "dozzle" %}
{% set router_rule = "Host(`dozzle.example.com`)" %}
{% set service_name = "dozzle" %}
{% set service_host = "dozzle" %}
{% set service_port = 8080 %}
[–] lyoko@lemm.ee 2 points 1 year ago (1 children)

you mean nix the package manager ?

12
submitted 1 year ago* (last edited 1 year ago) by lyoko@lemm.ee to c/selfhosted@lemmy.world
 

Maybe this is a little bit off-topic. I would like to ask how you manage your dockerfile.

I have a git repo hosting my configurations (docker-compose, traefik, etc). Then, I have a python script that reads data from JSON, renders the placeholder inside these files (the {{replace_me}}) by an actual value and outputs them to another directory. Finally, I cd to that directory and run docker-compose up -f .... (This approach takes inspiration from the terraform templatefile)

That JSON file is generated by some terraform code, along with terraform code for other stuffs (storage bucket, vps, dns, etc).

It works well for me so far. Especially for:

  • templating traefik toml configuration (I like it a lot more than the label approach).
  • secret in the docker env file (so my docker.env file has the form of secrect={{secret}}.

I know most templating docker part can be replaced by directly interpolating with environment variables but I don't really like it because it seems environment variables are not persistent.

Do you have any suggestions for my workflow ? I am always feel a litte bit off about this approach.

Edit: Thank you for your suggestions. I will try k8s for edge computing and if it does not work really well, I will stick with my current approach.

view more: next ›