sabreW4K3

joined 2 years ago
MODERATOR OF
[–] sabreW4K3@lemmy.tf 1 points 1 year ago (4 children)

Why wouldn't this federate?

[–] sabreW4K3@lemmy.tf 9 points 1 year ago

No one actually believes that Tumblr will implement AP

[–] sabreW4K3@lemmy.tf 7 points 1 year ago (1 children)

Fuxake! Now I've gotta move my blog?

[–] sabreW4K3@lemmy.tf 3 points 1 year ago

Good read. BlueSky basically gives people the feeling that they're in control, but actually is in control of everything. It's like a house with no electricity.

[–] sabreW4K3@lemmy.tf 4 points 1 year ago

Seems this is what I should do too

[–] sabreW4K3@lemmy.tf 1 points 1 year ago

So, I tried to install this on my Raspberry Pi, only to find out it doesn't have ARM64 support, which is kind of alarming. It's a shame, but indicative of the lack of commits. I hope the project can find a new lease of life, but for now Huginn isn't a viable option for me at least.

[–] sabreW4K3@lemmy.tf 3 points 1 year ago (1 children)

Them turning it up would be good. Also shouldn't there be a duplicate post check built into the platform?

[–] sabreW4K3@lemmy.tf 48 points 1 year ago* (last edited 1 year ago) (9 children)

Everything on the left (except Tux) is terrible today and that's fine, things evolve. It would be fun to see modern versions of each of those logos though.

I was so in love with Pidgin for a while that I even made a mock-up for how to improve it. I think I still have blog posts up about it.

[–] sabreW4K3@lemmy.tf 3 points 1 year ago

True, I actually liked Windows phone. But the lack of software support killed it. Even whatsapp pulled the plug.

[–] sabreW4K3@lemmy.tf 1 points 1 year ago (1 children)

The OpenWRT one

[–] sabreW4K3@lemmy.tf 1 points 1 year ago (3 children)

I was reading the comments on the OpenWRT forums about the new router, even the people there feel it's underpowered.

If it can run OpenWRT and PiHole, I'll be happy.

[–] sabreW4K3@lemmy.tf 1 points 1 year ago

I tried to look this up in a search engine and got nothing back, what is this?

 

Cross posted from: https://lemmyf.uk/post/5106939

 

I love it when I see cities, towns and villages putting real effort into non car infrastructure.

 

Does anyone know of and can recommend something I can install that will give me stats like temperature, power consumption, memory utilisation and processor utilisation?

 

I just installed Immich and while all my other containers have just required me to add to them to existing yaml, Immich requires its own yaml. That's fine I guess, but for the library, I wanna host it on my NAS and so I made the volume in my main Docker-Compose.yaml, the Immich yaml was all like, "what you talking about Willis?" because in my Immich environment I tried to point to something created in my main yaml. I thought I could work around this by adding an empty volume declaration, but now I can't find my uploads 😂 any idea on the correct methodology/workaround?

 

I'm having a problem with one of the apps that interacts with something I'm hosting. Alternative apps aren't having the same problem and neither is the webpage UI. Having purchased the app, I emailed the developer for some help and they said they didn't know what the issue was and that it could probably fix it if they could access my server. I'm not really comfortable with that though. Should I be?

 

As a Home Assistant noob, there's some things that I'm just destined not to learn until I experience them and one such thing is that I should disable things I don't use on devices I use. I have a bunch of presence sensors in my house and they were essentially spamming my logs with the motion state, something I never need as I only ever need to know whether a room is occupied or not.

Anyway, I didn't think anything of the log spam until I did a backup, in two weeks my backup went from 5mb to 0.5gb I was like WTF? I digress... a quick search said it was safe to delete and it would be recreated automatically, so I did and now it's back to 5mb and obviously I disabled all of the extraneous logging elements disabled. Since disabling wasn't enough.

Just sharing what I learned.

 
 

What?

Hello everyone, you may know me from films such as... Kidding. But hello nonetheless, today I'm releasing the culmination of all of my recent sleepless nights.

This simple script scans the location of your Navidrome music collection, pulls the embedded rating and then adds that rating to your Navidrome account

Code

