mirror of
https://github.com/yaronzz/Tidal-Media-Downloader.git
synced 2026-06-13 04:05:07 +03:00
1. Add quality 'MAX'
2. Try to parse 'dash+xml'
This commit is contained in:
@@ -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__':
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -16,6 +16,7 @@ class AudioQuality(Enum):
|
||||
High = 1
|
||||
HiFi = 2
|
||||
Master = 3
|
||||
Max = 4
|
||||
|
||||
|
||||
class VideoQuality(Enum):
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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):"
|
||||
|
||||
@@ -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'-是):"
|
||||
|
||||
@@ -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):"
|
||||
|
||||
@@ -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):"
|
||||
|
||||
@@ -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):"
|
||||
|
||||
@@ -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):"
|
||||
|
||||
@@ -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):"
|
||||
|
||||
@@ -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):"
|
||||
|
||||
@@ -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):"
|
||||
|
||||
@@ -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):"
|
||||
|
||||
@@ -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):"
|
||||
|
||||
@@ -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ì):"
|
||||
|
||||
@@ -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'-はい):"
|
||||
|
||||
@@ -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'-예):"
|
||||
|
||||
@@ -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):"
|
||||
|
||||
@@ -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):"
|
||||
|
||||
@@ -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):"
|
||||
|
||||
@@ -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'-Да):"
|
||||
|
||||
@@ -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í):"
|
||||
|
||||
@@ -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): "
|
||||
|
||||
@@ -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'-Так):"
|
||||
|
||||
@@ -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ó):"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 + "] "
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user