logo

multimedia-dl

Unnamed repository; edit this file 'description' to name the repository. git clone https://anongit.hacktivis.me/git/multimedia-dl.git/
commit: 449118bd98fb80f5b8a36d8d4ea305ebb7d6c4ed
parent 9cb776ebd747e043b364615ac5e3fbea55bf59a9
Author: Haelwenn (lanodan) Monnier <contact@hacktivis.me>
Date:   Sun, 31 Aug 2025 18:20:14 +0200

kara-moe-dl.pl: new

Diffstat:

Akara-moe-dl.pl94+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 94 insertions(+), 0 deletions(-)

diff --git a/kara-moe-dl.pl b/kara-moe-dl.pl @@ -0,0 +1,94 @@ +#!/usr/bin/env perl +# Multimedia-DL: Youtube-DL inspired scraper +# Copyright © 2021 Multimedia-DL Authors <https://hacktivis.me/git/multimedia-dl/> +# SPDX-License-Identifier: AGPL-3.0-only +use strict; +use utf8; +use HTML::TreeBuilder::XPath; +use URI; +use LWP::UserAgent; +use LWP::Simple; +use File::Basename; +require HTTP::Request; + +use JSON::MaybeXS; + +sub get_suffix { + my ($str) = @_; + $str =~ /(\.[^\/]*)$/; + return $1; +} + +sub download { + my ($url, $songname) = @_; + my $fname = $songname . get_suffix($url); + + print STDERR "Downloading: $url -> $fname\n"; + if(!mirror($url, $fname)) { + print STDERR "Failed downloading $url: $!\n"; + } + + return $fname; +} + +my $json = JSON::MaybeXS->new(utf8 => 1); +my $ua = LWP::UserAgent->new; + +# Picked this one for it's stability +my $webkit_ua = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15"; + +$ua->agent($webkit_ua . "Multimedia-DL/1.0"); + +if($#ARGV != 0) { + print "usage: kara.moe <kara-id>\n"; + exit 1; +} + +# Just in case an URL got passed +my $kid = basename($ARGV[0], qr/\.[^.]*/); + +my $url = "https://kara.moe/api/karas/" . $kid; +print STDERR "URL: $url\n"; +my $req = HTTP::Request->new(GET => $url); + +my $res = $ua->request($req) or die "$!"; + +if($res->is_success) { + my $content_type = $res->header("Content-Type"); + my $content_match = qr(^application/([^+]*\+)?json(; .*)?); + + if(!($content_type =~ $content_match)) { + die "Got $content_type instead of $content_match\n"; + } + + my $blob = $json->decode($res->content) or die "Couldn't decode JSON object"; + + print STDERR "Song name: ", $blob->{"songname"}, "\n"; + + #if((scalar $blob->{"lyrics_infos"}) > 2) + #{ + # foreach \my %lyrics (@($blob->{"lyrics_infos"})) + # { + # my $songname = $blob->{"songname"} . "-" . %lyrics->{"version"}; + # my $fname = download("https://kara.moe/downloads/lyrics/".%lyrics->{"filename"}, $songname); + # + # if($blob->{"songname"}->{"default"} == $json::true) + # { + # symlink($fname, $blob->{"songname"} . get_suffix(%lyrics->{"filename"})) or warn "Failed creating symlink for lyrics: $!"; + # } + # } + #} + #else + #{ + #} + + if ($blob->{"lyrics_infos"}[0]->{"filename"}) { + download("https://kara.moe/downloads/lyrics/".$blob->{"lyrics_infos"}[0]->{"filename"}, $blob->{"songname"}); + } + if ($blob->{"mediafile"}) { + download("https://kara.moe/downloads/medias/".$blob->{"mediafile"}, $blob->{"songname"}); + } + if ($blob->{"karafile"}) { + download("https://kara.moe/downloads/karaokes/".$blob->{"karafile"}, $blob->{"songname"}); + } +}