1. Add quality 'MAX'

2. Try to parse 'dash+xml'
This commit is contained in:
Yaronzz
2023-09-06 09:31:50 +08:00
parent 513be57c3d
commit 4f32b14441
29 changed files with 108 additions and 33 deletions
+8 -6
View File
@@ -119,7 +119,7 @@ def test():
if not loginByConfig():
loginByWeb()
SETTINGS.audioQuality = AudioQuality.Normal
SETTINGS.audioQuality = AudioQuality.Master
SETTINGS.videoFileFormat = VideoQuality.P240
SETTINGS.checkExist = False
SETTINGS.includeEP = True
@@ -135,19 +135,21 @@ def test():
SETTINGS.playlistFolderFormat = R"Playlist/{PlaylistName} [{PlaylistUUID}]"
SETTINGS.trackFileFormat = R"{TrackNumber} - {ArtistName} - {TrackTitle}{ExplicitFlag}"
SETTINGS.videoFileFormat = R"{VideoNumber} - {ArtistName} - {VideoTitle}{ExplicitFlag}"
SETTINGS.multiThread = True
SETTINGS.multiThread = False
SETTINGS.apiKeyIndex = 4
SETTINGS.checkExist = False
Printf.settings()
# test example
# https://tidal.com/browse/track/70973230
# track 70973230 77798028 212657
# start('70973230')
start('242700165')
# album 58138532 77803199 21993753 79151897 56288918
# start('58138532')
# playlist 98235845-13e8-43b4-94e2-d9f8e603cee7
start('98235845-13e8-43b4-94e2-d9f8e603cee7')
# video 155608351 188932980
# start("155608351")
# start('98235845-13e8-43b4-94e2-d9f8e603cee7')
# video 155608351 188932980 https://tidal.com/browse/track/55130637
# start("155608351")https://tidal.com/browse/track/199683732
if __name__ == '__main__':
+1 -1
View File
@@ -159,7 +159,7 @@ def downloadTrack(track: Track, album=None, playlist=None, userProgress=None, pa
# download
logging.info("[DL Track] name=" + aigpy.path.getFileName(path) + "\nurl=" + stream.url)
tool = aigpy.download.DownloadTool(path + '.part', [stream.url])
tool = aigpy.download.DownloadTool(path + '.part', stream.urls)
tool.setUserProgress(userProgress)
tool.setPartSize(partSize)
check, err = tool.start(SETTINGS.showProgress and not SETTINGS.multiThread)
+1
View File
@@ -16,6 +16,7 @@ class AudioQuality(Enum):
High = 1
HiFi = 2
Master = 3
Max = 4
class VideoQuality(Enum):
+1 -1
View File
@@ -163,7 +163,7 @@ def changeQualitySettings():
SETTINGS.audioQuality = AudioQuality(
int(Printf.enterLimit(LANG.select.CHANGE_AUDIO_QUALITY,
LANG.select.MSG_INPUT_ERR,
['0', '1', '2', '3'])))
['0', '1', '2', '3', '4'])))
SETTINGS.videoQuality = VideoQuality(
int(Printf.enterLimit(LANG.select.CHANGE_VIDEO_QUALITY,
LANG.select.MSG_INPUT_ERR,
+1 -1
View File
@@ -68,7 +68,7 @@ class LangArabic(object):
CHANGE_START_SETTINGS = "بدء الاعدادات('0'-Return,'1'-Yes):"
CHANGE_DOWNLOAD_PATH = "مجلد التنزيل('0' not modify):"
CHANGE_AUDIO_QUALITY = "دقة الصوت('0'-Normal,'1'-High,'2'-HiFi,'3'-Master):"
CHANGE_AUDIO_QUALITY = "دقة الصوت('0'-Normal,'1'-High,'2'-HiFi,'3'-Master,'4'-Max):"
CHANGE_VIDEO_QUALITY = "دقة الفديو(1080, 720, 480, 360):"
CHANGE_ONLYM4A = "تحويل M4a الى mp4('0'-No,'1'-Yes):"
CHANGE_ADD_EXPLICIT_TAG = "اضافة توقيع الفنان('0'-No,'1'-Yes):"
+1 -1
View File
@@ -68,7 +68,7 @@ class LangChinese(object):
CHANGE_START_SETTINGS = "开始设置('0'-返回,'1'-是):"
CHANGE_DOWNLOAD_PATH = "下载路径('0' 不修改):"
CHANGE_AUDIO_QUALITY = "音频质量('0'-Normal,'1'-High,'2'-HiFi,'3'-Master):"
CHANGE_AUDIO_QUALITY = "音频质量('0'-Normal,'1'-High,'2'-HiFi,'3'-Master,'4'-Max):"
CHANGE_VIDEO_QUALITY = "视频质量(1080, 720, 480, 360):"
CHANGE_ONLYM4A = "将Mp4格式的音频转为M4a('0'-不,'1'-是):"
CHANGE_ADD_EXPLICIT_TAG = "歌名后添加脏话标签('0'-不,'1'-是):"
+1 -1
View File
@@ -68,7 +68,7 @@ class LangCroatian(object):
CHANGE_START_SETTINGS = "Pokreni postavke (0'-Izlaz,'1'-Da):"
CHANGE_DOWNLOAD_PATH = "Putanja preuzimanja('0' ne mijenjaj):"
CHANGE_AUDIO_QUALITY = "Kvaliteta zvuka('0'-Normalna,'1'-Visoka,'2'-HiFi,'3'-Master):"
CHANGE_AUDIO_QUALITY = "Kvaliteta zvuka('0'-Normalna,'1'-Visoka,'2'-HiFi,'3'-Master,'4'-Max):"
CHANGE_VIDEO_QUALITY = "Kvaliteta videozapisa(1080, 720, 480, 360):"
CHANGE_ONLYM4A = "Pretvori mp4 u m4a('0'-Ne,'1'-Da):"
CHANGE_ADD_EXPLICIT_TAG = "Dodaj eksplicitni znak u imeni datoteke('0'-Ne,'1'-Da):"
+1 -1
View File
@@ -68,7 +68,7 @@ class LangCzech(object):
CHANGE_START_SETTINGS = "Spustit nastavení ('0'-Zpět,'1'-Ano):"
CHANGE_DOWNLOAD_PATH = "Umístění stažených souborů ('0' beze změny):"
CHANGE_AUDIO_QUALITY = "Kvalita hudby ('0'-Normální,'1'-Vysoká,'2'-HiFi,'3'-Master):"
CHANGE_AUDIO_QUALITY = "Kvalita hudby ('0'-Normální,'1'-Vysoká,'2'-HiFi,'3'-Master,'4'-Max):"
CHANGE_VIDEO_QUALITY = "Kvalita videa (1080, 720, 480, 360):"
CHANGE_ONLYM4A = "Konvertovat mp4 na m4a ('0'-Ne,'1'-Ano):"
CHANGE_ADD_EXPLICIT_TAG = "Přidat označení explicity k souborům ('0'-Ne,'1'-Ano):"
+1 -1
View File
@@ -68,7 +68,7 @@ class LangDanish(object):
CHANGE_START_SETTINGS = "Start indstillinger('0'-Tilbage,'1'-Ja):"
CHANGE_DOWNLOAD_PATH = "Download stil('0' ændrer ikke):"
CHANGE_AUDIO_QUALITY = "Lydkvalitet('0'-Normal,'1'-Høj,'2'-HiFi,'3'-Master):"
CHANGE_AUDIO_QUALITY = "Lydkvalitet('0'-Normal,'1'-Høj,'2'-HiFi,'3'-Master,'4'-Max):"
CHANGE_VIDEO_QUALITY = "Videokvalitet(1080, 720, 480, 360):"
CHANGE_ONLYM4A = "Konverter mp4 til m4a('0'-Nej,'1'-Ja):"
CHANGE_ADD_EXPLICIT_TAG = "Tilføj eksplicit tag til filnavne('0'-Nej,'1'-Ja):"
+1 -1
View File
@@ -68,7 +68,7 @@ class LangDutch(object):
CHANGE_START_SETTINGS = "Start instellingen('0'-Terugkeren,'1'-Ja):"
CHANGE_DOWNLOAD_PATH = "Downloadpad('0'-niet wijzigen):"
CHANGE_AUDIO_QUALITY = "Audiokwaliteit('0'-Normaal,'1'-Hoog,'2'-HiFi,'3'-Master):"
CHANGE_AUDIO_QUALITY = "Audiokwaliteit('0'-Normaal,'1'-Hoog,'2'-HiFi,'3'-Master,'4'-Max):"
CHANGE_VIDEO_QUALITY = "Videokwaliteit (1080, 720, 480, 360):"
CHANGE_ONLYM4A = "Converteer mp4 naar m4a('0'-Nee,'1'-Ja):"
CHANGE_ADD_EXPLICIT_TAG = "Expliciete tag toevoegen aan bestandsnamen('0'-Nee,'1'-Ja):"
+1 -1
View File
@@ -68,7 +68,7 @@ class LangEnglish(object):
CHANGE_START_SETTINGS = "Start settings('0'-Return,'1'-Yes):"
CHANGE_DOWNLOAD_PATH = "Download path('0'-not modify):"
CHANGE_AUDIO_QUALITY = "Audio quality('0'-Normal,'1'-High,'2'-HiFi,'3'-Master):"
CHANGE_AUDIO_QUALITY = "Audio quality('0'-Normal,'1'-High,'2'-HiFi,'3'-Master,'4'-Max):"
CHANGE_VIDEO_QUALITY = "Video quality(1080, 720, 480, 360):"
CHANGE_ONLYM4A = "Convert mp4 to m4a('0'-No,'1'-Yes):"
CHANGE_ADD_EXPLICIT_TAG = "Add explicit tag to file names('0'-No,'1'-Yes):"
+1 -1
View File
@@ -68,7 +68,7 @@ class LangFilipino(object):
CHANGE_START_SETTINGS = "Simulan ang settings('0'-Bumalik,'1'-Oo):"
CHANGE_DOWNLOAD_PATH = "Paroroonan ng Download('0' walang babaguhin):"
CHANGE_AUDIO_QUALITY = "Kalidad ng Audio('0'-Normal,'1'-High,'2'-HiFi,'3'-Master):"
CHANGE_AUDIO_QUALITY = "Kalidad ng Audio('0'-Normal,'1'-High,'2'-HiFi,'3'-Master,'4'-Max):"
CHANGE_VIDEO_QUALITY = "Kalidad ng Audio Video(1080, 720, 480, 360):"
CHANGE_ONLYM4A = "I-convert ang mp4 bilang m4a('0'-Hindi,'1'-Oo):"
CHANGE_ADD_EXPLICIT_TAG = "Lagyan ng explicit tag sa pangalan ng files('0'-Hindi,'1'-Oo):"
+1 -1
View File
@@ -68,7 +68,7 @@ class LangFrench(object):
CHANGE_START_SETTINGS = "Commencer les réglages ('0'-Retour,'1'-Oui):"
CHANGE_DOWNLOAD_PATH = "Emplacement des téléchargements('0' ne pas modifier):"
CHANGE_AUDIO_QUALITY = "Qualité audio('0'-Normal,'1'-High,'2'-HiFi,'3'-Master):"
CHANGE_AUDIO_QUALITY = "Qualité audio('0'-Normal,'1'-High,'2'-HiFi,'3'-Master,'4'-Max):"
CHANGE_VIDEO_QUALITY = "Qualité Video(1080, 720, 480, 360):"
CHANGE_ONLYM4A = "Convertir mp4 en m4a('0'-Non,'1'-Oui):"
CHANGE_ADD_EXPLICIT_TAG = "Ajout du tag Explicit - Fichier('0'-Non,'1'-Oui):"
+1 -1
View File
@@ -68,7 +68,7 @@ class LangGerman(object):
CHANGE_START_SETTINGS = "Einstellungen starten ('0'-Zurück, '1'-Ja):"
CHANGE_DOWNLOAD_PATH = "Downloadpfad ('0' nicht ändern):"
CHANGE_AUDIO_QUALITY = "Tonqualität ('0'-Normal, '1'-Hoch, '2'-HiFi, '3'-Master):"
CHANGE_AUDIO_QUALITY = "Tonqualität ('0'-Normal, '1'-Hoch, '2'-HiFi, '3'-Master,'4'-Max):"
CHANGE_VIDEO_QUALITY = "Videoqualität (1080, 720, 480, 360):"
CHANGE_ONLYM4A = "mp4 in m4a konvertieren ('0'-Nein, '1'-Ja):"
CHANGE_ADD_EXPLICIT_TAG = "Explicit Tag zum Dateiname hinzufügen ('0'-Nein, '1'-Ja):"
+1 -1
View File
@@ -68,7 +68,7 @@ class LangHungarian(object):
CHANGE_START_SETTINGS = "Beállítások indítása('0'- Vissza, '1'-Igen):"
CHANGE_DOWNLOAD_PATH = "Letöltési útvonal('0' nincs módosítás):"
CHANGE_AUDIO_QUALITY = "Audió minőség('0'-Normal,'1'-High,'2'-HiFi,'3'-Master):"
CHANGE_AUDIO_QUALITY = "Audió minőség('0'-Normal,'1'-High,'2'-HiFi,'3'-Master,'4'-Max):"
CHANGE_VIDEO_QUALITY = "Videó minőség(1080, 720, 480, 360):"
CHANGE_ONLYM4A = "mp4 átalakítása m4a-ra('0'-Nem,'1'-Igen):"
CHANGE_ADD_EXPLICIT_TAG = "Explicit tag hozzáadása a fájlnevekhez('0'-Nem,'1'-Igen):"
+1 -1
View File
@@ -68,7 +68,7 @@ class LangItalian(object):
CHANGE_START_SETTINGS = "Impostazioni all'avvio ('0'-Ritorna,'1'-Sì):"
CHANGE_DOWNLOAD_PATH = "Percorso Download ('0' non modificare):"
CHANGE_AUDIO_QUALITY = "Qualità Audio ('0'-Normale, '1'-Alta, '2'-HiFi, '3'-Master):"
CHANGE_AUDIO_QUALITY = "Qualità Audio ('0'-Normale, '1'-Alta, '2'-HiFi, '3'-Master,'4'-Max):"
CHANGE_VIDEO_QUALITY = "Qualità Video (1080, 720, 480, 360):"
CHANGE_ONLYM4A = "Convertire mp4 in m4a ('0'-No,'1'-):"
CHANGE_ADD_EXPLICIT_TAG = "Aggiungi tag 'Contenuto Esplicito' ai nomi dei file ('0'-No,'1'-Sì):"
+1 -1
View File
@@ -68,7 +68,7 @@ class LangJapanese(object):
CHANGE_START_SETTINGS = "設定を開始('0'-戻る,'1'-はい):"
CHANGE_DOWNLOAD_PATH = "ダウンロードパス('0'-変更しない):"
CHANGE_AUDIO_QUALITY = "オーディオ品質('0'-Normal,'1'-High,'2'-HiFi,'3'-Master):"
CHANGE_AUDIO_QUALITY = "オーディオ品質('0'-Normal,'1'-High,'2'-HiFi,'3'-Master,'4'-Max):"
CHANGE_VIDEO_QUALITY = "ビデオ品質(1080, 720, 480, 360):"
CHANGE_ONLYM4A = "mp4をm4aに変換する('0'-いいえ,'1'-はい):"
CHANGE_ADD_EXPLICIT_TAG = "Add explicit tag to file names('0'-いいえ,'1'-はい):"
+1 -1
View File
@@ -68,7 +68,7 @@ class LangKorean(object):
CHANGE_START_SETTINGS = "설정 시작('0'-뒤로가기,'1'-예):"
CHANGE_DOWNLOAD_PATH = "다운로드 경로('0'-변경 안 함):"
CHANGE_AUDIO_QUALITY = "음질('0'-보통,'1'-높음,'2'-HiFi,'3'-Master):"
CHANGE_AUDIO_QUALITY = "음질('0'-보통,'1'-높음,'2'-HiFi,'3'-Master,'4'-Max):"
CHANGE_VIDEO_QUALITY = "영상 화질(1080, 720, 480, 360):"
CHANGE_ONLYM4A = "mp4를 m4a로 변환('0'-아니요,'1'-예):"
CHANGE_ADD_EXPLICIT_TAG = "파일 이름에 explicit 태그 추가('0'-아니요,'1'-예):"
+1 -1
View File
@@ -68,7 +68,7 @@ class LangNorwegian(object):
CHANGE_START_SETTINGS = "Start innstillinger('0'-Tilbake,'1'-Ja):"
CHANGE_DOWNLOAD_PATH = "Nedlastingssti('0'-ikke endre):"
CHANGE_AUDIO_QUALITY = "Lydkvalitet('0'-Normal,'1'-Høy,'2'-HiFi,'3'-Master):"
CHANGE_AUDIO_QUALITY = "Lydkvalitet('0'-Normal,'1'-Høy,'2'-HiFi,'3'-Master,'4'-Max):"
CHANGE_VIDEO_QUALITY = "Videokvalitet(1080, 720, 480, 360):"
CHANGE_ONLYM4A = "Konverter MP4 til M4A('0'-Nei,'1'-Ja):"
CHANGE_ADD_EXPLICIT_TAG = "Legg til eksplisitt tag i filnavn('0'-Nei,'1'-Ja):"
+1 -1
View File
@@ -68,7 +68,7 @@ class LangPolish(object):
CHANGE_START_SETTINGS = "Uruchomić ustawienia('0'-Powrót,'1'-Tak):"
CHANGE_DOWNLOAD_PATH = "Ścieżka pobierania('0'-bez zmian):"
CHANGE_AUDIO_QUALITY = "Jakość audio('0'-Normalna,'1'-Wysoka,'2'-HiFi,'3'-Master):"
CHANGE_AUDIO_QUALITY = "Jakość audio('0'-Normalna,'1'-Wysoka,'2'-HiFi,'3'-Master,'4'-Max):"
CHANGE_VIDEO_QUALITY = "Jakość wideo(1080, 720, 480, 360):"
CHANGE_ONLYM4A = "Konwertuj mp4 do m4a('0'-Nie,'1'-Tak):"
CHANGE_ADD_EXPLICIT_TAG = "Dodaj tag jednoznaczne do nazwy pliku('0'-Nie,'1'-Tak):"
+1 -1
View File
@@ -68,7 +68,7 @@ class LangPortuguese(object):
CHANGE_START_SETTINGS = "Configurações Iniciais('0'-Retornar,'1'-Sim):"
CHANGE_DOWNLOAD_PATH = "Caminho do download('0' Não Modificar):"
CHANGE_AUDIO_QUALITY = "Qualidade De Áudio('0'-Normal,'1'-Alta,'2'-HiFi,'3'-Master):"
CHANGE_AUDIO_QUALITY = "Qualidade De Áudio('0'-Normal,'1'-Alta,'2'-HiFi,'3'-Master,'4'-Max):"
CHANGE_VIDEO_QUALITY = "Qualidade Do Vídeo(1080, 720, 480, 360):"
CHANGE_ONLYM4A = "Converter mp4 para m4a('0'-Não,'1'-Sim):"
CHANGE_ADD_EXPLICIT_TAG = "Adicionar Etiqueta Explícito para os nomes dos arquivos('0'-Não,'1'-Sim):"
+1 -1
View File
@@ -68,7 +68,7 @@ class LangRussian(object):
CHANGE_START_SETTINGS = "Начальная настройка('0'-Отмена,'1'-Да):"
CHANGE_DOWNLOAD_PATH = "Место сохранения('0'-Отмена):"
CHANGE_AUDIO_QUALITY = "Качество аудио('0'-Стандарт,'1'-Высокое,'2'-HiFi,'3'-MQA):"
CHANGE_AUDIO_QUALITY = "Качество аудио('0'-Стандарт,'1'-Высокое,'2'-HiFi,'3'-MQA,'4'-Max):"
CHANGE_VIDEO_QUALITY = "Качество видео(1080, 720, 480, 360):"
CHANGE_ONLYM4A = "Сохранять mp4 как m4a('0'-Нет,'1'-Да):"
CHANGE_ADD_EXPLICIT_TAG = "Добавить тег 'Нецензурно' ('0'-Нет,'1'-Да):"
+1 -1
View File
@@ -68,7 +68,7 @@ class LangSpanish(object):
CHANGE_START_SETTINGS = "¿Iniciar ajustes? ('0'-Volver,'1'-Sí):"
CHANGE_DOWNLOAD_PATH = "Ruta de descarga ('0' No modificar):"
CHANGE_AUDIO_QUALITY = "Calidad de audio ('0'-Normal,'1'-High,'2'-HiFi,'3'-Master):"
CHANGE_AUDIO_QUALITY = "Calidad de audio ('0'-Normal,'1'-High,'2'-HiFi,'3'-Master,'4'-Max):"
CHANGE_VIDEO_QUALITY = "Calidad de video (1080, 720, 480, 360):"
CHANGE_ONLYM4A = "¿Convertir mp4 a m4a? ('0'-No,'1'-Sí):"
CHANGE_ADD_EXPLICIT_TAG = "¿Agregar etiqueta de contenido explícito a los nombres de archivo? ('0'-No,'1'-Sí):"
+1 -1
View File
@@ -68,7 +68,7 @@ class LangTurkish(object):
CHANGE_START_SETTINGS = ">>> Ayarları düzenlemek istediğine emin misin ? ('0'-Geri Dön,'1'-Evet): "
CHANGE_DOWNLOAD_PATH = ">>> İndirme Konumu ('0' aynı kalsın): "
CHANGE_AUDIO_QUALITY = ">>> Ses Kalitesi ('0'-Normal,'1'-Yüksek,'2'-HiFi,'3'-[M]aster): "
CHANGE_AUDIO_QUALITY = ">>> Ses Kalitesi ('0'-Normal,'1'-Yüksek,'2'-HiFi,'3'-[M]aster,'4'-Max): "
CHANGE_VIDEO_QUALITY = ">>> Video Kalitesi (1080, 720, 480, 360): "
CHANGE_ONLYM4A = ">>> .mp4 uzantılı dosyalar .m4a'ya çevrilsin mi?('0'-Hayır,'1'-Evet): "
CHANGE_ADD_EXPLICIT_TAG = ">>> 'Explicit' yani 'küfürlü' etiketi eklensin mi?('0'-Hayır,'1'-Evet): "
+1 -1
View File
@@ -68,7 +68,7 @@ class LangUkrainian(object):
CHANGE_START_SETTINGS = "Запуск налаштувань('0'-Повернутися,'1'-Так):"
CHANGE_DOWNLOAD_PATH = "Шлях завантаження('0'-не змінювати):"
CHANGE_AUDIO_QUALITY = "Якість аудіо('0'-Звичайна,'1'-Висока,'2'-HiFi,'3'-MQA):"
CHANGE_AUDIO_QUALITY = "Якість аудіо('0'-Звичайна,'1'-Висока,'2'-HiFi,'3'-MQA,'4'-Max):"
CHANGE_VIDEO_QUALITY = "Якість відео(1080,720,480,360):"
CHANGE_ONLYM4A = "Перетворювати mp4 на m4a('0'-Ні,'1'-Так):"
CHANGE_ADD_EXPLICIT_TAG = "Додавати тег 'Нецензурно'('0'-Ні,'1'-Так):"
+1 -1
View File
@@ -68,7 +68,7 @@ class LangVietnamese(object):
CHANGE_START_SETTINGS = "Bắt đầu thiết lập('0'-Về,'1'-Có):"
CHANGE_DOWNLOAD_PATH = "Đường dẫn tải về('0' không đổi):"
CHANGE_AUDIO_QUALITY = "Chất lượng âm thanh('0'-Normal,'1'-High,'2'-HiFi,'3'-Master):"
CHANGE_AUDIO_QUALITY = "Chất lượng âm thanh('0'-Normal,'1'-High,'2'-HiFi,'3'-Master,'4'-Max):"
CHANGE_VIDEO_QUALITY = "Chất lượng video(1080, 720, 480, 360):"
CHANGE_ONLYM4A = "Đổi mp4 sang m4a('0'-Không,'1'-Có):"
CHANGE_ADD_EXPLICIT_TAG = "Thêm tag explicit vào tên tệp('0'-Không,'1'-Có):"
+1
View File
@@ -15,6 +15,7 @@ class StreamUrl(aigpy.model.ModelBase):
super().__init__()
self.trackid = None
self.url = None
self.urls = None
self.codec = None
self.encryptionKey = None
self.soundQuality = None
+3 -1
View File
@@ -39,6 +39,8 @@ def __getExtension__(stream: StreamUrl):
if '.mp4' in stream.url:
if 'ac4' in stream.codec or 'mha1' in stream.codec:
return '.mp4'
elif 'flac' in stream.codec:
return '.flac'
return '.m4a'
return '.m4a'
@@ -49,7 +51,7 @@ def getAlbumPath(album):
# album folder pre: [ME]
flag = TIDAL_API.getFlag(album, Type.Album, True, "")
if SETTINGS.audioQuality != AudioQuality.Master:
if SETTINGS.audioQuality != AudioQuality.Master and SETTINGS.audioQuality != AudioQuality.Max:
flag = flag.replace("M", "")
if flag != "":
flag = "[" + flag + "] "
+71 -2
View File
@@ -10,10 +10,12 @@
'''
import json
import random
import re
import time
import aigpy
import base64
import requests
from xml.etree import ElementTree
from tidal_dl.model import *
from tidal_dl.enums import *
@@ -286,6 +288,60 @@ class TidalAPI(object):
albums += list(aigpy.model.dictToModel(item, Album()) for item in data)
return albums
# from https://github.com/Dniel97/orpheusdl-tidal/blob/master/interface.py#L582
def parse_mpd(self, xml: bytes) -> list:
# Removes default namespace definition, don't do that!
xml = re.sub(r'xmlns="[^"]+"', '', xml, count=1)
root = ElementTree.fromstring(xml)
# List of AudioTracks
tracks = []
for period in root.findall('Period'):
for adaptation_set in period.findall('AdaptationSet'):
for rep in adaptation_set.findall('Representation'):
# Check if representation is audio
content_type = adaptation_set.get('contentType')
if content_type != 'audio':
raise ValueError('Only supports audio MPDs!')
# Codec checks
codec = rep.get('codecs').upper()
if codec.startswith('MP4A'):
codec = 'AAC'
# Segment template
seg_template = rep.find('SegmentTemplate')
# Add init file to track_urls
track_urls = [seg_template.get('initialization')]
start_number = int(seg_template.get('startNumber') or 1)
# https://dashif-documents.azurewebsites.net/Guidelines-TimingModel/master/Guidelines-TimingModel.html#addressing-explicit
# Also see example 9
seg_timeline = seg_template.find('SegmentTimeline')
if seg_timeline is not None:
seg_time_list = []
cur_time = 0
for s in seg_timeline.findall('S'):
# Media segments start time
if s.get('t'):
cur_time = int(s.get('t'))
# Segment reference
for i in range((int(s.get('r') or 0) + 1)):
seg_time_list.append(cur_time)
# Add duration to current time
cur_time += int(s.get('d'))
# Create list with $Number$ indices
seg_num_list = list(range(start_number, len(seg_time_list) + start_number))
# Replace $Number$ with all the seg_num_list indices
track_urls += [seg_template.get('media').replace('$Number$', str(n)) for n in seg_num_list]
tracks.append(track_urls)
return tracks
def getStreamUrl(self, id, quality: AudioQuality):
squality = "HI_RES"
if quality == AudioQuality.Normal:
@@ -294,6 +350,8 @@ class TidalAPI(object):
squality = "HIGH"
elif quality == AudioQuality.HiFi:
squality = "LOSSLESS"
elif quality == AudioQuality.Max:
squality = "HI_RES_LOSSLESS"
paras = {"audioquality": squality, "playbackmode": "STREAM", "assetpresentation": "FULL"}
data = self.__get__(f'tracks/{str(id)}/playbackinfopostpaywall', paras)
@@ -307,9 +365,20 @@ class TidalAPI(object):
ret.codec = manifest['codecs']
ret.encryptionKey = manifest['keyId'] if 'keyId' in manifest else ""
ret.url = manifest['urls'][0]
ret.urls = [ret.url]
return ret
# else:
# manifest = json.loads(base64.b64decode(resp.manifest).decode('utf-8'))
elif "dash+xml" in resp.manifestMimeType:
xmldata = base64.b64decode(resp.manifest).decode('utf-8')
ret = StreamUrl()
ret.trackid = resp.trackid
ret.soundQuality = resp.audioQuality
ret.codec = aigpy.string.getSub(xmldata, 'codecs="', '"')
ret.encryptionKey = ""#manifest['keyId'] if 'keyId' in manifest else ""
ret.urls = self.parse_mpd(xmldata)[0]
if len(ret.urls) > 0:
ret.url = ret.urls[0]
return ret
raise Exception("Can't get the streamUrl, type is " + resp.manifestMimeType)
def getVideoStreamUrl(self, id, quality: VideoQuality):