File size: 2,854 Bytes
737aeb3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cfd243f
23f104e
f5b2ba1
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import os.path
import random

from musicdl import musicdl
from musicdl.modules import Downloader
from pydub import AudioSegment

def is_integer(string):
    if string.isdigit():
        return int(string)
    else:
        return 0


def is_numeric(string):
    if string.isdigit():
        return True
    if string.count('.') == 1:
        integer_part, decimal_part = string.split('.')
        if integer_part.isdigit() and decimal_part.isdigit():
            return True
    return False


def time_to_seconds(time_string):
    hours, minutes, seconds = map(lambda x: is_integer(x), time_string.split(':'))
    total_seconds = hours * 3600 + minutes * 60 + seconds
    return total_seconds


def size_to_int(size_string):
    prefix_size_str = size_string[:-2]  # 去除最后的单位部分,转换为浮点数
    if not is_numeric(prefix_size_str):
        return 5.1 * 1024 * 1024
    unit = size_string[-2:]  # 获取单位部分
    size = float(prefix_size_str)
    if unit == 'KB':
        size *= 1024  # 转换为字节
    elif unit == 'MB':
        size *= 1024 * 1024
    elif unit == 'GB':
        size *= 1024 * 1024 * 1024
    elif unit == 'TB':
        size *= 1024 * 1024 * 1024 * 1024

    return int(size)  # 转换为整数


def get_albums(keywords, config):
    target_srcs = [
        'kugou', 'kuwo', 'qqmusic', 'qianqian', 'fivesing',
        'netease', 'migu', 'joox', 'yiting',
    ]
    client = musicdl.musicdl(config=config)
    results = client.search(keywords, target_srcs)
    albums_set = set()
    valid_albums = []
    for albums in results.values():
        if len(albums) == 0:
            continue
        for album in albums:
            if album['songname'] in albums_set:
                continue
            if album['ext'] != 'mp3':
                continue
            if size_to_int(album['filesize']) > 5 * 1024 * 1024:
                continue
            if time_to_seconds(album['duration']) > 300:
                continue
            else:
                albums_set.add(album['songname'])
                valid_albums.append(album)
    return valid_albums


def get_random_spit(songinfo):
    d = Downloader(songinfo)
    d.start()
    save_path = os.path.join(songinfo["savedir"], f"{songinfo['savename']}.{songinfo['ext']}")
    song = AudioSegment.from_mp3(save_path)
    # pydub does things in milliseconds
    length = len(song)
    left_idx = length / 2 - 15 * 1000
    right_idx = length / 2 + 15 * 1000
    if left_idx < 0:
        left_idx = 0
    if right_idx > length:
        right_idx = length
    middle_30s = song[left_idx:right_idx]
    middle_30s.export(save_path, format="wav")
    return save_path


if __name__ == '__main__':
    config = {'logfilepath': 'musicdl.log', 'downloaded': 'downloaded', 'search_size_per_source': 5, 'proxies': {}}
    get_albums('tayler', config)