v 0.3: Not only was the last version hideous, it was inconsistent. Stuff that worked in single directory mode never worked in full mode. Also removed some print statements, cleaned up some others.

import os
import mutagen
import requests
import urllib.parse
import json
import sys
import glob
from mutagen.id3 import ID3
global rating
global track_id

# Navidrome credentials
script_name = "ImportClementineRatings"
navidrome_url = "your-navidrome-server:port"
navidrome_username = "your-navidrome-username"
navidrome_password = "your-navidrome-password"
headers = None

# Directory containing MP3 files
mp3_directory = "your-collection-relative-to-this-script"

# Single Directory Mode
if len(sys.argv) > 1:
  for arg in sys.argv:
    #print(arg)
    #if arg != "import_ratings.py":
    if arg != os.path.basename(__file__):
      mp3_directory = "/".join([mp3_directory,"Collection",arg])

def extract_rating(mp3_file):
    audio = mutagen.File(mp3_file)
    tags = ID3(mp3_file)
    if "TXXX:FMPS_Rating_Amarok_Score" in tags:
      rating = tags["TXXX:FMPS_Rating_Amarok_Score"]
    else:
      print(" ".join(["No rating exists for",mp3_file,"this song"]))
      rating = None

    if (rating != None):
      sanerating = float(str(rating))
    else:
      sanerating = float(0)

    if sanerating >= 1.0:
      return 5
    elif sanerating >= 0.8:
      return 4
    elif sanerating >= 0.6:
      return 3
    elif sanerating >= 0.4:
      return 2
    elif sanerating >= 0.2:
      return 1
    else:
      return 0

def update_rating_on_navidrome(track_id, rating):
    hex_encoded_pass = navidrome_password.encode().hex()
    #print(rating)
    if rating != 0:
      url = f"{navidrome_url}/rest/setRating?id={track_id}&u={navidrome_username}&p=enc:{hex_encoded_pass}&v=1.12.0&rating={rating}&c={script_name}"
      response = requests.get(url)
      print(f"Success!")

def find_track_id_on_navidrome(mp3_file):
    track_id = None

    # Remove File Extension
    song = mp3_file.rsplit(".",1)[0]

    # Fetch Song Artist From Filename
    songartist = song.split(" - ")[0]
    songartist = songartist.split("/")[-1]

    # Fetch Song Title From Filename
    index_var = 1
    if 0 <= index_var < len(song.split(" - ")):
      songtitle = song.split(" - ")[1]
    else:
      return None
      
    #songtitle = urllib.parse.quote(songtitle)
    hex_encoded_pass = navidrome_password.encode().hex()

    if len(songtitle) < 2:
      return None
    else:
      #print(songtitle)
      songtitle = song.split(" - ")[1]
      songtitle = urllib.parse.quote(songtitle)

    url = f"{navidrome_url}/rest/search3?query={songtitle}&u={navidrome_username}&p=enc:{hex_encoded_pass}&v=1.12.0&c={script_name}&f=json"
    data = None

    response = requests.get(url)
    parsed = json.loads(response.content)
    print(f"Debug URL: {url}")
    if "subsonic-response" in parsed:
      parsed = parsed["subsonic-response"]
      if "searchResult3" in parsed:
        parsed = parsed["searchResult3"]
        if "song" in parsed:
           for match in parsed["song"]:
             special_characters = ":?*"
             if any(character in special_characters for character in  match["artist"]):
                match["artist"] = match["artist"].translate({ord(c): "_" for c in special_characters})

             if (match["artist"] == songartist):
               parsed = match
               track_id = match["id"]

    songtitle = urllib.parse.unquote(songtitle)
    if response.status_code == 200:
        if track_id:
          print(f"Track successfully identified: {songtitle}: {track_id}")
          return track_id
        else:
          print(f"Could not find {songtitle} track") 
          return None
    else:
        print(f"Failed to identify track {songtitle}: {response.text}")
        return None

def process_file(mp3_file, folder):
  track_id = "fail"

  mp3_file = "/".join([folder, mp3_file])
  rating = extract_rating(mp3_file)
  track_id = find_track_id_on_navidrome(mp3_file)

  if track_id != "fail":
    try:
      update_rating_on_navidrome(track_id, rating)
    except:
      print(f"Failed to set rating for {file}")

notmusicext = ("DS_Store","jpg", ".JPG", ".jpeg", ".JPEG", ".mood", ".m3u", ".nfo", ".png", ".PNG", ".sfv", ".url")

for foldername in os.listdir(mp3_directory):
  if foldername.endswith(".mp3"):
    process_file(foldername, mp3_directory)
    folderpath = mp3_directory
  elif foldername.endswith(notmusicext):
    print(f"Skipping: {foldername}")
  else:
    folderpath = "/".join([mp3_directory, foldername])
  #for filename in glob.iglob(mp3_directory + "*.mp3", recursive=True):
  #can't get this to work
    #would do stuff here
    print(f" Debug: folderpath")

    for filename in os.listdir(folderpath):
      if filename.endswith(".mp3"):
        process_file(filename, folderpath)
      elif filename.endswith(notmusicext):
        print(f"Skipping: {filename}")
      else:
        foldername2 = "/".join([folderpath,filename])
        for filename2 in os.listdir(foldername2):
          if filename2.endswith(".mp3"):
            if filename2.startswith("A") == False:
              process_file(filename2, foldername2)
          elif filename2.endswith(notmusicext):
            print(f"Skipping: {filename2}")
          else:
            print(f"What is: {filename2}")

print("Done!")

Usage

Copy the code block, create a Python script in your chosen directory and then run it.

Thanks

This truly would not be possible without the Fediverse community, especially the Lemmy community. So thank you everyone but especially

@Deebster@programming.dev @ggwithgg@feddit.nl @jnovinger@programming.dev @ishanpage@programming.dev @rglullis@communick.news @oscar@programming.dev @TootSweet@lemmy.world @sabret00the@mas.to @amcewen@mastodon.me.uk @oblomov@sociale.network @mdylanbell@fosstodon.org @mborous@mastodon.social @cohomologyisFUN@mastodon.sdf.org @eichin@mastodon.mit.edu @mdione@en.osm.town

For some of you what you did seemed so small, but it was massive to me and I'm incredibly grateful for your kindness.

The Lore

One day, one man decided that enough was enough, it was time to move to the modern age, but to get there he needed his music collection. However it wasn't enough to just have the music, he needed the ratings too. First world problems, I know! So with nothing but hope, he said out in search of the ring! I mean the script! He couldn't find the script, but Deebster offered to help and so the two of them embarked on a journey whereby I kept pasting stuff to Desbster and he was like "no" but under his guidance, my script born from the embers of Bard, started taking shape. Now, for me with zero Python experience, you can imagine that the guidance I required was a lot, but Deebster earned his Scout badge in guidance. And as I got closer and closer, I kept cutting my sleep short so that I could spend some extra time trying to figure it out. Also huge thanks to Minz from the Navidrome discord as they came in clutch with some API advice. Anyway, I got a working script and I'm paying it forward by sharing it. Thank you all again.

Anything Else

If you can see how I should improve this, please let me know. Thank you all again.

 

Cross-post!

 

Not sure if it's any good since I haven't tried it, but it's now a thing and an option.

 

Having got my Raspberry Pi for Christmas, I was finally able to enter the world of home labs and I'm slowly getting everything up and running.

That said, one thing I was super excited about but hasn't come to fruition was Pi-Hole. That's for two reasons, one my Pi isn't hardwired into the router and two my router kinda sucks (Virgin Media Hub 5).

So I came here to ask for recommendations for a router. One that would allow me to run vLANs and use my Pi for adblocking. Honestly the advice I got was like fire and I was like water.

I wanted a simple cheap solution and everyone was like just spend 🥺

Eventually though, my ignorance waned and I started looking into what the suggestions were, which was essentially buy an N100 Firewall Mini PC with 4 Ethernet Port, load up PFSense or OpenWRT, then buy an Access Point, connect it and profit.

So with my dreams of a £50 plug and play experience down the drain, can someone explain to me how it all works? Why is this the suggestion? My Pi is kinda set and leave. My NAS is set and leave, will a firewall PC be the same? Also why a firewall PC over a second Pi?

view more: ‹ prev next ›