Compare commits

...

86 Commits

Author SHA1 Message Date
Yaronzz f4854f4b74 Fix formatting issues in README.md
Build exe / build (macos-latest) (push) Has been cancelled
Build exe / build (ubuntu-latest) (push) Has been cancelled
Build exe / build (windows-latest) (push) Has been cancelled
2025-10-17 11:41:40 +08:00
Yaronzz 8352f0f6e2 UPDATE 2023-11-01 13:41:16 +08:00
Yaronzz a8da5c0ff3 Merge pull request #1106 from exislow/gui-playlists
[GUI] Show user's playlists and allow to download them.
2023-10-31 13:34:49 +08:00
Robert Honz df7c444487 Added playlist -> right click to download the whole playlist in "playlist style". 2023-10-31 06:08:40 +01:00
Robert Honz d88dca4da6 Style fix. 2023-10-23 21:55:57 +02:00
Robert Honz 88b5b61328 KeyPressEvent select all items. 2023-10-23 21:55:26 +02:00
Robert Honz 56c9cf5695 Refactoring: Mainly removed unused imports. 2023-10-23 15:00:06 +02:00
Robert Honz 379eca8458 Multiple title can be downloaded sequentially. 2023-10-23 14:34:14 +02:00
Robert Honz 7d6f9fc6e1 * Playlist content will be displayed in table.
* Can select multiple items to download.
2023-10-23 13:41:17 +02:00
Robert Honz 87eabab36f * Added tidalapi as dependency.
* Added TreeView to display user's playlists.
2023-10-22 21:16:20 +02:00
Robert Honz 288c75bcc7 Removed tidal. import. 2023-10-22 10:51:47 +02:00
Yaronzz 62d83b5975 update readme 2023-09-06 10:25:38 +08:00
Yaronzz 251af9e745 Merge branch 'master' of https://github.com/yaronzz/Tidal-Media-Downloader into master 2023-09-06 09:34:13 +08:00
Yaronzz 0751c37b35 update 2023-09-06 09:34:01 +08:00
Yaronzz 4f32b14441 1. Add quality 'MAX'
2. Try to parse 'dash+xml'
2023-09-06 09:31:50 +08:00
Yaronzz 97928ef207 Merge pull request #1075 from yaronzz/dependabot/pip/TIDALDL-PY/requests-2.31.0
Bump requests from 2.27.1 to 2.31.0 in /TIDALDL-PY
2023-07-13 08:41:48 +08:00
Yaronzz 9edd5967f0 Merge pull request #1078 from adibue/doc-link-fix
Fix links to documentation
2023-07-13 08:41:23 +08:00
Adrian Bühler 8449b85d81 Fix links to documentation 2023-06-14 15:57:28 +02:00
dependabot[bot] 2f4ad82421 Bump requests from 2.27.1 to 2.31.0 in /TIDALDL-PY
Bumps [requests](https://github.com/psf/requests) from 2.27.1 to 2.31.0.
- [Release notes](https://github.com/psf/requests/releases)
- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)
- [Commits](https://github.com/psf/requests/compare/v2.27.1...v2.31.0)

---
updated-dependencies:
- dependency-name: requests
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-23 03:22:30 +00:00
Yaronzz 513be57c3d fix getTrackPath bug 2022-12-21 09:16:22 +08:00
Yaronzz 3eb11252c2 Merge pull request #1006 from roberts91/made-video-download-optional
Made video download optional
2022-12-21 08:54:51 +08:00
Yaronzz b972f7cda8 Merge branch 'master' into made-video-download-optional 2022-12-21 08:51:23 +08:00
Yaronzz b1b643109c Merge pull request #1019 from DJSweder/patch-1
Update czech.py
2022-11-14 09:28:34 +08:00
Yaronzz c15ad63542 Merge pull request #1017 from Click1701/master
Update german.py
2022-11-14 09:27:29 +08:00
DJSweder 09321db35e Update czech.py
Some minor changes
2022-11-13 16:52:45 +01:00
Click1701 132e516250 Update german.py
Translated yet untranslated parts and other slight changes
2022-11-08 17:20:17 +01:00
Yaronzz a771c598ae upload new version 2022-10-31 14:08:07 +08:00
Yaronzz db76e84123 Merge pull request #1003 from Zibbp/master
fix(cover): return if no cover found
2022-10-31 13:37:45 +08:00
Yaronzz 7eb4419177 Merge pull request #1002 from bladeoner/stale
Update stale.yml
2022-10-31 13:36:28 +08:00
Yaronzz df3c405667 Merge pull request #1001 from grzekru/delay_setting
Add delay setting
2022-10-31 13:36:10 +08:00
Yaronzz 951fd102ad Merge pull request #999 from bladeoner/workflow
Update Github Workflow
2022-10-31 13:33:55 +08:00
Robert Sæther 252076f6dd Added missing translations 2022-10-31 04:27:30 +01:00
Robert Sæther 11828a0e8e Made video download optional when downloading playlists, albums or mixes 2022-10-31 02:30:57 +01:00
Isaac 93f363f405 fix(cover): return if no cover found 2022-10-28 10:02:27 -05:00
bladeoner 12a96d8a46 Update stale.yml 2022-10-26 08:21:25 +02:00
Grzegorz Krukar 238b2da4b3 Add delay setting 2022-10-25 23:51:16 +02:00
bladeoner 76313d68c9 Update Github Workflow 2022-10-21 13:36:42 +02:00
Yaronzz 4e8751ceb1 upload new version 2022-10-12 10:28:26 +08:00
Yaronzz 2dfcbad8f0 Merge pull request #995 from roberts91/added-playlist-format-option
Added option to control playlist folder format, added norwegian translations, translation file cleanup (all files now have same structure)
2022-10-12 10:17:57 +08:00
Robert Sæther 07d18ce2d6 Language file clean-up (all files has same structure), added norwegian translations 2022-10-10 15:36:29 +02:00
Robert Sæther 7fdd307176 Minor translation cleanup 2022-10-10 14:53:07 +02:00
Robert Sæther 11805382cc Removed duplicate translation 2022-10-10 14:18:07 +02:00
Robert Sæther 044a847e78 Added option to control playlist folder format 2022-10-10 01:22:47 +02:00
Yaronzz 6e49253e99 Merge pull request #992 from dansleboby/fix-issue-970-986
Fix issue #970 and #986
2022-09-27 10:44:18 +08:00
Gilbert Paquin 0c83717469 Only take streamReady track
This is when a track is still in the playlist and no longer on tidal, you can't play the song anymore through tidal

Fix Issue #970
2022-09-23 16:37:04 -04:00
Gilbert Paquin 7f1afb27f1 Random delay and long wait if for any reason the random delay too short
Fix issue #986
2022-09-23 16:35:55 -04:00
Yaronzz 18efb49213 Merge pull request #983 from omensight/master
Fix error when cover is not present
2022-09-13 09:42:46 +08:00
Mijael Viricochea Parra a275275cb6 Revert "Build file added for Windows"
This reverts commit 7e5b6d22c4.
2022-09-12 21:32:48 -04:00
Mijael Viricochea Parra 7e5b6d22c4 Build file added for Windows 2022-09-09 21:31:01 -04:00
Mijael Viricochea 96742046ba Fix error when cover is not present 2022-09-08 16:30:41 -04:00
Yaronzz 3199dcedc6 upload new version 2022-08-29 10:30:03 +08:00
Yaronzz 2cf59b3195 Fix #931 2022-08-29 10:25:50 +08:00
Yaronzz be84a3631a Merge pull request #974 from yohann69/patch-1
Update french.py
2022-08-23 09:16:24 +08:00
Yaronzz 9ce35af72f Merge pull request #967 from bladeoner/language
Update Hungarian language
2022-08-23 09:16:00 +08:00
Yohann 9d904a0fea Update french.py 2022-08-11 18:40:28 +02:00
bladeoner 5e05afd775 Update Hungarian language 2022-08-01 23:29:18 +02:00
Yaronzz dece506d58 Merge pull request #962 from DJSweder/patch-2
Update czech.py
2022-07-28 23:24:38 +08:00
DJSweder c2cc170988 Update czech.py
Correction of author's information.
2022-07-26 14:11:33 +02:00
DJSweder 3cab9ea295 Update czech.py
Corrections and completion translation into Czech language.
2022-07-26 10:18:10 +02:00
Yaronzz 5cf094d227 Merge pull request #946 from acherifi/add_artists_search_and_favorites
Add capability to perform an artist search and download all albums
2022-07-26 10:05:10 +08:00
Yaronzz 2e1e15ed3f Merge pull request #959 from KitDaCatsun/patch-2
Made errors in __post__ throw after 3 attempts
2022-07-26 10:02:57 +08:00
KitDaCatsun 7434470216 Made errors in __post__ throw after 3 attempts
`range(3)` gives `0, 1, 2` so `index >= 3` would never be reached. Assuming intended behavior was to throw if an error occurs on the third try and ignore errors on the first and second
2022-07-25 10:17:04 +01:00
Yaronzz 2ce2a310ae Merge pull request #958 from KitDaCatsun/patch-1
Removed unused assignment
2022-07-25 17:14:31 +08:00
KitDaCatsun dfc7af7796 Removed unused assignment
header set to {} then immediately given new value
2022-07-25 09:06:17 +01:00
Ali CHERIFI 63bf063dd3 Fix except block 2022-07-14 22:51:38 +02:00
Ali CHERIFI 3e8a3436b4 Add capability to perform an artist search and download all albums 2022-07-14 22:43:12 +02:00
Yaronzz e08e5efc88 upload new version 2022-07-14 09:54:54 +08:00
Yaronzz 7f3758e18c Fix bug of #945 2022-07-14 09:52:45 +08:00
Yaronzz 3e2d74a37f update readme 2022-07-08 11:15:13 +08:00
Yaronzz 69ccd65025 update readme 2022-07-08 11:11:49 +08:00
Yaronzz 81b82e6c29 update gui 2022-07-08 10:54:05 +08:00
Yaronzz 346befda6d update gui 2022-07-08 09:59:48 +08:00
Yaronzz 450102bfea Merge pull request #940 from Frikilinux/lang-es
Translate new options and fix typos
2022-07-08 08:34:11 +08:00
Frikilinux a966b3d93d Translate new options and fix typos 2022-07-07 19:01:27 -03:00
Yaronzz 55df515256 upload new version #936 2022-07-06 14:57:30 +08:00
Yaronzz 242747719a Mulithread download 2022-07-06 14:43:59 +08:00
Yaronzz e3c5886a02 upload v2022.6.30.1 2022-06-30 09:06:27 +08:00
Yaronzz 33c49b83db fix #934 2022-06-30 08:57:04 +08:00
Yaronzz ed13b9b92d check qt_material #933 2022-06-30 08:45:13 +08:00
Yaronzz e45f649e46 update readme 2022-06-27 17:38:10 +08:00
Yaronzz 0172301769 check api key 2022-06-27 11:16:00 +08:00
Yaronzz a7aa38e563 fix bug of #930 2022-06-24 18:30:53 +08:00
Yaronzz fd97a2b966 upload new version 2022-06-24 10:19:41 +08:00
Yaronzz e1ee47b93c update 2022-06-23 14:07:26 +08:00
Yaronzz 61b9dd3af8 update 2022-06-23 13:43:47 +08:00
Yaronzz 628a42b058 add require module 2022-06-23 13:38:40 +08:00
48 changed files with 1319 additions and 809 deletions
+1 -1
View File
@@ -18,7 +18,7 @@
# pull-requests: write
# steps:
# - uses: actions/stale@v5
# - uses: actions/stale@v6
# with:
# repo-token: ${{ secrets.GITHUB_TOKEN }}
# stale-issue-message: 'This issue has been automatically marked as stale because it has not had recent activity.'
+2 -2
View File
@@ -12,7 +12,7 @@ jobs:
steps:
- name: Checkout repo
uses: actions/checkout@v2
uses: actions/checkout@v3
with:
fetch-depth: 0
@@ -67,7 +67,7 @@ jobs:
# working-directory: TIDALDL-PY/dist
- name: Upload artifact
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v3
with:
name: tidal-dl-${{ runner.os }}
path: |
+4 -4
View File
@@ -14,7 +14,7 @@
"console": "integratedTerminal",
// "python": "python3",
"env": {
"PYTHONPATH": "${workspaceRoot}/TIDALDL-PY/"
"PYTHONPATH": "${workspaceRoot}/TIDALDL-PY/tidal_dl/"
},
"justMyCode": false
},
@@ -26,7 +26,7 @@
"console": "integratedTerminal",
// "python": "python3",
"env": {
"PYTHONPATH": "${workspaceRoot}/TIDALDL-PY/"
"PYTHONPATH": "${workspaceRoot}/TIDALDL-PY/tidal_dl/"
},
"args": [
"--link",
@@ -46,7 +46,7 @@
"console": "integratedTerminal",
// "python": "python3",
"env": {
"PYTHONPATH": "${workspaceRoot}/TIDALDL-PY/"
"PYTHONPATH": "${workspaceRoot}/TIDALDL-PY/tidal_dl/"
},
"justMyCode": false
@@ -59,7 +59,7 @@
"console": "integratedTerminal",
// "python": "python3",
"env": {
"PYTHONPATH": "${workspaceRoot}/TIDALDL-PY/"
"PYTHONPATH": "${workspaceRoot}/TIDALDL-PY/tidal_dl/"
},
"justMyCode": false
+42 -27
View File
@@ -1,6 +1,10 @@
<br>
<a href="https://github.com/yaronzz/Tidal-Media-Downloader-PRO">[GUI-REPOSITORY]</a>
<br>
![Tidal-Media-Downloader](https://socialify.git.ci/yaronzz/Tidal-Media-Downloader/image?description=1&font=Rokkitt&forks=1&issues=1&language=1&name=1&owner=1&pattern=Circuit%20Board&stargazers=1&theme=Dark)
<div align="center">
<h1>Tidal-Media-Downloader</h1>
<a href="https://github.com/yaronzz/Tidal-Media-Downloader/blob/master/LICENSE">
@@ -26,34 +30,47 @@
«Tidal-Media-Downloader» is an application that lets you download videos and tracks from Tidal. It supports two version: tidal-dl and tidal-gui. (This repository only contains tidal-dl, and the release isn't the newest gui version.)
<br>
<a href="https://github.com/yaronzz/Tidal-Media-Downloader-PRO/releases">Download</a> |
<a href="https://yaronzz.com/post/tidal_dl_installation/">Documentation</a> |
<a href="https://yaronzz.com/post/tidal_dl_installation_chn/">中文文档</a> |
<a href="https://doc.yaronzz.com/post/tidal_dl_installation/">Documentation</a> |
<a href="https://doc.yaronzz.com/post/tidal_dl_installation_chn/">中文文档</a> |
<br>
</p>
## 📺 Installation
## 📺 Installation
| Name | platform | Install |
| ----------------------------------- | --------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
| tidal-dl (cli) | Windows \ Linux \ Macos \ Android | ``pip3 install tidal-dl --upgrade``<br />[Detailed Description](https://yaronzz.com/post/tidal_dl_installation/#Install) |
| tidal-gui | Windows | [GUI Repository](https://github.com/yaronzz/Tidal-Media-Downloader-PRO) |
| tidal-gui(**Cross-platform**) | Windows \ Linux \ Macos | ``pip3 install tidal-gui --upgrade`` |
```shell
pip3 install tidal-dl --upgrade
```
| USE | FUNCTION |
| ----------------------------------------------------- | -------------------------- |
| tidal-dl | Show interactive interface |
| tidal-dl -h | Show help-message |
| tidal-dl -l "https://tidal.com/browse/track/70973230" | Download link |
| tidal-dl -g | Show simple-gui |
If you are using windows system, you can use [tidal-pro](https://github.com/yaronzz/Tidal-Media-Downloader-PRO)
### Nightly Builds
| Download nightly builds from continuous integration: | [Build Status][Actions] |
| ---------------------------------------------------- | ----------------------- |
|Download nightly builds from continuous integration: | [![Build Status][Build]][Actions]
|-------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|
[Actions]: https://github.com/yaronzz/Tidal-Media-Downloader/actions
[Build]: https://github.com/yaronzz/Tidal-Media-Downloader/workflows/Tidal%20Media%20Downloader/badge.svg
## 🤖 Features
- Download album \ track \ video \ playlist \ artist-albums
- Add metadata to songs
- Selectable video resolution and track quality
## 💽 User Interface
<img src="https://i.loli.net/2020/08/19/gqW6zHI1SrKlomC.png" alt="image" style="zoom: 50%;" />
![image-20220708105823257](https://s2.loli.net/2022/07/08/vV6HsxugwoDyGr8.png)
![image-20200806013705425](https://i.loli.net/2020/08/06/sPLowIlCGyOdpVN.png)
## Settings - Possible Tags
@@ -86,7 +103,7 @@
| {ArtistName} | The Beatles |
| {ArtistsName} | The Beatles |
| {TrackTitle} | I Saw Her Standing There (Remastered 2009) |
| {ExplicitFlag} | (*Explicit*) |
| {ExplicitFlag} | (*Explicit*) |
| {AlbumYear} | 1963 |
| {AlbumTitle} | Please Please Me (Remastered) |
| {AudioQuality} | LOSSLESS |
@@ -96,26 +113,26 @@
### Video
| Tag | Example Value |
| -------------- | ------------------ |
| {VideoNumber} | 00 |
| {ArtistName} | DMX |
| {ArtistsName} | DMX, Westside Gunn |
| {VideoTitle} | Hood Blues |
| {ExplicitFlag} | (*Explicit*) |
| {VideoYear} | 2021 |
| {TrackID} | 188932980 |
| Tag | Example Value |
| ----------------- | ------------------------------------------ |
| {VideoNumber} | 00 |
| {ArtistName} | DMX |
| {ArtistsName} | DMX, Westside Gunn |
| {VideoTitle} | Hood Blues |
| {ExplicitFlag} | (*Explicit*) |
| {VideoYear} | 2021 |
| {TrackID} | 188932980 |
## ☕ Support
If you really like my projects and want to support me, you can buy me a coffee and star this project.
If you really like my projects and want to support me, you can buy me a coffee and star this project.
<a href="https://www.buymeacoffee.com/yaronzz" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/arial-orange.png" alt="Buy Me A Coffee" style="height: 51px !important;width: 217px !important;" ></a>
## 🎂 Contributors
This project exists thanks to all the people who contribute.
This project exists thanks to all the people who contribute.
`<a href="https://github.com/yaronzz/Tidal-Media-Downloader/graphs/contributors"><img src="https://contributors-img.web.app/image?repo=yaronzz/Tidal-Media-Downloader" />``</a>`
<a href="https://github.com/yaronzz/Tidal-Media-Downloader/graphs/contributors"><img src="https://contributors-img.web.app/image?repo=yaronzz/Tidal-Media-Downloader" /></a>
## 🎨 Libraries and reference
@@ -125,9 +142,8 @@ This project exists thanks to all the people who contribute.
- [tidal-wiki](https://github.com/Fokka-Engineering/TIDAL/wiki)
## 📜 Disclaimer
- Private use only.
- Need a Tidal-HIFI subscription.
- Need a Tidal-HIFI subscription.
- You should not use this method to distribute or pirate music.
- It may be illegal to use this in your country, so be informed.
@@ -138,4 +154,3 @@ pip3 uninstall tidal-dl
pip3 install -r requirements.txt --user
python3 setup.py install
```
Binary file not shown.
+4 -2
View File
@@ -1,10 +1,12 @@
requests==2.27.1
requests==2.31.0
colorama==0.4.4
prettytable==3.1.1
mutagen==1.45.1
psutil==5.9.0
pycryptodome==3.14.1
aigpy==2022.6.22.1
aigpy==2022.7.8.1
lyricsgenius==3.0.1
pydub==0.25.1
PyQt5==5.15.7
qt-material==2.12
+1 -1
View File
@@ -11,6 +11,6 @@ setup(
packages=find_packages(exclude=['tidal_dl*']),
include_package_data = True,
platforms = "any",
install_requires=["tidal-dl", "PyQt5"],
install_requires=["tidal-dl"],
entry_points={'console_scripts': [ 'tidal-gui = tidal_gui:main', ]}
)
+3 -3
View File
@@ -13,11 +13,11 @@ setup(
packages=find_packages(exclude=['tidal_gui*']),
include_package_data=False,
platforms="any",
install_requires=["aigpy>=2022.6.22.1",
install_requires=["aigpy>=2022.7.8.1",
"requests>=2.22.0",
"pycryptodome",
"pydub",
"prettytable",
"PyQt5"],
"prettytable",
"lxml"],
entry_points={'console_scripts': ['tidal-dl = tidal_dl:main', ]}
)
+38 -24
View File
@@ -6,27 +6,30 @@
@Author : Yaronzz
@Version : 3.0
@Contact : yaronhuang@foxmail.com
@Desc :
@Desc :
'''
import sys
import getopt
import aigpy
from tidal_dl.events import *
from tidal_dl.settings import *
from tidal_dl.gui import *
from events import *
from settings import *
from gui import startGui
from printf import Printf
def mainCommand():
try:
opts, args = getopt.getopt(sys.argv[1:],
"hvgl:o:q:r:",
opts, args = getopt.getopt(sys.argv[1:],
"hvgl:o:q:r:",
["help", "version", "gui", "link=", "output=", "quality", "resolution"])
except getopt.GetoptError as errmsg:
Printf.err(vars(errmsg)['msg'] + ". Use 'tidal-dl -h' for useage.")
Printf.err(vars(errmsg)['msg'] + ". Use 'tidal-dl -h' for usage.")
return
link = None
showGui = False
for opt, val in opts:
if opt in ('-h', '--help'):
Printf.usage()
@@ -52,11 +55,11 @@ def mainCommand():
SETTINGS.videoQuality = SETTINGS.getVideoQuality(val)
SETTINGS.save()
continue
if not aigpy.path.mkdirs(SETTINGS.downloadPath):
Printf.err(LANG.MSG_PATH_ERR + SETTINGS.downloadPath)
Printf.err(LANG.select.MSG_PATH_ERR + SETTINGS.downloadPath)
return
if showGui:
startGui()
return
@@ -64,28 +67,32 @@ def mainCommand():
if link is not None:
if not loginByConfig():
loginByWeb()
Printf.info(LANG.SETTING_DOWNLOAD_PATH + ':' + SETTINGS.downloadPath)
Printf.info(LANG.select.SETTING_DOWNLOAD_PATH + ':' + SETTINGS.downloadPath)
start(link)
def main():
SETTINGS.read(getProfilePath())
TOKEN.read(getTokenPath())
TIDAL_API.apiKey = apiKey.getItem(SETTINGS.apiKeyIndex)
if len(sys.argv) > 1:
mainCommand()
return
Printf.logo()
Printf.settings()
if not loginByConfig():
if not apiKey.isItemValid(SETTINGS.apiKeyIndex):
changeApiKey()
loginByWeb()
elif not loginByConfig():
loginByWeb()
Printf.checkVersion()
while True:
Printf.choices()
choice = Printf.enter(LANG.PRINT_ENTER_CHOICE)
choice = Printf.enter(LANG.select.PRINT_ENTER_CHOICE)
if choice == "0":
return
elif choice == "1":
@@ -111,11 +118,11 @@ def main():
def test():
SETTINGS.read(getProfilePath())
TOKEN.read(getTokenPath())
if not loginByConfig():
loginByWeb()
SETTINGS.audioQuality = AudioQuality.Normal
SETTINGS.audioQuality = AudioQuality.Master
SETTINGS.videoFileFormat = VideoQuality.P240
SETTINGS.checkExist = False
SETTINGS.includeEP = True
@@ -124,23 +131,30 @@ def test():
SETTINGS.showProgress = True
SETTINGS.showTrackInfo = True
SETTINGS.saveAlbumInfo = True
SETTINGS.downloadVideos = True
SETTINGS.downloadPath = "./download/"
SETTINGS.usePlaylistFolder = True
SETTINGS.albumFolderFormat = R"{ArtistName}/{Flag} {AlbumTitle} [{AlbumID}] [{AlbumYear}]"
SETTINGS.playlistFolderFormat = R"Playlist/{PlaylistName} [{PlaylistUUID}]"
SETTINGS.trackFileFormat = R"{TrackNumber} - {ArtistName} - {TrackTitle}{ExplicitFlag}"
SETTINGS.videoFileFormat = R"{VideoNumber} - {ArtistName} - {VideoTitle}{ExplicitFlag}"
SETTINGS.multiThread = False
SETTINGS.apiKeyIndex = 4
SETTINGS.checkExist = False
Printf.settings()
TIDAL_API.getPlaylistSelf()
# 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")
# video 155608351 188932980 https://tidal.com/browse/track/55130637
# start("155608351")https://tidal.com/browse/track/199683732
if __name__ == '__main__':
+12 -8
View File
@@ -60,12 +60,12 @@ __KEYS_JSON__ = '''
'''
__API_KEYS__ = json.loads(__KEYS_JSON__)
__ERROR_KEY__ = {
'platform': 'None',
'formats': '',
'clientId': '',
'clientSecret': '',
'platform': 'None',
'formats': '',
'clientId': '',
'clientSecret': '',
'valid': 'False',
},
},
def getNum():
@@ -78,6 +78,11 @@ def getItem(index: int):
return __API_KEYS__['keys'][index]
def isItemValid(index: int):
item = getItem(index)
return item['valid'] == 'True'
def getItems():
return __API_KEYS__['keys']
@@ -92,7 +97,8 @@ def getLimitIndexs():
def getVersion():
return __API_KEYS__['version']
#Load from gist
# Load from gist
try:
respond = requests.get('https://api.github.com/gists/48d01f5a24b4b7b37f19443977c22cd6')
if respond.status_code == 200:
@@ -100,5 +106,3 @@ try:
__API_KEYS__ = json.loads(content)
except:
pass
+53 -23
View File
@@ -6,15 +6,14 @@
@Author : Yaronzz
@Version : 1.0
@Contact : yaronhuang@foxmail.com
@Desc :
@Desc :
'''
import aigpy
import logging
from tidal_dl.paths import *
from tidal_dl.printf import *
from tidal_dl.decryption import *
from tidal_dl.tidal import *
from concurrent.futures import ThreadPoolExecutor
from decryption import *
from printf import *
from tidal import *
def __isSkip__(finalpath, url):
@@ -84,10 +83,10 @@ def downloadCover(album):
def downloadAlbumInfo(album, tracks):
if album is None:
return
path = getAlbumPath(album)
aigpy.path.mkdirs(path)
path += '/AlbumInfo.txt'
infos = ""
infos += "[ID] %s\n" % (str(album.id))
@@ -120,12 +119,12 @@ def downloadVideo(video: Video, album: Album = None, playlist: Playlist = None):
m3u8content = requests.get(stream.m3u8Url).content
if m3u8content is None:
Printf.err(f"DL Video[{video.title}] getM3u8 failed.{str(e)}")
return False
return False, f"GetM3u8 failed.{str(e)}"
urls = aigpy.m3u8.parseTsUrls(m3u8content)
if len(urls) <= 0:
Printf.err(f"DL Video[{video.title}] getTsUrls failed.{str(e)}")
return False
return False, "GetTsUrls failed.{str(e)}"
check, msg = aigpy.m3u8.downloadByTsUrls(urls, path)
if check:
@@ -133,10 +132,10 @@ def downloadVideo(video: Video, album: Album = None, playlist: Playlist = None):
return True
else:
Printf.err(f"DL Video[{video.title}] failed.{msg}")
return False
return False, msg
except Exception as e:
Printf.err(f"DL Video[{video.title}] failed.{str(e)}")
return False
return False, str(e)
def downloadTrack(track: Track, album=None, playlist=None, userProgress=None, partSize=1048576):
@@ -144,7 +143,7 @@ def downloadTrack(track: Track, album=None, playlist=None, userProgress=None, pa
stream = TIDAL_API.getStreamUrl(track.id, SETTINGS.audioQuality)
path = getTrackPath(track, stream, album, playlist)
if SETTINGS.showTrackInfo:
if SETTINGS.showTrackInfo and not SETTINGS.multiThread:
Printf.track(track, stream)
if userProgress is not None:
@@ -153,18 +152,18 @@ def downloadTrack(track: Track, album=None, playlist=None, userProgress=None, pa
# check exist
if __isSkip__(path, stream.url):
Printf.success(aigpy.path.getFileName(path) + " (skip:already exists!)")
return True
return True, ''
# 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)
check, err = tool.start(SETTINGS.showProgress and not SETTINGS.multiThread)
if not check:
Printf.err(f"DL Track[{track.title}] failed.{str(err)}")
return False
Printf.err(f"DL Track '{track.title}' failed: {str(err)}")
return False, str(err)
# encrypted -> decrypt and remove encrypted file
__encrypted__(stream, path + '.part', path)
@@ -180,13 +179,44 @@ def downloadTrack(track: Track, album=None, playlist=None, userProgress=None, pa
lyrics = TIDAL_API.getLyrics(track.id).subtitles
if SETTINGS.lyricFile:
lrcPath = path.rsplit(".", 1)[0] + '.lrc'
aigpy.fileHelper.write(lrcPath, lyrics, 'w')
aigpy.file.write(lrcPath, lyrics, 'w')
except:
lyrics = ''
__setMetaData__(track, album, path, contributors, lyrics)
Printf.success(track.title)
return True
return True, ''
except Exception as e:
Printf.err(f"DL Track[{track.title}] failed.{str(e)}")
return False
Printf.err(f"DL Track '{track.title}' failed: {str(e)}")
return False, str(e)
def downloadTracks(tracks, album: Album = None, playlist: Playlist = None):
def __getAlbum__(item: Track):
album = TIDAL_API.getAlbum(item.album.id)
if SETTINGS.saveCovers and not SETTINGS.usePlaylistFolder:
downloadCover(album)
return album
if not SETTINGS.multiThread:
for index, item in enumerate(tracks):
itemAlbum = album
if itemAlbum is None:
itemAlbum = __getAlbum__(item)
item.trackNumberOnPlaylist = index + 1
downloadTrack(item, itemAlbum, playlist)
else:
thread_pool = ThreadPoolExecutor(max_workers=5)
for index, item in enumerate(tracks):
itemAlbum = album
if itemAlbum is None:
itemAlbum = __getAlbum__(item)
item.trackNumberOnPlaylist = index + 1
thread_pool.submit(downloadTrack, item, itemAlbum, playlist)
thread_pool.shutdown(wait=True)
def downloadVideos(videos, album: Album, playlist=None):
for item in videos:
downloadVideo(item, album, playlist)
+1
View File
@@ -16,6 +16,7 @@ class AudioQuality(Enum):
High = 1
HiFi = 2
Master = 3
Max = 4
class VideoQuality(Enum):
+55 -68
View File
@@ -6,17 +6,10 @@
@Author : Yaronzz
@Version : 1.0
@Contact : yaronhuang@foxmail.com
@Desc :
@Desc :
"""
import aigpy
import time
from tidal_dl.model import *
from tidal_dl.enums import *
from tidal_dl.tidal import *
from tidal_dl.printf import *
from tidal_dl.download import *
from download import *
'''
=================================
@@ -30,12 +23,11 @@ def start_album(obj: Album):
tracks, videos = TIDAL_API.getItems(obj.id, Type.Album)
if SETTINGS.saveAlbumInfo:
downloadAlbumInfo(obj, tracks)
if SETTINGS.saveCovers:
if SETTINGS.saveCovers and obj.cover is not None:
downloadCover(obj)
for item in tracks:
downloadTrack(item, obj)
for item in videos:
downloadVideo(item, obj)
downloadTracks(tracks, obj)
if SETTINGS.downloadVideos:
downloadVideos(videos, obj)
def start_track(obj: Track):
@@ -46,7 +38,6 @@ def start_track(obj: Track):
def start_video(obj: Video):
# Printf.video(obj)
downloadVideo(obj, obj.album)
@@ -60,28 +51,15 @@ def start_artist(obj: Artist):
def start_playlist(obj: Playlist):
Printf.playlist(obj)
tracks, videos = TIDAL_API.getItems(obj.uuid, Type.Playlist)
for index, item in enumerate(tracks):
album = TIDAL_API.getAlbum(item.album.id)
item.trackNumberOnPlaylist = index + 1
downloadTrack(item, album, obj)
if SETTINGS.saveCovers and not SETTINGS.usePlaylistFolder:
downloadCover(album)
for item in videos:
downloadVideo(item, None)
downloadTracks(tracks, None, obj)
if SETTINGS.downloadVideos:
downloadVideos(videos, None, obj)
def start_mix(obj: Mix):
Printf.mix(obj)
for index, item in enumerate(obj.tracks):
album = TIDAL_API.getAlbum(item.album.id)
item.trackNumberOnPlaylist = index + 1
downloadTrack(item, album)
if SETTINGS.saveCovers and not SETTINGS.usePlaylistFolder:
downloadCover(album)
for item in obj.videos:
downloadVideo(item, None)
downloadTracks(obj.tracks, None, None)
downloadVideos(obj.videos, None, None)
def start_file(string):
@@ -114,6 +92,7 @@ def start_type(etype: Type, obj):
elif etype == Type.Mix:
start_mix(obj)
def start(string):
if aigpy.string.isNull(string):
Printf.err('Please enter something.')
@@ -138,6 +117,7 @@ def start(string):
except Exception as e:
Printf.err(str(e))
'''
=================================
CHANGE SETTINGS
@@ -146,52 +126,59 @@ CHANGE SETTINGS
def changePathSettings():
Printf.settings(SETTINGS)
Printf.settings()
SETTINGS.downloadPath = Printf.enterPath(
LANG.CHANGE_DOWNLOAD_PATH,
LANG.MSG_PATH_ERR,
LANG.select.CHANGE_DOWNLOAD_PATH,
LANG.select.MSG_PATH_ERR,
'0',
SETTINGS.downloadPath)
SETTINGS.albumFolderFormat = Printf.enterFormat(
LANG.CHANGE_ALBUM_FOLDER_FORMAT,
LANG.select.CHANGE_ALBUM_FOLDER_FORMAT,
SETTINGS.albumFolderFormat,
SETTINGS.getDefaultAlbumFolderFormat())
SETTINGS.getDefaultPathFormat(Type.Album))
SETTINGS.playlistFolderFormat = Printf.enterFormat(
LANG.select.CHANGE_PLAYLIST_FOLDER_FORMAT,
SETTINGS.playlistFolderFormat,
SETTINGS.getDefaultPathFormat(Type.Playlist))
SETTINGS.trackFileFormat = Printf.enterFormat(
LANG.CHANGE_TRACK_FILE_FORMAT,
LANG.select.CHANGE_TRACK_FILE_FORMAT,
SETTINGS.trackFileFormat,
SETTINGS.getDefaultTrackFileFormat())
SETTINGS.getDefaultPathFormat(Type.Track))
SETTINGS.videoFileFormat = Printf.enterFormat(
LANG.CHANGE_VIDEO_FILE_FORMAT,
LANG.select.CHANGE_VIDEO_FILE_FORMAT,
SETTINGS.videoFileFormat,
SETTINGS.getDefaultVideoFileFormat())
SETTINGS.getDefaultPathFormat(Type.Video))
SETTINGS.save()
def changeQualitySettings():
Printf.settings(SETTINGS)
Printf.settings()
SETTINGS.audioQuality = AudioQuality(
int(Printf.enterLimit(LANG.CHANGE_AUDIO_QUALITY,
LANG.MSG_INPUT_ERR,
['0', '1', '2', '3'])))
int(Printf.enterLimit(LANG.select.CHANGE_AUDIO_QUALITY,
LANG.select.MSG_INPUT_ERR,
['0', '1', '2', '3', '4'])))
SETTINGS.videoQuality = VideoQuality(
int(Printf.enterLimit(LANG.CHANGE_VIDEO_QUALITY,
LANG.MSG_INPUT_ERR,
int(Printf.enterLimit(LANG.select.CHANGE_VIDEO_QUALITY,
LANG.select.MSG_INPUT_ERR,
['1080', '720', '480', '360'])))
SETTINGS.save()
def changeSettings():
Printf.settings(SETTINGS)
SETTINGS.showProgress = Printf.enterBool(LANG.CHANGE_SHOW_PROGRESS)
SETTINGS.showTrackInfo = Printf.enterBool(LANG.CHANGE_SHOW_TRACKINFO)
SETTINGS.checkExist = Printf.enterBool(LANG.CHANGE_CHECK_EXIST)
SETTINGS.includeEP = Printf.enterBool(LANG.CHANGE_INCLUDE_EP)
SETTINGS.saveCovers = Printf.enterBool(LANG.CHANGE_SAVE_COVERS)
SETTINGS.saveAlbumInfo = Printf.enterBool(LANG.CHANGE_SAVE_ALBUM_INFO)
SETTINGS.lyricFile = Printf.enterBool(LANG.CHANGE_ADD_LRC_FILE)
SETTINGS.usePlaylistFolder = Printf.enterBool(LANG.SETTING_USE_PLAYLIST_FOLDER + "('0'-No,'1'-Yes):")
SETTINGS.language = Printf.enter(LANG.CHANGE_LANGUAGE + "(" + getLangChoicePrint() + "):")
LANG = setLang(SETTINGS.language)
Printf.settings()
SETTINGS.showProgress = Printf.enterBool(LANG.select.CHANGE_SHOW_PROGRESS)
SETTINGS.showTrackInfo = Printf.enterBool(LANG.select.CHANGE_SHOW_TRACKINFO)
SETTINGS.checkExist = Printf.enterBool(LANG.select.CHANGE_CHECK_EXIST)
SETTINGS.includeEP = Printf.enterBool(LANG.select.CHANGE_INCLUDE_EP)
SETTINGS.saveCovers = Printf.enterBool(LANG.select.CHANGE_SAVE_COVERS)
SETTINGS.saveAlbumInfo = Printf.enterBool(LANG.select.CHANGE_SAVE_ALBUM_INFO)
SETTINGS.downloadVideos = Printf.enterBool(LANG.select.CHANGE_DOWNLOAD_VIDEOS)
SETTINGS.lyricFile = Printf.enterBool(LANG.select.CHANGE_ADD_LRC_FILE)
SETTINGS.multiThread = Printf.enterBool(LANG.select.CHANGE_MULITHREAD_DOWNLOAD)
SETTINGS.usePlaylistFolder = Printf.enterBool(LANG.select.SETTING_USE_PLAYLIST_FOLDER + "('0'-No,'1'-Yes):")
SETTINGS.downloadDelay = Printf.enterBool(LANG.select.CHANGE_USE_DOWNLOAD_DELAY)
SETTINGS.language = Printf.enter(LANG.select.CHANGE_LANGUAGE + "(" + LANG.getLangChoicePrint() + "):")
LANG.setLang(SETTINGS.language)
SETTINGS.save()
@@ -202,7 +189,7 @@ def changeApiKey():
Printf.info(f'Current APIKeys: {str(SETTINGS.apiKeyIndex)} {item["platform"]}-{item["formats"]}')
Printf.info(f'Current Version: {str(ver)}')
Printf.apikeys(apiKey.getItems())
index = int(Printf.enterLimit("APIKEY index:", LANG.MSG_INPUT_ERR, apiKey.getLimitIndexs()))
index = int(Printf.enterLimit("APIKEY index:", LANG.select.MSG_INPUT_ERR, apiKey.getLimitIndexs()))
if index != SETTINGS.apiKeyIndex:
SETTINGS.apiKeyIndex = index
@@ -244,14 +231,14 @@ def __displayTime__(seconds, granularity=2):
def loginByWeb():
try:
print(LANG.AUTH_START_LOGIN)
print(LANG.select.AUTH_START_LOGIN)
# get device code
url = TIDAL_API.getDeviceCode()
print(LANG.AUTH_NEXT_STEP.format(
print(LANG.select.AUTH_NEXT_STEP.format(
aigpy.cmd.green(url),
aigpy.cmd.yellow(__displayTime__(TIDAL_API.key.authCheckTimeout))))
print(LANG.AUTH_WAITING)
print(LANG.select.AUTH_WAITING)
start = time.time()
elapsed = 0
@@ -261,7 +248,7 @@ def loginByWeb():
time.sleep(TIDAL_API.key.authCheckInterval + 1)
continue
Printf.success(LANG.MSG_VALID_ACCESSTOKEN.format(
Printf.success(LANG.select.MSG_VALID_ACCESSTOKEN.format(
__displayTime__(int(TIDAL_API.key.expiresIn))))
TOKEN.userid = TIDAL_API.key.userId
@@ -272,7 +259,7 @@ def loginByWeb():
TOKEN.save()
return True
raise Exception(LANG.AUTH_TIMEOUT)
raise Exception(LANG.select.AUTH_TIMEOUT)
except Exception as e:
Printf.err(f"Login failed.{str(e)}")
return False
@@ -284,7 +271,7 @@ def loginByConfig():
return False
if TIDAL_API.verifyAccessToken(TOKEN.accessToken):
Printf.info(LANG.MSG_VALID_ACCESSTOKEN.format(
Printf.info(LANG.select.MSG_VALID_ACCESSTOKEN.format(
__displayTime__(int(TOKEN.expiresAfter - time.time()))))
TIDAL_API.key.countryCode = TOKEN.countryCode
@@ -292,9 +279,9 @@ def loginByConfig():
TIDAL_API.key.accessToken = TOKEN.accessToken
return True
Printf.info(LANG.MSG_INVALID_ACCESSTOKEN)
Printf.info(LANG.select.MSG_INVALID_ACCESSTOKEN)
if TIDAL_API.refreshAccessToken(TOKEN.refreshToken):
Printf.success(LANG.MSG_VALID_ACCESSTOKEN.format(
Printf.success(LANG.select.MSG_VALID_ACCESSTOKEN.format(
__displayTime__(int(TIDAL_API.key.expiresIn))))
TOKEN.userid = TIDAL_API.key.userId
+257 -137
View File
@@ -6,173 +6,293 @@
@Author : Yaronzz
@Version : 1.0
@Contact : yaronhuang@foxmail.com
@Desc :
@Desc :
"""
import os
import importlib
import sys
import _thread
from tidal_dl.events import *
from tidal_dl.settings import *
from PyQt5.QtCore import Qt
from PyQt5.QtCore import pyqtSignal
from PyQt5 import QtWidgets
from qt_material import apply_stylesheet
from events import *
from printf import *
class MainView(QtWidgets.QWidget):
s_downloadEnd = pyqtSignal(str, bool, str)
def enableGui():
try:
importlib.import_module('PyQt5')
importlib.import_module('qt_material')
return True
except Exception as e:
return False
def __init__(self, ) -> None:
super().__init__()
self.initView()
self.setMinimumSize(600, 500)
self.setWindowTitle("Tidal-dl")
def __info__(self, msg):
QtWidgets.QMessageBox.information(self,
'Info',
msg,
QtWidgets.QMessageBox.Yes)
def initView(self):
self.c_lineSearch = QtWidgets.QLineEdit()
self.c_btnSearch = QtWidgets.QPushButton("Search")
self.c_btnDownload = QtWidgets.QPushButton("Download")
self.m_supportType = [Type.Album, Type.Playlist, Type.Track, Type.Video]
self.c_combType = QtWidgets.QComboBox()
for item in self.m_supportType:
self.c_combType.addItem(item.name, item)
if not enableGui():
def startGui():
Printf.err("Not support gui. Please type: `pip3 install PyQt5 qt_material`")
else:
from PyQt5.QtCore import Qt, QObject
from PyQt5.QtGui import QTextCursor, QKeyEvent
from PyQt5.QtCore import pyqtSignal
from PyQt5 import QtWidgets
from qt_material import apply_stylesheet
columnNames = ['#', 'Title', 'Artists', 'Quality']
self.c_tableInfo = QtWidgets.QTableWidget()
self.c_tableInfo.setColumnCount(len(columnNames))
self.c_tableInfo.setRowCount(0)
self.c_tableInfo.setShowGrid(False)
self.c_tableInfo.verticalHeader().setVisible(False)
self.c_tableInfo.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
self.c_tableInfo.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)
self.c_tableInfo.horizontalHeader().setStretchLastSection(True)
self.c_tableInfo.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.ResizeMode.ResizeToContents)
self.c_tableInfo.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
self.c_tableInfo.setFocusPolicy(Qt.NoFocus)
for index, name in enumerate(columnNames):
item = QtWidgets.QTableWidgetItem(name)
self.c_tableInfo.setHorizontalHeaderItem(index, item)
class EmittingStream(QObject):
textWritten = pyqtSignal(str)
self.lineGrid = QtWidgets.QHBoxLayout()
self.lineGrid.addWidget(self.c_combType)
self.lineGrid.addWidget(self.c_lineSearch)
self.lineGrid.addWidget(self.c_btnSearch)
def write(self, text):
self.textWritten.emit(str(text))
self.mainGrid = QtWidgets.QVBoxLayout(self)
self.mainGrid.addLayout(self.lineGrid)
self.mainGrid.addWidget(self.c_tableInfo)
self.mainGrid.addWidget(self.c_btnDownload)
class MainView(QtWidgets.QWidget):
s_downloadEnd = pyqtSignal(str, bool, str)
self.c_btnSearch.clicked.connect(self.search)
self.c_btnDownload.clicked.connect(self.download)
self.s_downloadEnd.connect(self.downloadEnd)
def __init__(self, ) -> None:
super().__init__()
self.initView()
self.setMinimumSize(800, 620)
self.setWindowTitle("TIDAL-DL")
def addItem(self, rowIdx: int, colIdx: int, text):
if isinstance(text, str):
item = QtWidgets.QTableWidgetItem(text)
self.c_tableInfo.setItem(rowIdx, colIdx, item)
def __info__(self, msg):
QtWidgets.QMessageBox.information(self, 'Info', msg, QtWidgets.QMessageBox.Yes)
def search(self):
self.c_tableInfo.setRowCount(0)
self.s_type = self.c_combType.currentData()
self.s_text = self.c_lineSearch.text()
if self.s_text.startswith('http'):
tmpType, tmpId = TIDAL_API.parseUrl(self.s_text)
if tmpType == Type.Null:
self.__info__('Url not support')
def __output__(self, text):
cursor = self.c_printTextEdit.textCursor()
cursor.movePosition(QTextCursor.End)
cursor.insertText(text)
self.c_printTextEdit.setTextCursor(cursor)
self.c_printTextEdit.ensureCursorVisible()
def initView(self):
self.c_lineSearch = QtWidgets.QLineEdit()
self.c_btnSearch = QtWidgets.QPushButton("Search")
self.c_btnDownload = QtWidgets.QPushButton("Download")
self.c_combType = QtWidgets.QComboBox()
self.c_combTQuality = QtWidgets.QComboBox()
self.c_combVQuality = QtWidgets.QComboBox()
# Supported types for search
self.m_supportType = [Type.Album, Type.Playlist, Type.Track, Type.Video, Type.Artist]
for item in self.m_supportType:
self.c_combType.addItem(item.name, item)
for item in AudioQuality:
self.c_combTQuality.addItem(item.name, item)
for item in VideoQuality:
self.c_combVQuality.addItem(item.name, item)
self.c_combTQuality.setCurrentText(SETTINGS.audioQuality.name)
self.c_combVQuality.setCurrentText(SETTINGS.videoQuality.name)
# init table
columnNames = ['#', 'Title', 'Artists', 'Quality']
self.c_tableInfo = QtWidgets.QTableWidget()
self.c_tableInfo.setColumnCount(len(columnNames))
self.c_tableInfo.setRowCount(0)
self.c_tableInfo.setShowGrid(False)
self.c_tableInfo.verticalHeader().setVisible(False)
self.c_tableInfo.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
self.c_tableInfo.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
self.c_tableInfo.horizontalHeader().setStretchLastSection(True)
self.c_tableInfo.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.ResizeMode.ResizeToContents)
self.c_tableInfo.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
self.c_tableInfo.setFocusPolicy(Qt.NoFocus)
for index, name in enumerate(columnNames):
item = QtWidgets.QTableWidgetItem(name)
self.c_tableInfo.setHorizontalHeaderItem(index, item)
# Create Tree View for playlists.
self.tree_playlists = QtWidgets.QTreeWidget()
self.tree_playlists.setAnimated(False)
self.tree_playlists.setIndentation(20)
self.tree_playlists.setSortingEnabled(True)
self.tree_playlists.setFixedWidth(200)
self.tree_playlists.setColumnCount(1)
self.tree_playlists.setHeaderLabels(("User Playlists",))
# self.tree_playlists.setColumnWidth(0, 100)
self.tree_playlists.setContextMenuPolicy(Qt.CustomContextMenu)
# print
self.c_printTextEdit = QtWidgets.QTextEdit()
self.c_printTextEdit.setReadOnly(True)
self.c_printTextEdit.setFixedHeight(100)
sys.stdout = EmittingStream(textWritten=self.__output__)
sys.stderr = EmittingStream(textWritten=self.__output__)
# layout
self.lineGrid = QtWidgets.QHBoxLayout()
self.lineGrid.addWidget(self.c_combType)
self.lineGrid.addWidget(self.c_lineSearch)
self.lineGrid.addWidget(self.c_btnSearch)
self.line2Grid = QtWidgets.QHBoxLayout()
self.line2Grid.addWidget(QtWidgets.QLabel("QUALITY:"))
self.line2Grid.addWidget(self.c_combTQuality)
self.line2Grid.addWidget(self.c_combVQuality)
self.line2Grid.addStretch(4)
self.line2Grid.addWidget(self.c_btnDownload)
self.funcGrid = QtWidgets.QVBoxLayout()
self.funcGrid.addLayout(self.lineGrid)
self.funcGrid.addWidget(self.c_tableInfo)
self.funcGrid.addLayout(self.line2Grid)
self.funcGrid.addWidget(self.c_printTextEdit)
self.mainGrid = QtWidgets.QHBoxLayout(self)
self.mainGrid.addWidget(self.tree_playlists)
self.mainGrid.addLayout(self.funcGrid)
# connect
self.c_btnSearch.clicked.connect(self.search)
self.c_lineSearch.returnPressed.connect(self.search)
self.c_btnDownload.clicked.connect(self.download)
self.s_downloadEnd.connect(self.downloadEnd)
self.c_combTQuality.currentIndexChanged.connect(self.changeTQuality)
self.c_combVQuality.currentIndexChanged.connect(self.changeVQuality)
self.tree_playlists.itemClicked.connect(self.__displayTracks__)
def keyPressEvent(self, event: QKeyEvent):
if event.modifiers() & Qt.MetaModifier and event.key() == Qt.Key_A:
self.c_tableInfo.selectAll()
def addItem(self, rowIdx: int, colIdx: int, text):
if isinstance(text, str):
item = QtWidgets.QTableWidgetItem(text)
self.c_tableInfo.setItem(rowIdx, colIdx, item)
def search(self):
self.c_tableInfo.setRowCount(0)
self.s_type = self.c_combType.currentData()
self.s_text = self.c_lineSearch.text()
if self.s_text.startswith('http'):
tmpType, tmpId = TIDAL_API.parseUrl(self.s_text)
if tmpType == Type.Null:
self.__info__('Url not support')
return
elif tmpType not in self.m_supportType:
self.__info__(f'Type[{tmpType.name}] not support')
return
tmpData = TIDAL_API.getTypeData(tmpId, tmpType)
if tmpData is None:
self.__info__('Url is wrong!')
return
self.s_type = tmpType
self.s_array = [tmpData]
self.s_result = None
self.c_combType.setCurrentText(tmpType.name)
else:
self.s_result = TIDAL_API.search(self.s_text, self.s_type)
self.s_array = TIDAL_API.getSearchResultItems(self.s_result, self.s_type)
if len(self.s_array) <= 0:
self.__info__('No result')
return
elif tmpType not in self.m_supportType:
self.__info__(f'Type[{tmpType.name}] not support')
self.setSearchResults(self.s_array, self.s_type)
def setSearchResults(self, s_array, s_type):
self.c_tableInfo.clearSelection()
self.c_tableInfo.setRowCount(len(s_array))
for index, item in enumerate(s_array):
self.addItem(index, 0, str(index + 1))
if s_type in [Type.Album, Type.Track]:
self.addItem(index, 1, item.title)
self.addItem(index, 2, TIDAL_API.getArtistsName(item.artists))
self.addItem(index, 3, item.audioQuality)
elif s_type in [Type.Video]:
self.addItem(index, 1, item.title)
self.addItem(index, 2, TIDAL_API.getArtistsName(item.artists))
self.addItem(index, 3, item.quality)
elif s_type in [Type.Playlist]:
self.addItem(index, 1, item.title)
self.addItem(index, 2, '')
self.addItem(index, 3, '')
elif s_type in [Type.Artist]:
self.addItem(index, 1, item.name)
self.addItem(index, 2, '')
self.addItem(index, 3, '')
self.c_tableInfo.viewport().update()
def download(self):
if self.c_tableInfo.selectionModel().hasSelection() == False:
self.__info__('Please select a row first.')
return
rows = self.c_tableInfo.selectionModel().selectedRows()
items = []
for row in rows:
items.append(self.s_array[row.row()])
tmpData = TIDAL_API.getTypeData(tmpId, tmpType)
if tmpData is None:
self.__info__('Url is wrong!')
return
self.s_type = tmpType
self.s_array = [tmpData]
self.s_result = None
self.c_combType.setCurrentText(tmpType.name)
else:
self.s_result = TIDAL_API.search(self.s_text, self.s_type)
self.s_array = TIDAL_API.getSearchResultItems(self.s_result, self.s_type)
self.__downloadFunc__(items)
if len(self.s_array) <= 0:
self.__info__('No result')
return
def __downloadFunc__(self, items):
self.c_btnDownload.setEnabled(False)
self.c_tableInfo.setRowCount(len(self.s_array))
for index, item in enumerate(self.s_array):
self.addItem(index, 0, str(index + 1))
if self.s_type in [Type.Album, Type.Track]:
self.addItem(index, 1, item.title)
self.addItem(index, 2, TIDAL_API.getArtistsName(item.artists))
self.addItem(index, 3, item.audioQuality)
elif self.s_type in [Type.Video]:
self.addItem(index, 1, item.title)
self.addItem(index, 2, TIDAL_API.getArtistsName(item.artists))
self.addItem(index, 3, item.quality)
elif self.s_type in [Type.Playlist]:
self.addItem(index, 1, item.title)
self.addItem(index, 2, '')
self.addItem(index, 3, '')
def download(self):
index = self.c_tableInfo.currentIndex().row()
if index < 0:
self.__info__('Please select a row first.')
return
self.c_btnDownload.setEnabled(False)
self.c_btnDownload.setText(f"Downloading [{self.s_array[index].title}]...")
def __thread_download__(model: MainView):
try:
def __thread_download__(model: MainView, items):
itemTitle = ''
type = model.s_type
item = model.s_array[index]
start_type(type, item)
model.s_downloadEnd.emit(item.title, True, '')
except Exception as e:
model.s_downloadEnd.emit(item.title, False, str(e))
try:
for item in items:
if isinstance(item, Artist):
itemTitle = item.name
else:
itemTitle = item.title
start_type(type, item)
model.s_downloadEnd.emit('Download Success!', True, '')
except Exception as e:
model.s_downloadEnd.emit(itemTitle, False, str(e))
_thread.start_new_thread(__thread_download__, (self, ))
_thread.start_new_thread(__thread_download__, (self, items))
def downloadEnd(self, title, result, msg):
self.c_btnDownload.setEnabled(True)
self.c_btnDownload.setText(f"Download")
def downloadEnd(self, title, result, msg):
self.c_btnDownload.setEnabled(True)
self.c_btnDownload.setText(f"Download")
if result:
self.__info__(f'Download [{title}] finish')
else:
self.__info__(f'Download [{title}] failed:{msg}')
if result:
self.__info__(f"Download finished.")
else:
self.__info__(f"Download '{title}' failed:{msg}")
def checkLogin(self):
if not loginByConfig():
self.__info__('Login failed. Please log in using the command line first.')
def checkLogin(self):
if not loginByConfig():
self.__info__('Login failed. Please log in using the command line first.')
else:
self.__showSelfPlaylists__()
def changeTQuality(self, index):
SETTINGS.audioQuality = self.c_combTQuality.itemData(index)
SETTINGS.save()
def startGui():
os.chdir(sys.path[0])
def changeVQuality(self, index):
SETTINGS.videoQuality = self.c_combVQuality.itemData(index)
SETTINGS.save()
app = QtWidgets.QApplication(sys.argv)
apply_stylesheet(app, theme='dark_blue.xml')
def __showSelfPlaylists__(self):
playlists = TIDAL_API.getPlaylistSelf()
window = MainView()
window.show()
window.checkLogin()
for playlist in playlists:
item = QtWidgets.QTreeWidgetItem(self.tree_playlists)
item.setText(0, playlist.title)
item.setText(1, str(playlist.numberOfTracks))
item.setText(2, playlist.uuid)
app.exec_()
def __displayTracks__(self, item, column):
tracks, videos = TIDAL_API.getItems(item.text(2), Type.Playlist)
self.s_array = tracks
self.s_type = Type.Track
self.setSearchResults(tracks, Type.Track)
def startGui():
aigpy.cmd.enableColor(False)
app = QtWidgets.QApplication(sys.argv)
apply_stylesheet(app, theme='dark_blue.xml')
window = MainView()
window.show()
window.checkLogin()
app.exec_()
if __name__ == '__main__':
SETTINGS.read(getProfilePath())
+12 -5
View File
@@ -30,17 +30,20 @@ class LangArabic(object):
SETTING_USE_PLAYLIST_FOLDER = "Use playlist folder"
SETTING_MULITHREAD_DOWNLOAD = "Multi thread download"
SETTING_ALBUM_FOLDER_FORMAT = "Album folder format"
SETTING_PLAYLIST_FOLDER_FORMAT = "Playlist folder format"
SETTING_TRACK_FILE_FORMAT = "Track file format"
SETTING_VIDEO_FILE_FORMAT = "Video file format"
SETTING_SHOW_PROGRESS = "Show progress"
SETTING_SHOW_TRACKINFO = "Show Track Info"
SETTING_SAVE_ALBUMINFO = "Save AlbumInfo.txt"
SETTING_DOWNLOAD_VIDEOS = "Download videos"
SETTING_ADD_LYRICS = "Add lyrics"
SETTING_LYRICS_SERVER_PROXY = "Lyrics server proxy"
SETTING_PATH = "Settings path"
SETTINGS_ADD_LRC_FILE = "Save timed lyrics (.lrc file)"
SETTING_ADD_LRC_FILE = "Save timed lyrics (.lrc file)"
SETTING_APIKEY = "APIKey support"
SETTING_ADD_TYPE_FOLDER = "Add Type-Folder"
SETTING_DOWNLOAD_DELAY = "Use Download Delay"
CHOICE = "خيار"
FUNCTION = "وظيفة"
@@ -65,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):"
@@ -78,16 +81,20 @@ class LangArabic(object):
CHANGE_ALBUMID_BEFORE_FOLDER = "اضف رقم التتبع قبل اسم مجلد الالبوم('0'-No,'1'-Yes):"
CHANGE_SAVE_COVERS = "حفظ صورة الالبوم('0'-No,'1'-Yes):"
CHANGE_LANGUAGE = "اختر لغة"
CHANGE_ALBUM_FOLDER_FORMAT = "Album folder format('0' not modify):"
CHANGE_TRACK_FILE_FORMAT = "Track file format('0' not modify):"
CHANGE_ALBUM_FOLDER_FORMAT = "Album folder format('0'-not modify,'default'-to set default):"
CHANGE_PLAYLIST_FOLDER_FORMAT = "Playlist folder format('0'-not modify,'default'-to set default):"
CHANGE_TRACK_FILE_FORMAT = "Track file format('0'-not modify,'default'-to set default):"
CHANGE_VIDEO_FILE_FORMAT = "Video file format('0'-not modify,'default'-to set default):"
CHANGE_SHOW_PROGRESS = "Show progress('0'-No,'1'-Yes):"
CHANGE_SHOW_TRACKINFO = "Show track info('0'-No,'1'-Yes):"
CHANGE_SAVE_ALBUM_INFO = "Save AlbumInfo.txt('0'-No,'1'-Yes):"
CHANGE_DOWNLOAD_VIDEOS = "Download videos (when downloading playlists, albums, mixes)('0'-No,'1'-Yes):"
CHANGE_ADD_LYRICS = "Add lyrics('0'-No,'1'-Yes):"
CHANGE_LYRICS_SERVER_PROXY = "Lyrics server proxy('0' not modify):"
CHANGE_LYRICS_SERVER_PROXY = "Lyrics server proxy('0'-not modify):"
CHANGE_ADD_LRC_FILE = "Save timed lyrics .lrc file ('0'-No,'1'-Yes):"
CHANGE_ADD_TYPE_FOLDER = "Add Type-Folder,eg Album/Video/Playlist('0'-No,'1'-Yes):"
CHANGE_MULITHREAD_DOWNLOAD = "Multi thread download('0'-No,'1'-Yes):"
CHANGE_USE_DOWNLOAD_DELAY = "Use Download Delay('0'-No,'1'-Yes):"
# {} are required in these strings
AUTH_START_LOGIN = "Starting login process..."
+15 -8
View File
@@ -30,29 +30,32 @@ class LangChinese(object):
SETTING_USE_PLAYLIST_FOLDER = "将歌单下载到歌单目录"
SETTING_MULITHREAD_DOWNLOAD = "多线程下载"
SETTING_ALBUM_FOLDER_FORMAT = "专辑目录格式"
SETTING_PLAYLIST_FOLDER_FORMAT = "Playlist folder format"
SETTING_TRACK_FILE_FORMAT = "歌曲文件名格式"
SETTING_VIDEO_FILE_FORMAT = "视频文件格式"
SETTING_SHOW_PROGRESS = "显示进度条"
SETTING_SHOW_TRACKINFO = "显示歌曲信息"
SETTING_SAVE_ALBUMINFO = "保存AlbumInfo.txt"
SETTING_DOWNLOAD_VIDEOS = "Download videos"
SETTING_ADD_LYRICS = "添加歌词"
SETTING_LYRICS_SERVER_PROXY = "歌词服务器代理"
SETTING_PATH = "Settings path"
SETTINGS_ADD_LRC_FILE = "Save timed lyrics (.lrc file)"
SETTING_ADD_LRC_FILE = "保存歌词文件 (.lrc file)"
SETTING_PATH = "配置文件目录"
SETTING_APIKEY = "APIKey支持"
SETTING_ADD_TYPE_FOLDER = "Add Type-Folder"
SETTING_ADD_TYPE_FOLDER = "添加类型文件夹"
SETTING_DOWNLOAD_DELAY = "Use Download Delay"
CHOICE = "选项"
FUNCTION = "功能"
CHOICE_ENTER = "输入"
CHOICE_ENTER_URLID = "输入 'Url或ID':"
CHOICE_EXIT = "退出"
CHOICE_LOGIN = "检查 AccessToken"
CHOICE_LOGIN = "检查AccessToken"
CHOICE_SETTINGS = "配置"
CHOICE_SET_ACCESS_TOKEN = "设置AccessToken"
CHOICE_DOWNLOAD_BY_URL = "通过链接或ID下载"
CHOICE_LOGOUT = "注销"
CHOICE_APIKEY = "Select APIKey"
CHOICE_APIKEY = "选择APIKey"
PRINT_ERR = "[错误]"
PRINT_INFO = "[提示]"
@@ -65,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'-是):"
@@ -79,15 +82,19 @@ class LangChinese(object):
CHANGE_SAVE_COVERS = "保存封面('0'-不,'1'-是):"
CHANGE_LANGUAGE = "选择语言"
CHANGE_ALBUM_FOLDER_FORMAT = "专辑目录格式('0' 不修改):"
CHANGE_PLAYLIST_FOLDER_FORMAT = "Playlist folder format('0'-not modify,'default'-to set default):"
CHANGE_TRACK_FILE_FORMAT = "歌曲文件名格式('0' 不修改):"
CHANGE_VIDEO_FILE_FORMAT = "Video file format('0'-not modify,'default'-to set default):"
CHANGE_VIDEO_FILE_FORMAT = "视频文件名格式('0'-not modify,'default'-to set default):"
CHANGE_SHOW_PROGRESS = "显示进度条('0'-不,'1'-是):"
CHANGE_SHOW_TRACKINFO = "显示歌曲信息('0'-否,'1'-是):"
CHANGE_SAVE_ALBUM_INFO = "保存AlbumInfo.txt('0'-否,'1'-是):"
CHANGE_DOWNLOAD_VIDEOS = "Download videos (when downloading playlists, albums, mixes)('0'-No,'1'-Yes):"
CHANGE_ADD_LYRICS = "添加歌词('0'-否,'1'-是):"
CHANGE_LYRICS_SERVER_PROXY = "歌词服务器代理('0' 不修改):"
CHANGE_ADD_LRC_FILE = "Save timed lyrics .lrc file ('0'-否,'1'-是):"
CHANGE_ADD_LRC_FILE = "保存歌词文件 ('0'-否,'1'-是):"
CHANGE_ADD_TYPE_FOLDER = "Add Type-Folder,eg Album/Video/Playlist('0'-No,'1'-Yes):"
CHANGE_MULITHREAD_DOWNLOAD = "多线程下载('0'-否,'1'-是):"
CHANGE_USE_DOWNLOAD_DELAY = "Use Download Delay('0'-No,'1'-Yes):"
# {} are required in these strings
AUTH_START_LOGIN = "开始启动登录..."
+12 -5
View File
@@ -30,17 +30,20 @@ class LangCroatian(object):
SETTING_USE_PLAYLIST_FOLDER = "Use playlist folder"
SETTING_MULITHREAD_DOWNLOAD = "Multi thread download"
SETTING_ALBUM_FOLDER_FORMAT = "Album folder format"
SETTING_PLAYLIST_FOLDER_FORMAT = "Playlist folder format"
SETTING_TRACK_FILE_FORMAT = "Track file format"
SETTING_VIDEO_FILE_FORMAT = "Video file format"
SETTING_SHOW_PROGRESS = "Show progress"
SETTING_SHOW_TRACKINFO = "Show Track Info"
SETTING_SAVE_ALBUMINFO = "Save AlbumInfo.txt"
SETTING_DOWNLOAD_VIDEOS = "Download videos"
SETTING_ADD_LYRICS = "Add lyrics"
SETTING_LYRICS_SERVER_PROXY = "Lyrics server proxy"
SETTING_ADD_LRC_FILE = "Save timed lyrics (.lrc file)"
SETTING_PATH = "Settings path"
SETTINGS_ADD_LRC_FILE = "Save timed lyrics (.lrc file)"
SETTING_APIKEY = "APIKey support"
SETTING_ADD_TYPE_FOLDER = "Add Type-Folder"
SETTING_DOWNLOAD_DELAY = "Use Download Delay"
CHOICE = "ODABIR"
FUNCTION = "FUNKCIJA"
@@ -65,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):"
@@ -78,16 +81,20 @@ class LangCroatian(object):
CHANGE_ALBUMID_BEFORE_FOLDER = "Dodaj ID oznaku prije imena albuma u datoteci('0'-Ne,'1'-Da):"
CHANGE_SAVE_COVERS = "Spremi ilustracije albuma('0'-Ne,'1'-Da):"
CHANGE_LANGUAGE = "Odaberi jezik"
CHANGE_ALBUM_FOLDER_FORMAT = "Album folder format('0' not modify):"
CHANGE_TRACK_FILE_FORMAT = "Track file format('0' not modify):"
CHANGE_ALBUM_FOLDER_FORMAT = "Album folder format('0'-not modify,'default'-to set default):"
CHANGE_PLAYLIST_FOLDER_FORMAT = "Playlist folder format('0'-not modify,'default'-to set default):"
CHANGE_TRACK_FILE_FORMAT = "Track file format('0'-not modify,'default'-to set default):"
CHANGE_VIDEO_FILE_FORMAT = "Video file format('0'-not modify,'default'-to set default):"
CHANGE_SHOW_PROGRESS = "Show progress('0'-No,'1'-Yes):"
CHANGE_SHOW_TRACKINFO = "Show track info('0'-No,'1'-Yes):"
CHANGE_SAVE_ALBUM_INFO = "Save AlbumInfo.txt('0'-No,'1'-Yes):"
CHANGE_DOWNLOAD_VIDEOS = "Download videos (when downloading playlists, albums, mixes)('0'-No,'1'-Yes):"
CHANGE_ADD_LYRICS = "Add lyrics('0'-No,'1'-Yes):"
CHANGE_LYRICS_SERVER_PROXY = "Lyrics server proxy('0' not modify):"
CHANGE_LYRICS_SERVER_PROXY = "Lyrics server proxy('0'-not modify):"
CHANGE_ADD_LRC_FILE = "Save timed lyrics .lrc file ('0'-No,'1'-Yes):"
CHANGE_ADD_TYPE_FOLDER = "Add Type-Folder,eg Album/Video/Playlist('0'-No,'1'-Yes):"
CHANGE_MULITHREAD_DOWNLOAD = "Multi thread download('0'-No,'1'-Yes):"
CHANGE_USE_DOWNLOAD_DELAY = "Use Download Delay('0'-No,'1'-Yes):"
# {} are required in these strings
AUTH_START_LOGIN = "Starting login process..."
+73 -66
View File
@@ -2,10 +2,10 @@
# -*- encoding: utf-8 -*-
'''
@File : czech.py
@Time : 2020/08/20
@Author : Tomikk
@Version : 1.0
@Contact : justtomikk@gmail.com
@Time : 2022/11/13
@Author : Tomikk & Sweder
@Version : 1.2
@Contact : justtomikk@gmail.com & djsweder@gmail.com
@Desc :
'''
@@ -15,46 +15,49 @@ class LangCzech(object):
VALUE = "Hodnota"
SETTING_DOWNLOAD_PATH = "Umístění staženého souboru"
SETTING_ONLY_M4A = "Konvertovat mp4 na m4a"
SETTING_ADD_EXPLICIT_TAG = "Přidat explicitní značku"
SETTING_ADD_HYPHEN = "Používat pomlčky místo mezer"
SETTING_ADD_EXPLICIT_TAG = "Přidat označení explicity"
SETTING_ADD_HYPHEN = "Místo mezer použít pomlčky"
SETTING_ADD_YEAR = "Přidat rok před jméno složky"
SETTING_USE_TRACK_NUM = "Přidat číslo skladby"
SETTING_AUDIO_QUALITY = "Kvalita hudby"
SETTING_VIDEO_QUALITY = "Kvalita videa"
SETTING_CHECK_EXIST = "Zkontrolovat jestli soubor již existuje"
SETTING_CHECK_EXIST = "Zkontrolovat existenci souboru"
SETTING_ARTIST_BEFORE_TITLE = "Jméno interpreta před jménem skladby"
SETTING_ALBUMID_BEFORE_FOLDER = "Id před složkou alba"
SETTING_INCLUDE_EP = "Zahrnout single&ep"
SETTING_INCLUDE_EP = "Zahrnout singly & EP"
SETTING_SAVE_COVERS = "Uložit obal alba"
SETTING_LANGUAGE = "Změna jazyka"
SETTING_USE_PLAYLIST_FOLDER = "Use playlist folder"
SETTING_MULITHREAD_DOWNLOAD = "Multi thread download"
SETTING_ALBUM_FOLDER_FORMAT = "Album folder format"
SETTING_TRACK_FILE_FORMAT = "Track file format"
SETTING_VIDEO_FILE_FORMAT = "Video file format"
SETTING_SHOW_PROGRESS = "Show progress"
SETTING_SHOW_TRACKINFO = "Show Track Info"
SETTING_SAVE_ALBUMINFO = "Save AlbumInfo.txt"
SETTING_ADD_LYRICS = "Add lyrics"
SETTING_LYRICS_SERVER_PROXY = "Lyrics server proxy"
SETTINGS_ADD_LRC_FILE = "Save timed lyrics (.lrc file)"
SETTING_PATH = "Settings path"
SETTING_APIKEY = "APIKey support"
SETTING_ADD_TYPE_FOLDER = "Add Type-Folder"
SETTING_USE_PLAYLIST_FOLDER = "Používat složku playlistu"
SETTING_MULITHREAD_DOWNLOAD = "Stahování více vlákny"
SETTING_ALBUM_FOLDER_FORMAT = "Formát názvu složky alba"
SETTING_PLAYLIST_FOLDER_FORMAT = "Playlist folder format"
SETTING_TRACK_FILE_FORMAT = "Formát názvu souboru skladby"
SETTING_VIDEO_FILE_FORMAT = "Formát názvu souboru videa"
SETTING_SHOW_PROGRESS = "Zobrazit indikátor stavu stahování"
SETTING_SHOW_TRACKINFO = "Zobrazit informace o skladbě"
SETTING_SAVE_ALBUMINFO = "Uložit soubor AlbumInfo.txt"
SETTING_DOWNLOAD_VIDEOS = "Download videos"
SETTING_ADD_LYRICS = "Přidat texty skladeb"
SETTING_LYRICS_SERVER_PROXY = "Server proxy pro texty skladeb"
SETTING_ADD_LRC_FILE = "Uložit slova skladby s časováním (soubor .lrc)"
SETTING_PATH = "Cesta k souboru s nastavením"
SETTING_APIKEY = "APIKey podporuje"
SETTING_ADD_TYPE_FOLDER = "Složky dle typu obsahu"
SETTING_DOWNLOAD_DELAY = "Stahovat s časovou prodlevou"
CHOICE = "Výběr"
FUNCTION = "Funkce"
CHOICE_ENTER = "Enter"
CHOICE_ENTER = "Zvolit"
CHOICE_ENTER_URLID = "Vložit 'Url/ID':"
CHOICE_EXIT = "Ukončit"
CHOICE_LOGIN = "Check AccessToken"
CHOICE_LOGIN = "Zkontrolovat přístupový token"
CHOICE_SETTINGS = "Nastavení"
CHOICE_SET_ACCESS_TOKEN = "Nastavit přístupový token"
CHOICE_DOWNLOAD_BY_URL = "Stáhnout buď url nebo id"
CHOICE_LOGOUT = "Logout"
CHOICE_APIKEY = "Select APIKey"
CHOICE_DOWNLOAD_BY_URL = "Stáhnout buď dle URL nebo ID"
CHOICE_LOGOUT = "Odhlásit"
CHOICE_APIKEY = "Vybrat APIKey"
PRINT_ERR = "[Error]"
PRINT_ERR = "[Chyba]"
PRINT_INFO = "[Info]"
PRINT_SUCCESS = "[Staženo]"
@@ -63,56 +66,60 @@ class LangCzech(object):
# PRINT_USERNAME = "přihlašovací jméno:"
# PRINT_PASSWORD = "heslo"
CHANGE_START_SETTINGS = "Start settings('0'-Zpět,'1'-Ano):"
CHANGE_DOWNLOAD_PATH = "Cesta stažení('0' not modify):"
CHANGE_AUDIO_QUALITY = "Kvalita hudby('0'-Normal,'1'-High,'2'-HiFi,'3'-Master):"
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 explicitní značku k souborům('0'-Ne,'1'-Ano):"
CHANGE_ADD_HYPHEN = "V názvech souborů používat místo mezer pomlčky('0'-Ne,'1'-Ano):"
CHANGE_ADD_YEAR = "Přidat rok vydání do názvu složky('0'-Ne,'1'-Ano):"
CHANGE_USE_TRACK_NUM = "Přidat číslo skladby před název skladby('0'-Ne,'1'-Ano):"
CHANGE_CHECK_EXIST = "Zkontrolovat existujicí soubor před stažením('0'-Ne,'1'-Ano):"
CHANGE_ARTIST_BEFORE_TITLE = "Přidat jméno interpreta před názvem skladby('0'-Ne,'1'-Ano):"
CHANGE_INCLUDE_EP = "Při stahování alba interpreta zahrnout singly a EP('0'-Ne,'1'-Ano):"
CHANGE_ALBUMID_BEFORE_FOLDER = "Přidat ID před složku do alba('0'-Ne,'1'-Ano):"
CHANGE_SAVE_COVERS = "Uložit obaly alb('0'-Ne,'1'-Ano):"
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,'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):"
CHANGE_ADD_HYPHEN = "V názvech souborů používat místo mezer pomlčky ('0'-Ne,'1'-Ano):"
CHANGE_ADD_YEAR = "Přidat rok vydání do názvu složky ('0'-Ne,'1'-Ano):"
CHANGE_USE_TRACK_NUM = "Přidat číslo skladby před název skladby ('0'-Ne,'1'-Ano):"
CHANGE_CHECK_EXIST = "Zkontrolovat existenci souboru před stažením ('0'-Ne,'1'-Ano):"
CHANGE_ARTIST_BEFORE_TITLE = "Přidat jméno interpreta před název skladby ('0'-Ne,'1'-Ano):"
CHANGE_INCLUDE_EP = "Při stahování alb interpreta zahrnout singly a EP ('0'-Ne,'1'-Ano):"
CHANGE_ALBUMID_BEFORE_FOLDER = "Přidat ID před název složky s albem ('0'-Ne,'1'-Ano):"
CHANGE_SAVE_COVERS = "Uložit obaly alb ('0'-Ne,'1'-Ano):"
CHANGE_LANGUAGE = "Zvolit jazyk"
CHANGE_ALBUM_FOLDER_FORMAT = "Album folder format('0' not modify):"
CHANGE_TRACK_FILE_FORMAT = "Track file format('0' not modify):"
CHANGE_VIDEO_FILE_FORMAT = "Video file format('0'-not modify,'default'-to set default):"
CHANGE_SHOW_PROGRESS = "Show progress('0'-No,'1'-Yes):"
CHANGE_SHOW_TRACKINFO = "Show track info('0'-No,'1'-Yes):"
CHANGE_SAVE_ALBUM_INFO = "Save AlbumInfo.txt('0'-No,'1'-Yes):"
CHANGE_ADD_LYRICS = "Add lyrics('0'-No,'1'-Yes):"
CHANGE_LYRICS_SERVER_PROXY = "Lyrics server proxy('0' not modify):"
CHANGE_ADD_LRC_FILE = "Save timed lyrics .lrc file ('0'-No,'1'-Yes):"
CHANGE_ADD_TYPE_FOLDER = "Add Type-Folder,eg Album/Video/Playlist('0'-No,'1'-Yes):"
CHANGE_ALBUM_FOLDER_FORMAT = "Formát názvu složky alba ('0' beze změny):"
CHANGE_PLAYLIST_FOLDER_FORMAT = "Playlist folder format('0'-not modify,'default'-to set default):"
CHANGE_TRACK_FILE_FORMAT = "Formát názvu složky skladny ('0' beze změny):"
CHANGE_VIDEO_FILE_FORMAT = "Formát názvu souboru videa ('0'-beze změny,'default'-pro nastavení výchozího názvu):"
CHANGE_SHOW_PROGRESS = "Zobrazit indikátor stavu stahování ('0'-Ne,'1'-Ano):"
CHANGE_SHOW_TRACKINFO = "Zobrazit info o skladbě ('0'-Ne,'1'-Ano):"
CHANGE_SAVE_ALBUM_INFO = "Uložit soubor AlbumInfo.txt ('0'-Ne,'1'-Ano):"
CHANGE_DOWNLOAD_VIDEOS = "Download videos (when downloading playlists, albums, mixes)('0'-No,'1'-Yes):"
CHANGE_ADD_LYRICS = "Přidat texty skladeb ('0'-Ne,'1'-Ano):"
CHANGE_LYRICS_SERVER_PROXY = "Server proxy pro texty skladeb ('0' beze změny):"
CHANGE_ADD_LRC_FILE = "Uložit slova skladby s časováním do souboru .lrc) ('0'-Ne,'1'-Ano):"
CHANGE_ADD_TYPE_FOLDER = "Ukládat do složek dle typu obsahu, např. Album/Video/Playlist ('0'-Ne,'1'-Ano):"
CHANGE_MULITHREAD_DOWNLOAD = "Více vláken pro stahování ('0'-Ne,'1'-Ano):"
CHANGE_USE_DOWNLOAD_DELAY = "Stahovat s časovou prodlevou('0'-Ne,'1'-Ano):"
# {} are required in these strings
AUTH_START_LOGIN = "Starting login process..."
AUTH_LOGIN_CODE = "Your login code is {}"
AUTH_NEXT_STEP = "Go to {} within the next {} to complete setup."
AUTH_WAITING = "Waiting for authorization..."
AUTH_TIMEOUT = "Operation timed out."
AUTH_START_LOGIN = "Spouštění přihlašovacího procesu..."
AUTH_LOGIN_CODE = "Váš přihlašovací kód je {}"
AUTH_NEXT_STEP = "K dokončení nastavení přejděte na stránku {} během následujích {}."
AUTH_WAITING = "Čeká se na autorizaci..."
AUTH_TIMEOUT = "Vypršel časový limit procesu."
MSG_VALID_ACCESSTOKEN = "AccessToken good for {}."
MSG_INVALID_ACCESSTOKEN = "Expired AccessToken. Attempting to refresh it."
MSG_VALID_ACCESSTOKEN = "Přístupový token fukční pro {}."
MSG_INVALID_ACCESSTOKEN = "Platnost přístupového tokenu vypršela. Pokouším se o obnovení."
MSG_PATH_ERR = "Cesta neexistuje!"
MSG_INPUT_ERR = "Chyba vstupu!"
MSG_INPUT_ERR = "Chyba zadání!"
MODEL_ALBUM_PROPERTY = "ALBUM-PROPERTY"
MODEL_TRACK_PROPERTY = "TRACK-PROPERTY"
MODEL_VIDEO_PROPERTY = "VIDEO-PROPERTY"
MODEL_ARTIST_PROPERTY = "ARTIST-PROPERTY"
MODEL_PLAYLIST_PROPERTY = "PLAYLIST-PROPERTY"
MODEL_ALBUM_PROPERTY = "ALBUM-VLASTNOSTI"
MODEL_TRACK_PROPERTY = "SKLADBA-VLASTNOSTI"
MODEL_VIDEO_PROPERTY = "VIDEO-VLASTNOSTI"
MODEL_ARTIST_PROPERTY = "INTERPRET-VLASTNOSTI"
MODEL_PLAYLIST_PROPERTY = "PLAYLIST-VLASTNOSTI"
MODEL_TITLE = 'Název skladby'
MODEL_TRACK_NUMBER = 'Číslo skladby'
MODEL_VIDEO_NUMBER = 'Číslo videa'
MODEL_RELEASE_DATE = 'Datum vydání'
MODEL_VERSION = 'Verze'
MODEL_EXPLICIT = 'Explicit'
MODEL_EXPLICIT = 'Explicitní'
MODEL_ALBUM = 'Album'
MODEL_ID = 'ID'
MODEL_NAME = 'Jméno'
+10 -3
View File
@@ -30,17 +30,20 @@ class LangDanish(object):
SETTING_USE_PLAYLIST_FOLDER = "Brug afspilningsmappen"
SETTING_MULITHREAD_DOWNLOAD = "Flertråede download"
SETTING_ALBUM_FOLDER_FORMAT = "Albummappens format"
SETTING_PLAYLIST_FOLDER_FORMAT = "Spillelistemappens format"
SETTING_TRACK_FILE_FORMAT = "Musiknummerets filformat"
SETTING_VIDEO_FILE_FORMAT = "Video file format"
SETTING_SHOW_PROGRESS = "Vis fremskridt"
SETTING_SHOW_TRACKINFO = "Show Track Info"
SETTING_SAVE_ALBUMINFO = "Save AlbumInfo.txt"
SETTING_DOWNLOAD_VIDEOS = "Download videos"
SETTING_ADD_LYRICS = "Add lyrics"
SETTING_LYRICS_SERVER_PROXY = "Lyrics server proxy"
SETTING_ADD_LRC_FILE = "Save timed lyrics (.lrc file)"
SETTING_PATH = "Settings path"
SETTINGS_ADD_LRC_FILE = "Save timed lyrics (.lrc file)"
SETTING_APIKEY = "APIKey support"
SETTING_ADD_TYPE_FOLDER = "Add Type-Folder"
SETTING_DOWNLOAD_DELAY = "Use Download Delay"
CHOICE = "VALG"
FUNCTION = "FUNKTION"
@@ -65,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):"
@@ -79,15 +82,19 @@ class LangDanish(object):
CHANGE_SAVE_COVERS = "Gem omslag('0'-Nej,'1'-Ja):"
CHANGE_LANGUAGE = "Vælg sprog"
CHANGE_ALBUM_FOLDER_FORMAT = "Albummappeformat('0' Ændrer ikke, 'default' for at indstille som standard):"
CHANGE_PLAYLIST_FOLDER_FORMAT = "Spillelistemappeformat('0' Ændrer ikke, 'default' for at indstille som standard):"
CHANGE_TRACK_FILE_FORMAT = "Musiknummerets filformat('0' Ændrer ikke, 'default' for at indstille som standard):"
CHANGE_VIDEO_FILE_FORMAT = "Video file format('0'-not modify,'default'-to set default):"
CHANGE_SHOW_PROGRESS = "Vis fremskridt('0'-Nej,'1'-Ja):"
CHANGE_SHOW_TRACKINFO = "Show track info('0'-No,'1'-Yes):"
CHANGE_SAVE_ALBUM_INFO = "Save AlbumInfo.txt('0'-No,'1'-Yes):"
CHANGE_DOWNLOAD_VIDEOS = "Download videos (when downloading playlists, albums, mixes)('0'-No,'1'-Yes):"
CHANGE_ADD_LYRICS = "Add lyrics('0'-No,'1'-Yes):"
CHANGE_LYRICS_SERVER_PROXY = "Lyrics server proxy('0' not modify):"
CHANGE_LYRICS_SERVER_PROXY = "Lyrics server proxy('0'-not modify):"
CHANGE_ADD_LRC_FILE = "Save timed lyrics .lrc file ('0'-No,'1'-Yes):"
CHANGE_ADD_TYPE_FOLDER = "Add Type-Folder,eg Album/Video/Playlist('0'-No,'1'-Yes):"
CHANGE_MULITHREAD_DOWNLOAD = "Multi thread download('0'-No,'1'-Yes):"
CHANGE_USE_DOWNLOAD_DELAY = "Use Download Delay('0'-No,'1'-Yes):"
# {} are required in these strings
AUTH_START_LOGIN = "Starter login-processen."
+12 -5
View File
@@ -30,17 +30,20 @@ class LangDutch(object):
SETTING_USE_PLAYLIST_FOLDER = "Afspeellijst gebruiken"
SETTING_MULITHREAD_DOWNLOAD = "Downloaden met meerdere threads"
SETTING_ALBUM_FOLDER_FORMAT = "Indeling albummap"
SETTING_PLAYLIST_FOLDER_FORMAT = "Playlist folder format"
SETTING_TRACK_FILE_FORMAT = "Bestandsindeling bijhouden"
SETTING_VIDEO_FILE_FORMAT = "Videobestandsindeling"
SETTING_SHOW_PROGRESS = "Toon voortgang"
SETTING_SHOW_TRACKINFO = "Toon trackinfo"
SETTING_SAVE_ALBUMINFO = "AlbumInfo.txt opslaan"
SETTING_DOWNLOAD_VIDEOS = "Download videos"
SETTING_ADD_LYRICS = "Songtekst toevoegen"
SETTING_LYRICS_SERVER_PROXY = "Tekst server proxy"
SETTINGS_ADD_LRC_FILE = "Getimede songteksten opslaan (.lrc-bestand)"
SETTING_ADD_LRC_FILE = "Getimede songteksten opslaan (.lrc-bestand)"
SETTING_PATH = "Instellingen pad"
SETTING_APIKEY = "APIKey-ondersteuning"
SETTING_ADD_TYPE_FOLDER = "Typemap toevoegen"
SETTING_DOWNLOAD_DELAY = "Use Download Delay"
CHOICE = "KEUZE"
FUNCTION = "FUNCTIE"
@@ -65,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):"
@@ -78,16 +81,20 @@ class LangDutch(object):
CHANGE_ALBUMID_BEFORE_FOLDER = "ID toevoegen voor albummap ('0'-Nee,'1'-Ja):"
CHANGE_SAVE_COVERS = "Covers opslaan('0'-Nee,'1'-Ja):"
CHANGE_LANGUAGE = "Selecteer taal"
CHANGE_ALBUM_FOLDER_FORMAT = "Albummapindeling ('0'-niet wijzigen,'standaard'-om standaard in te stellen):"
CHANGE_TRACK_FILE_FORMAT = "Bestandsformaat bijhouden ('0'-niet wijzigen,'standaard'-om standaard in te stellen):"
CHANGE_VIDEO_FILE_FORMAT = "Videobestandsindeling('0'-niet wijzigen,'standaard'-om standaard in te stellen):"
CHANGE_ALBUM_FOLDER_FORMAT = "Albummapindeling ('0'-niet wijzigen,'default'-om standaard in te stellen):"
CHANGE_PLAYLIST_FOLDER_FORMAT = "Afspeellijstmapindeling format('0'-niet wijzigen,'default'-om standaard in te stellen):"
CHANGE_TRACK_FILE_FORMAT = "Bestandsformaat bijhouden ('0'-niet wijzigen,'default'-om standaard in te stellen):"
CHANGE_VIDEO_FILE_FORMAT = "Videobestandsindeling('0'-niet wijzigen,'default'-om standaard in te stellen):"
CHANGE_SHOW_PROGRESS = "Voortgang weergeven('0'-Nee,'1'-Ja):"
CHANGE_SHOW_TRACKINFO = "Toon trackinfo('0'-Nee,'1'-Ja):"
CHANGE_SAVE_ALBUM_INFO = "Bewaar AlbumInfo.txt('0'-Nee,'1'-Ja):"
CHANGE_DOWNLOAD_VIDEOS = "Download videos (when downloading playlists, albums, mixes)('0'-No,'1'-Yes):"
CHANGE_ADD_LYRICS = "Songtekst toevoegen('0'-Nee,'1'-Ja):"
CHANGE_LYRICS_SERVER_PROXY = "Songtekst proxyserver('0'-niet wijzigen):"
CHANGE_ADD_LRC_FILE = "Sla getimede songtekst .lrc-bestand op ('0'-Nee,'1'-Ja):"
CHANGE_ADD_TYPE_FOLDER = "Type-map toevoegen, bijv. Album/Video/Playlist('0'-Nee,'1'-Ja):"
CHANGE_MULITHREAD_DOWNLOAD = "Multi thread download('0'-No,'1'-Yes):"
CHANGE_USE_DOWNLOAD_DELAY = "Use Download Delay('0'-No,'1'-Yes):"
# {} are required in these strings
AUTH_START_LOGIN = "Inlogproces starten..."
+9 -2
View File
@@ -30,17 +30,20 @@ class LangEnglish(object):
SETTING_USE_PLAYLIST_FOLDER = "Use playlist folder"
SETTING_MULITHREAD_DOWNLOAD = "Multi thread download"
SETTING_ALBUM_FOLDER_FORMAT = "Album folder format"
SETTING_PLAYLIST_FOLDER_FORMAT = "Playlist folder format"
SETTING_TRACK_FILE_FORMAT = "Track file format"
SETTING_VIDEO_FILE_FORMAT = "Video file format"
SETTING_SHOW_PROGRESS = "Show progress"
SETTING_SHOW_TRACKINFO = "Show Track Info"
SETTING_SAVE_ALBUMINFO = "Save AlbumInfo.txt"
SETTING_DOWNLOAD_VIDEOS = "Download videos"
SETTING_ADD_LYRICS = "Add lyrics"
SETTING_LYRICS_SERVER_PROXY = "Lyrics server proxy"
SETTINGS_ADD_LRC_FILE = "Save timed lyrics (.lrc file)"
SETTING_ADD_LRC_FILE = "Save timed lyrics (.lrc file)"
SETTING_PATH = "Settings path"
SETTING_APIKEY = "APIKey support"
SETTING_ADD_TYPE_FOLDER = "Add Type-Folder"
SETTING_DOWNLOAD_DELAY = "Use Download Delay"
CHOICE = "CHOICE"
FUNCTION = "FUNCTION"
@@ -65,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):"
@@ -79,15 +82,19 @@ class LangEnglish(object):
CHANGE_SAVE_COVERS = "Save covers('0'-No,'1'-Yes):"
CHANGE_LANGUAGE = "Select language"
CHANGE_ALBUM_FOLDER_FORMAT = "Album folder format('0'-not modify,'default'-to set default):"
CHANGE_PLAYLIST_FOLDER_FORMAT = "Playlist folder format('0'-not modify,'default'-to set default):"
CHANGE_TRACK_FILE_FORMAT = "Track file format('0'-not modify,'default'-to set default):"
CHANGE_VIDEO_FILE_FORMAT = "Video file format('0'-not modify,'default'-to set default):"
CHANGE_SHOW_PROGRESS = "Show progress('0'-No,'1'-Yes):"
CHANGE_SHOW_TRACKINFO = "Show track info('0'-No,'1'-Yes):"
CHANGE_SAVE_ALBUM_INFO = "Save AlbumInfo.txt('0'-No,'1'-Yes):"
CHANGE_DOWNLOAD_VIDEOS = "Download videos (when downloading playlists, albums, mixes)('0'-No,'1'-Yes):"
CHANGE_ADD_LYRICS = "Add lyrics('0'-No,'1'-Yes):"
CHANGE_LYRICS_SERVER_PROXY = "Lyrics server proxy('0'-not modify):"
CHANGE_ADD_LRC_FILE = "Save timed lyrics .lrc file ('0'-No,'1'-Yes):"
CHANGE_ADD_TYPE_FOLDER = "Add Type-Folder,eg Album/Video/Playlist('0'-No,'1'-Yes):"
CHANGE_MULITHREAD_DOWNLOAD = "Multi thread download('0'-No,'1'-Yes):"
CHANGE_USE_DOWNLOAD_DELAY = "Use Download Delay('0'-No,'1'-Yes):"
# {} are required in these strings
AUTH_START_LOGIN = "Starting login process..."
+12 -5
View File
@@ -30,17 +30,20 @@ class LangFilipino(object):
SETTING_USE_PLAYLIST_FOLDER = "Use playlist folder"
SETTING_MULITHREAD_DOWNLOAD = "Multi thread download"
SETTING_ALBUM_FOLDER_FORMAT = "Album folder format"
SETTING_PLAYLIST_FOLDER_FORMAT = "Playlist folder format"
SETTING_TRACK_FILE_FORMAT = "Track file format"
SETTING_VIDEO_FILE_FORMAT = "Video file format"
SETTING_SHOW_PROGRESS = "Show progress"
SETTING_SHOW_TRACKINFO = "Show Track Info"
SETTING_SAVE_ALBUMINFO = "Save AlbumInfo.txt"
SETTING_DOWNLOAD_VIDEOS = "Download videos"
SETTING_ADD_LYRICS = "Add lyrics"
SETTING_LYRICS_SERVER_PROXY = "Lyrics server proxy"
SETTING_ADD_LRC_FILE = "Save timed lyrics (.lrc file)"
SETTING_PATH = "Settings path"
SETTINGS_ADD_LRC_FILE = "Save timed lyrics (.lrc file)"
SETTING_APIKEY = "APIKey support"
SETTING_ADD_TYPE_FOLDER = "Add Type-Folder"
SETTING_DOWNLOAD_DELAY = "Use Download Delay"
CHOICE = "PAGPIPILIAN"
FUNCTION = "SILBI"
@@ -65,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):"
@@ -78,16 +81,20 @@ class LangFilipino(object):
CHANGE_ALBUMID_BEFORE_FOLDER = "Lagyan ng id bago ang album folder('0'-Hindi,'1'-Oo):"
CHANGE_SAVE_COVERS = "I-save ang mga covers('0'-Hindi,'1'-Oo):"
CHANGE_LANGUAGE = "Pumili ng lenggwahe"
CHANGE_ALBUM_FOLDER_FORMAT = "Album folder format('0' not modify):"
CHANGE_TRACK_FILE_FORMAT = "Track file format('0' not modify):"
CHANGE_ALBUM_FOLDER_FORMAT = "Album folder format('0' not modify,'default'-to set default):"
CHANGE_PLAYLIST_FOLDER_FORMAT = "Playlist folder format('0'-not modify,'default'-to set default):"
CHANGE_TRACK_FILE_FORMAT = "Track file format('0' not modify,'default'-to set default):"
CHANGE_VIDEO_FILE_FORMAT = "Video file format('0'-not modify,'default'-to set default):"
CHANGE_SHOW_PROGRESS = "Show progress('0'-No,'1'-Yes):"
CHANGE_SHOW_TRACKINFO = "Show track info('0'-No,'1'-Yes):"
CHANGE_SAVE_ALBUM_INFO = "Save AlbumInfo.txt('0'-No,'1'-Yes):"
CHANGE_DOWNLOAD_VIDEOS = "Download videos (when downloading playlists, albums, mixes)('0'-No,'1'-Yes):"
CHANGE_ADD_LYRICS = "Add lyrics('0'-No,'1'-Yes):"
CHANGE_LYRICS_SERVER_PROXY = "Lyrics server proxy('0' not modify):"
CHANGE_LYRICS_SERVER_PROXY = "Lyrics server proxy('0'-not modify):"
CHANGE_ADD_LRC_FILE = "Save timed lyrics .lrc file ('0'-No,'1'-Yes):"
CHANGE_ADD_TYPE_FOLDER = "Add Type-Folder,eg Album/Video/Playlist('0'-No,'1'-Yes):"
CHANGE_MULITHREAD_DOWNLOAD = "Multi thread download('0'-No,'1'-Yes):"
CHANGE_USE_DOWNLOAD_DELAY = "Use Download Delay('0'-No,'1'-Yes):"
# {} are required in these strings
AUTH_START_LOGIN = "Starting login process..."
+32 -25
View File
@@ -30,29 +30,32 @@ class LangFrench(object):
SETTING_USE_PLAYLIST_FOLDER = "Utiliser dossier de playlist"
SETTING_MULITHREAD_DOWNLOAD = "Téléchargement multithread"
SETTING_ALBUM_FOLDER_FORMAT = "Format du dossier d'album"
SETTING_PLAYLIST_FOLDER_FORMAT = "Playlist folder format"
SETTING_TRACK_FILE_FORMAT = "Format du fichier de tracklist"
SETTING_VIDEO_FILE_FORMAT = "Video file format"
SETTING_SHOW_PROGRESS = "Afficher la Progression"
SETTING_SHOW_TRACKINFO = "Show Track Info"
SETTING_SAVE_ALBUMINFO = "Save AlbumInfo.txt"
SETTING_ADD_LYRICS = "Add lyrics"
SETTING_LYRICS_SERVER_PROXY = "Lyrics server proxy"
SETTING_PATH = "Settings path"
SETTINGS_ADD_LRC_FILE = "Save timed lyrics (.lrc file)"
SETTING_APIKEY = "APIKey support"
SETTING_ADD_TYPE_FOLDER = "Add Type-Folder"
SETTING_SHOW_TRACKINFO = "Afficher les information de la musique"
SETTING_SAVE_ALBUMINFO = "Enregistrer AlbumInfo.txt"
SETTING_DOWNLOAD_VIDEOS = "Download videos"
SETTING_ADD_LYRICS = "Inclure les paroles"
SETTING_LYRICS_SERVER_PROXY = "Proxy du serveur de paroles"
SETTING_ADD_LRC_FILE = "Enregistrer les paroles synchronisées (fichier .lrc)"
SETTING_PATH = "Emplacement des paramètres"
SETTING_APIKEY = "Prise en charge de la clé API"
SETTING_ADD_TYPE_FOLDER = "Ajouter un dossier de type"
SETTING_DOWNLOAD_DELAY = "Use Download Delay"
CHOICE = "CHOIX"
FUNCTION = "FONCTION"
CHOICE_ENTER = "Saisir"
CHOICE_ENTER_URLID = "Saisir 'Url/ID':"
CHOICE_EXIT = "Quitter"
CHOICE_LOGIN = "Check AccessToken"
CHOICE_LOGIN = "Vérifier le token d'accès"
CHOICE_SETTINGS = "Réglages"
CHOICE_SET_ACCESS_TOKEN = "Définir le jeton d'accès"
CHOICE_DOWNLOAD_BY_URL = "Téléchargement par url ou id"
CHOICE_LOGOUT = "Logout"
CHOICE_APIKEY = "Select APIKey"
CHOICE_LOGOUT = "Déconnexion"
CHOICE_APIKEY = "Choisir la clé d'API"
PRINT_ERR = "[ERR]"
PRINT_INFO = "[INFO]"
@@ -65,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):"
@@ -79,25 +82,29 @@ class LangFrench(object):
CHANGE_SAVE_COVERS = "Sauvegarder les couvertures('0'-Non,'1'-Oui):"
CHANGE_LANGUAGE = "Sélectionnez une langue"
CHANGE_ALBUM_FOLDER_FORMAT = "Format du dossier d'album('0' ne pas modifier):"
CHANGE_PLAYLIST_FOLDER_FORMAT = "Playlist folder format('0'-not modify,'default'-to set default):"
CHANGE_TRACK_FILE_FORMAT = "Format du fichier de tracklist('0' ne pas modifier):"
CHANGE_VIDEO_FILE_FORMAT = "Video file format('0'-not modify,'default'-to set default):"
CHANGE_SHOW_PROGRESS = "Afficher la progression('0'-Non,'1'-Oui):"
CHANGE_SHOW_TRACKINFO = "Show track info('0'-No,'1'-Yes):"
CHANGE_SAVE_ALBUM_INFO = "Save AlbumInfo.txt('0'-No,'1'-Yes):"
CHANGE_ADD_LYRICS = "Add lyrics('0'-No,'1'-Yes):"
CHANGE_LYRICS_SERVER_PROXY = "Lyrics server proxy('0' not modify):"
CHANGE_ADD_LRC_FILE = "Save timed lyrics .lrc file ('0'-No,'1'-Yes):"
CHANGE_ADD_TYPE_FOLDER = "Add Type-Folder,eg Album/Video/Playlist('0'-No,'1'-Yes):"
CHANGE_SHOW_TRACKINFO = "Afficher les information de la piste ('0'-Non,'1'-Oui):"
CHANGE_SAVE_ALBUM_INFO = "Enregistrer AlbumInfo.txt('0'-Non,'1'-Oui):"
CHANGE_DOWNLOAD_VIDEOS = "Download videos (when downloading playlists, albums, mixes)('0'-No,'1'-Yes):"
CHANGE_ADD_LYRICS = "Ajouter les paroles ('0'-Non,'1'-Oui):"
CHANGE_LYRICS_SERVER_PROXY = "Proxy du serveur de paroles('0'-not modify):"
CHANGE_ADD_LRC_FILE = "Enregistrer les paroles synchronisées (fichier.lrc) ('0'-Non,'1'-Oui):"
CHANGE_ADD_TYPE_FOLDER = "Ajouter un dossier de type,Ex: Album/Video/Playlist('0'-Non,'1'-Oui):"
CHANGE_MULITHREAD_DOWNLOAD = "Multi thread download('0'-Non,'1'-Oui):"
CHANGE_USE_DOWNLOAD_DELAY = "Use Download Delay('0'-No,'1'-Yes):"
# {} are required in these strings
AUTH_START_LOGIN = "Starting login process..."
AUTH_LOGIN_CODE = "Your login code is {}"
AUTH_NEXT_STEP = "Go to {} within the next {} to complete setup."
AUTH_WAITING = "Waiting for authorization..."
AUTH_TIMEOUT = "Operation timed out."
AUTH_START_LOGIN = "Démarrage du processus de connexion..."
AUTH_LOGIN_CODE = "Votre code de connection est le suivant: {}"
AUTH_NEXT_STEP = "Allez à {} avant {} pour finir la configuration."
AUTH_WAITING = "En attente d'autorisation..."
AUTH_TIMEOUT = "Temps écoulé."
MSG_VALID_ACCESSTOKEN = "AccessToken good for {}."
MSG_INVALID_ACCESSTOKEN = "Expired AccessToken. Attempting to refresh it."
MSG_VALID_ACCESSTOKEN = "Token d'accès valable {}."
MSG_INVALID_ACCESSTOKEN = "Token d'accès expiré. Tentative de renouvellement automatique."
MSG_PATH_ERR = "Erreur du chemin d'accès"
MSG_INPUT_ERR = "Erreur de saisie !"
+48 -41
View File
@@ -2,9 +2,9 @@
# -*- encoding: utf-8 -*-
'''
@File : german.py
@Time : 2021/01/04
@Authors : Sematre, MineClashTV
@Version : 1.0
@Time : 2022/11/8
@Authors : Sematre, MineClashTV, Click1701
@Version : 1.1
@Contact :
@Desc :
'''
@@ -24,23 +24,26 @@ class LangGerman(object):
SETTING_CHECK_EXIST = "Existenz überprüfen"
SETTING_ARTIST_BEFORE_TITLE = "Künstlername vor Songtitel"
SETTING_ALBUMID_BEFORE_FOLDER = "ID vor Album-Ordner"
SETTING_INCLUDE_EP = "Einschließlich single&ep"
SETTING_INCLUDE_EP = "Singles & EPs einschließen"
SETTING_SAVE_COVERS = "Cover speichern"
SETTING_LANGUAGE = "Sprache"
SETTING_USE_PLAYLIST_FOLDER = "Playlist-Ordner verwenden"
SETTING_MULITHREAD_DOWNLOAD = "Multi-Thread-Download"
SETTING_MULITHREAD_DOWNLOAD = "Multi-Thread Download"
SETTING_ALBUM_FOLDER_FORMAT = "Album-Ordnerformat"
SETTING_PLAYLIST_FOLDER_FORMAT = "Playlist-Ordnerformat"
SETTING_TRACK_FILE_FORMAT = "Track-Dateiformat"
SETTING_VIDEO_FILE_FORMAT = "Video file format"
SETTING_VIDEO_FILE_FORMAT = "Video-Dateiformat"
SETTING_SHOW_PROGRESS = "Fortschritt anzeigen"
SETTING_SHOW_TRACKINFO = "Show Track Info"
SETTING_SAVE_ALBUMINFO = "Save AlbumInfo.txt"
SETTING_ADD_LYRICS = "Add lyrics"
SETTING_LYRICS_SERVER_PROXY = "Lyrics server proxy"
SETTING_PATH = "Settings path"
SETTINGS_ADD_LRC_FILE = "Save timed lyrics (.lrc file)"
SETTING_APIKEY = "APIKey support"
SETTING_ADD_TYPE_FOLDER = "Add Type-Folder"
SETTING_SHOW_TRACKINFO = "Titelinformationen anzeigen"
SETTING_SAVE_ALBUMINFO = "AlbumInfo.txt speichern"
SETTING_DOWNLOAD_VIDEOS = "Download videos"
SETTING_ADD_LYRICS = "Songtexte hinzufügen"
SETTING_LYRICS_SERVER_PROXY = "Songtext Proxy-Server"
SETTING_ADD_LRC_FILE = "Songtext mit Zeitcode speichern (.lrc Datei)"
SETTING_PATH = "Speicherort der Einstellungen"
SETTING_APIKEY = "APIKey Unterstützung"
SETTING_ADD_TYPE_FOLDER = "Unterordner für jede Kategorie erstellen"
SETTING_DOWNLOAD_DELAY = "Downloads zeitverzögert starten"
CHOICE = "AUSWAHL"
FUNCTION = "FUNKTION"
@@ -50,9 +53,9 @@ class LangGerman(object):
CHOICE_LOGIN = "AccessToken überprüfen"
CHOICE_SETTINGS = "Einstellungen"
CHOICE_SET_ACCESS_TOKEN = "AccessToken setzen"
CHOICE_DOWNLOAD_BY_URL = "Herunterladen per URL oder ID"
CHOICE_LOGOUT = "Logout"
CHOICE_APIKEY = "Select APIKey"
CHOICE_DOWNLOAD_BY_URL = "Download per URL oder ID"
CHOICE_LOGOUT = "Ausloggen"
CHOICE_APIKEY = "APIKey Auswahl"
PRINT_ERR = "[FEHLER]"
PRINT_INFO = "[INFO]"
@@ -63,41 +66,45 @@ class LangGerman(object):
# PRINT_USERNAME = "Benutzername:"
# PRINT_PASSWORD = "Passwort:"
CHANGE_START_SETTINGS = "Einstellungen starten ('0'-Zurück,'1'-Ja):"
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):"
CHANGE_ADD_HYPHEN = "Verwende Bindestriche statt Leerzeichen im Dateinamen ('0'-Nein,'1'-Ja):"
CHANGE_ADD_YEAR = "Jahr zu Album-Ordnernamen hinzufügen ('0'-Nein,'1'-Ja):"
CHANGE_USE_TRACK_NUM = "Titelnummer vor Dateinamen hinzufügen ('0'-Nein,'1'-Ja):"
CHANGE_CHECK_EXIST = "Vor dem Download überprüfen, ob die Datei existiert ('0'-Nein,'1'-Ja):"
CHANGE_ARTIST_BEFORE_TITLE = "Künstlername vor den Songtitel hinzufügen ('0'-Nein,'1'-Ja):"
CHANGE_INCLUDE_EP = "Singles und EPs beim Download von Alben eines Künstlers einbeziehen ('0'-Nein,'1'-Ja):"
CHANGE_ALBUMID_BEFORE_FOLDER = "ID vor Album-Ordner hinzufügen ('0'-Nein,'1'-Ja):"
CHANGE_SAVE_COVERS = "Cover speichern ('0'-Nein,'1'-Ja):"
CHANGE_ONLYM4A = "mp4 in m4a konvertieren ('0'-Nein, '1'-Ja):"
CHANGE_ADD_EXPLICIT_TAG = "Explicit Tag zum Dateiname hinzufügen ('0'-Nein, '1'-Ja):"
CHANGE_ADD_HYPHEN = "Im Dateinamen Bindestriche statt Leerzeichen verwenden ('0'-Nein, '1'-Ja):"
CHANGE_ADD_YEAR = "Jahr zu Album-Ordnernamen hinzufügen ('0'-Nein, '1'-Ja):"
CHANGE_USE_TRACK_NUM = "Titelnummer vor Dateinamen hinzufügen ('0'-Nein, '1'-Ja):"
CHANGE_CHECK_EXIST = "Vor dem Download überprüfen, ob die Datei existiert ('0'-Nein, '1'-Ja):"
CHANGE_ARTIST_BEFORE_TITLE = "Künstlername vor den Songtitel hinzufügen ('0'-Nein, '1'-Ja):"
CHANGE_INCLUDE_EP = "Singles und EPs beim Download von Alben eines Künstlers einbeziehen ('0'-Nein, '1'-Ja):"
CHANGE_ALBUMID_BEFORE_FOLDER = "ID vor Album-Ordner hinzufügen ('0'-Nein, '1'-Ja):"
CHANGE_SAVE_COVERS = "Cover speichern ('0'-Nein, '1'-Ja):"
CHANGE_LANGUAGE = "Sprache auswählen"
CHANGE_ALBUM_FOLDER_FORMAT = "Album-Ordnerformat('0' überspringen):"
CHANGE_TRACK_FILE_FORMAT = "Track-Dateiformat('0' überspringen):"
CHANGE_VIDEO_FILE_FORMAT = "Video file format('0'-not modify,'default'-to set default):"
CHANGE_SHOW_PROGRESS = "Fortschritt anzeigen('0'-Nein,'1'-Ja):"
CHANGE_SHOW_TRACKINFO = "Show track info('0'-No,'1'-Yes):"
CHANGE_SAVE_ALBUM_INFO = "Save AlbumInfo.txt('0'-No,'1'-Yes):"
CHANGE_ADD_LYRICS = "Add lyrics('0'-No,'1'-Yes):"
CHANGE_LYRICS_SERVER_PROXY = "Lyrics server proxy('0' not modify):"
CHANGE_ADD_LRC_FILE = "Save timed lyrics .lrc file ('0'-No,'1'-Yes):"
CHANGE_ADD_TYPE_FOLDER = "Add Type-Folder,eg Album/Video/Playlist('0'-No,'1'-Yes):"
CHANGE_ALBUM_FOLDER_FORMAT = "Album-Ordnerformat ('0' überspringen):"
CHANGE_PLAYLIST_FOLDER_FORMAT = "Playlist Ordner-Format ('0'-nicht ändern, 'default'-für Standard):"
CHANGE_TRACK_FILE_FORMAT = "Track-Dateiformat ('0' überspringen):"
CHANGE_VIDEO_FILE_FORMAT = "Video-Dateiformat ('0'-nicht ändern, 'default'-für Standard):"
CHANGE_SHOW_PROGRESS = "Fortschritt anzeigen ('0'-Nein, '1'-Ja):"
CHANGE_SHOW_TRACKINFO = "Song-Informationen anzeigen ('0'-Nein, '1'-Ja):"
CHANGE_SAVE_ALBUM_INFO = "AlbumInfo.txt speichern ('0'-Nein, '1'-Ja):"
CHANGE_DOWNLOAD_VIDEOS = "Download videos (when downloading playlists, albums, mixes)('0'-No,'1'-Yes):"
CHANGE_ADD_LYRICS = "Songtexte hinzufügen ('0'-No, '1'-Yes):"
CHANGE_LYRICS_SERVER_PROXY = "Songtext Proxy-Server ('0'-not modify):"
CHANGE_ADD_LRC_FILE = "Songtexte mit Zeitcode speichern (.lrc Datei) ('0'-Nein, '1'-Ja):"
CHANGE_ADD_TYPE_FOLDER = "Unterordner für jede Kategorie erstellen, Z.B. Album/Video/Playlist('0'-Nein, '1'-Ja):"
CHANGE_MULITHREAD_DOWNLOAD = "Multi-Thread Download('0'-Nein, '1'-Ja):"
CHANGE_USE_DOWNLOAD_DELAY = "Downloads zeitverzögert starten ('0'-nein, '1'-ja):"
# {} are required in these strings
AUTH_START_LOGIN = "Starte Loginprozess..."
AUTH_LOGIN_CODE = "Dein Logincode ist {}"
AUTH_NEXT_STEP = "Gehe auf {} in den nächsten {} um das Setup abzuschließen."
AUTH_WAITING = "Auf Autorisierung warten..."
AUTH_WAITING = "Warte auf Autorisierung..."
AUTH_TIMEOUT = "Zeitüberschreitung der Operation."
MSG_VALID_ACCESSTOKEN = "AccessToken gültig für {}."
MSG_INVALID_ACCESSTOKEN = "AccessToken abgelaufen. Versuche zu erneuern."
MSG_INVALID_ACCESSTOKEN = "AccessToken abgelaufen. Er muss erneuert werden."
MSG_PATH_ERR = "Ungültiger Pfad!"
MSG_INPUT_ERR = "Eingabefehler!"
+25 -18
View File
@@ -2,9 +2,9 @@
# -*- encoding: utf-8 -*-
'''
@File : hungarian.py
@Time : 2022/02/10
@Time : 2022/08/01
@Author : Shanahan
@Version : 1.1
@Version : 1.2
@Contact :
@Desc :
'''
@@ -30,17 +30,20 @@ class LangHungarian(object):
SETTING_USE_PLAYLIST_FOLDER = "Lejátszási lista mappa használata"
SETTING_MULITHREAD_DOWNLOAD = "Többszálú letöltés"
SETTING_ALBUM_FOLDER_FORMAT = "Album mappa formátum"
SETTING_PLAYLIST_FOLDER_FORMAT = "Playlist folder format"
SETTING_TRACK_FILE_FORMAT = "Track fájlformátum"
SETTING_VIDEO_FILE_FORMAT = "Video file format"
SETTING_VIDEO_FILE_FORMAT = "Videó fájlformátum"
SETTING_SHOW_PROGRESS = "Haladás megjelenítése"
SETTING_SHOW_TRACKINFO = "Track infók megjelenítése"
SETTING_SAVE_ALBUMINFO = "AlbumInfo.txt mentése"
SETTING_DOWNLOAD_VIDEOS = "Download videos"
SETTING_ADD_LYRICS = "Dalszöveg hozzáadása"
SETTING_LYRICS_SERVER_PROXY = "Dalszöveg kiszolgáló proxy"
SETTING_ADD_LRC_FILE = "Dalszövegek mentése (.lrc fájl)"
SETTING_PATH = "Beállítási útvonal"
SETTINGS_ADD_LRC_FILE = "Dalszövegek mentése (.lrc fájl)"
SETTING_APIKEY = "APIKey támogatás"
SETTING_ADD_TYPE_FOLDER = "Mappa típus hozzáadása"
SETTING_DOWNLOAD_DELAY = "Use Download Delay"
CHOICE = "VÁLASZTÁS"
FUNCTION = "FUNKCIÓ"
@@ -61,11 +64,11 @@ class LangHungarian(object):
PRINT_ENTER_CHOICE = "Válasszon:"
PRINT_LATEST_VERSION = "Legújabb verzió:"
# PRINT_USERNAME = "felhasználónév:"
# PRINT_PASSWORD = "jelszó
# PRINT_PASSWORD = "jelszó:"
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):"
@@ -74,20 +77,24 @@ class LangHungarian(object):
CHANGE_USE_TRACK_NUM = "Track szám hozzáadása a fájlnevek előtt('0'-Nem,'1'-Igen):"
CHANGE_CHECK_EXIST = "Létező fájl ellenőrzése letöltés előtt('0'-Nem,'1'-Igen):"
CHANGE_ARTIST_BEFORE_TITLE = "Előadó hozzáadása a szám címe előtt('0'-Nem,'1'-Igen):"
CHANGE_INCLUDE_EP = "A kislemezek és EP-k letöltése('0'-nem, '1'-igen):"
CHANGE_INCLUDE_EP = "A kislemezek és EP-k letöltése('0'-Nem, '1'-Igen):"
CHANGE_ALBUMID_BEFORE_FOLDER = "Azonosító (ID) az album mappa előtt('0'-Nem,'1'-Igen):"
CHANGE_SAVE_COVERS = "Borító mentése('0'-nem, '1'-igen):"
CHANGE_SAVE_COVERS = "Borító mentése('0'-Nem, '1'-Igen):"
CHANGE_LANGUAGE = "Nyelv kiválasztása"
CHANGE_ALBUM_FOLDER_FORMAT = "Album mappa formátum('0' nincs módosítás,'default' az alapértelmezett beállításhoz):"
CHANGE_PLAYLIST_FOLDER_FORMAT = "Playlist folder format('0'-not modify,'default'-to set default):"
CHANGE_TRACK_FILE_FORMAT = "Track fájl neve('0' nincs módosítás,'default' az alapértelmezett beállításhoz):"
CHANGE_VIDEO_FILE_FORMAT = "Video file format('0'-not modify,'default'-to set default):"
CHANGE_SHOW_PROGRESS = "Haladás megjelenítése('0'-nem, '1'-igen):"
CHANGE_SHOW_TRACKINFO = "Track infók megjelenítése('0'-No,'1'-Yes):"
CHANGE_SAVE_ALBUM_INFO = "AlbumInfo.txt mentése('0'-nem, '1'-igen):"
CHANGE_ADD_LYRICS = "Dalszöveg hozzáadása('0'-nem,'1'-igen):"
CHANGE_VIDEO_FILE_FORMAT = "Video file format('0'-nincs módosítás,'default' az alapértelmezett beállításhoz):"
CHANGE_SHOW_PROGRESS = "Haladás megjelenítése('0'-Nem, '1'-Igen):"
CHANGE_SHOW_TRACKINFO = "Track infók megjelenítése('0'-Nem,'1'-Igen):"
CHANGE_SAVE_ALBUM_INFO = "AlbumInfo.txt mentése('0'-Nem, '1'-Igen):"
CHANGE_DOWNLOAD_VIDEOS = "Download videos (when downloading playlists, albums, mixes)('0'-No,'1'-Yes):"
CHANGE_ADD_LYRICS = "Dalszöveg hozzáadása('0'-Nem,'1'-Igen):"
CHANGE_LYRICS_SERVER_PROXY = "Dalszöveg kiszolgáló proxy('0' nincs módosítás):"
CHANGE_ADD_LRC_FILE = "Dalszöveg mentése időbélyeggel .lrc fájl('0'-Nem,'1'-Igen):"
CHANGE_ADD_TYPE_FOLDER = "Mappa típus hozzáadása, pl. Album/Video/Playlist('0'-Nem,'1'-Igen):"
CHANGE_MULITHREAD_DOWNLOAD = "Többszálas letöltés('0'-Nem,'1'-Igen):"
CHANGE_USE_DOWNLOAD_DELAY = "Use Download Delay('0'-No,'1'-Yes):"
# {} are required in these strings
AUTH_START_LOGIN = "Bejelentkezési folyamat elindítása..."
@@ -101,11 +108,11 @@ class LangHungarian(object):
MSG_PATH_ERR = "Az útvonal hibás!"
MSG_INPUT_ERR = "Beviteli hiba!"
MODEL_ALBUM_PROPERTY = "ALBUM-TULAJDONSÁG"
MODEL_TRACK_PROPERTY = "TRACK-TULAJDONSÁG"
MODEL_VIDEO_PROPERTY = "VIDEO-TULAJDONSÁG"
MODEL_ARTIST_PROPERTY = "ELŐADÓ-TULAJDONSÁG"
MODEL_PLAYLIST_PROPERTY = "LEJÁTSZÁSI LISTA-TULAJDONSÁG"
MODEL_ALBUM_PROPERTY = "ALBUM-INFÓ"
MODEL_TRACK_PROPERTY = "TRACK-INFÓ"
MODEL_VIDEO_PROPERTY = "VIDEO-INFÓ"
MODEL_ARTIST_PROPERTY = "ELŐADÓ-INFÓ"
MODEL_PLAYLIST_PROPERTY = "LEJÁTSZÁSI LISTA-INFÓ"
MODEL_TITLE = 'Cím'
MODEL_TRACK_NUMBER = 'Track száma'
+12 -5
View File
@@ -30,17 +30,20 @@ class LangItalian(object):
SETTING_USE_PLAYLIST_FOLDER = "Use playlist folder"
SETTING_MULITHREAD_DOWNLOAD = "Multi thread download"
SETTING_ALBUM_FOLDER_FORMAT = "Album folder format"
SETTING_PLAYLIST_FOLDER_FORMAT = "Playlist folder format"
SETTING_TRACK_FILE_FORMAT = "Track file format"
SETTING_VIDEO_FILE_FORMAT = "Video file format"
SETTING_SHOW_PROGRESS = "Show progress"
SETTING_SHOW_TRACKINFO = "Show Track Info"
SETTING_SAVE_ALBUMINFO = "Save AlbumInfo.txt"
SETTING_DOWNLOAD_VIDEOS = "Download videos"
SETTING_ADD_LYRICS = "Add lyrics"
SETTING_LYRICS_SERVER_PROXY = "Lyrics server proxy"
SETTING_ADD_LRC_FILE = "Save timed lyrics (.lrc file)"
SETTING_PATH = "Settings path"
SETTINGS_ADD_LRC_FILE = "Save timed lyrics (.lrc file)"
SETTING_APIKEY = "APIKey support"
SETTING_ADD_TYPE_FOLDER = "Add Type-Folder"
SETTING_DOWNLOAD_DELAY = "Use Download Delay"
CHOICE = "SCELTA"
FUNCTION = "FUNZIONE"
@@ -65,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ì):"
@@ -78,16 +81,20 @@ class LangItalian(object):
CHANGE_ALBUMID_BEFORE_FOLDER = "Aggiungere ID prima del nome della cartella per l'album ('0'-No,'1'-Sì):"
CHANGE_SAVE_COVERS = "Salve copertine ('0'-No,'1'-Sì):"
CHANGE_LANGUAGE = "Selezionare lingua"
CHANGE_ALBUM_FOLDER_FORMAT = "Album folder format('0' not modify):"
CHANGE_TRACK_FILE_FORMAT = "Track file format('0' not modify):"
CHANGE_ALBUM_FOLDER_FORMAT = "Album folder format('0' not modify,'default'-to set default):"
CHANGE_PLAYLIST_FOLDER_FORMAT = "Playlist folder format('0'-not modify,'default'-to set default):"
CHANGE_TRACK_FILE_FORMAT = "Track file format('0' not modify,'default'-to set default):"
CHANGE_VIDEO_FILE_FORMAT = "Video file format('0'-not modify,'default'-to set default):"
CHANGE_SHOW_PROGRESS = "Show progress('0'-No,'1'-Yes):"
CHANGE_SHOW_TRACKINFO = "Show track info('0'-No,'1'-Yes):"
CHANGE_SAVE_ALBUM_INFO = "Save AlbumInfo.txt('0'-No,'1'-Yes):"
CHANGE_DOWNLOAD_VIDEOS = "Download videos (when downloading playlists, albums, mixes)('0'-No,'1'-Yes):"
CHANGE_ADD_LYRICS = "Add lyrics('0'-No,'1'-Yes):"
CHANGE_LYRICS_SERVER_PROXY = "Lyrics server proxy('0' not modify):"
CHANGE_LYRICS_SERVER_PROXY = "Lyrics server proxy('0'-not modify):"
CHANGE_ADD_LRC_FILE = "Save timed lyrics .lrc file ('0'-No,'1'-Yes):"
CHANGE_ADD_TYPE_FOLDER = "Add Type-Folder,eg Album/Video/Playlist('0'-No,'1'-Yes):"
CHANGE_MULITHREAD_DOWNLOAD = "Multi thread download('0'-No,'1'-Yes):"
CHANGE_USE_DOWNLOAD_DELAY = "Use Download Delay('0'-No,'1'-Yes):"
# {} are required in these strings
AUTH_START_LOGIN = "Starting login process..."
+9 -2
View File
@@ -30,17 +30,20 @@ class LangJapanese(object):
SETTING_USE_PLAYLIST_FOLDER = "Use playlist folder"
SETTING_MULITHREAD_DOWNLOAD = "Multi thread download"
SETTING_ALBUM_FOLDER_FORMAT = "Album folder format"
SETTING_PLAYLIST_FOLDER_FORMAT = "Playlist folder format"
SETTING_TRACK_FILE_FORMAT = "Track file format"
SETTING_VIDEO_FILE_FORMAT = "Video file format"
SETTING_SHOW_PROGRESS = "Show progress"
SETTING_SHOW_TRACKINFO = "Show Track Info"
SETTING_SAVE_ALBUMINFO = "Save AlbumInfo.txt"
SETTING_DOWNLOAD_VIDEOS = "Download videos"
SETTING_ADD_LYRICS = "歌詞を追加"
SETTING_LYRICS_SERVER_PROXY = "Lyrics server proxy"
SETTINGS_ADD_LRC_FILE = "Save timed lyrics (.lrc file)"
SETTING_ADD_LRC_FILE = "Save timed lyrics (.lrc file)"
SETTING_PATH = "設定パス"
SETTING_APIKEY = "APIKey support"
SETTING_ADD_TYPE_FOLDER = "Add Type-Folder"
SETTING_DOWNLOAD_DELAY = "Use Download Delay"
CHOICE = "選択"
FUNCTION = "関数"
@@ -65,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'-はい):"
@@ -79,15 +82,19 @@ class LangJapanese(object):
CHANGE_SAVE_COVERS = "カバーを保存('0'-いいえ,'1'-はい):"
CHANGE_LANGUAGE = "言語を選択する"
CHANGE_ALBUM_FOLDER_FORMAT = "Album folder format('0'-変更しない,'default'-デフォルトを設定するには):"
CHANGE_PLAYLIST_FOLDER_FORMAT = "Playlist folder format('0'-not modify,'default'-to set default):"
CHANGE_TRACK_FILE_FORMAT = "Track file format('0'-変更しない,'default'-デフォルトを設定するには):"
CHANGE_VIDEO_FILE_FORMAT = "Video file format('0'-not modify,'default'-to set default):"
CHANGE_SHOW_PROGRESS = "Show progress('0'-いいえ,'1'-はい):"
CHANGE_SHOW_TRACKINFO = "Show track info('0'-いいえ,'1'-はい):"
CHANGE_SAVE_ALBUM_INFO = "Save AlbumInfo.txt('0'-いいえ,'1'-はい):"
CHANGE_DOWNLOAD_VIDEOS = "Download videos (when downloading playlists, albums, mixes)('0'-No,'1'-Yes):"
CHANGE_ADD_LYRICS = "歌詞を追加('0'-いいえ,'1'-はい):"
CHANGE_LYRICS_SERVER_PROXY = "Lyrics server proxy('0'-変更しない):"
CHANGE_ADD_LRC_FILE = "Save timed lyrics .lrc file ('0'-いいえ,'1'-はい):"
CHANGE_ADD_TYPE_FOLDER = "Add Type-Folder,eg Album/Video/Playlist('0'-No,'1'-Yes):"
CHANGE_MULITHREAD_DOWNLOAD = "Multi thread download('0'-No,'1'-Yes):"
CHANGE_USE_DOWNLOAD_DELAY = "Use Download Delay('0'-No,'1'-Yes):"
# {} are required in these strings
AUTH_START_LOGIN = "Starting login process..."
+9 -2
View File
@@ -30,17 +30,20 @@ class LangKorean(object):
SETTING_USE_PLAYLIST_FOLDER = "재생목록 폴더 사용"
SETTING_MULITHREAD_DOWNLOAD = "다중 스레드 다운로드"
SETTING_ALBUM_FOLDER_FORMAT = "앨범 폴더 형식"
SETTING_PLAYLIST_FOLDER_FORMAT = "Playlist folder format"
SETTING_TRACK_FILE_FORMAT = "트랙 파일 형식"
SETTING_VIDEO_FILE_FORMAT = "Video file format"
SETTING_SHOW_PROGRESS = "진행 상태 표시"
SETTING_SHOW_TRACKINFO = "트랙 정보 표시"
SETTING_SAVE_ALBUMINFO = "AlbumInfo.txt 저장"
SETTING_DOWNLOAD_VIDEOS = "Download videos"
SETTING_ADD_LYRICS = "가사 추가"
SETTING_LYRICS_SERVER_PROXY = "가사 서버 프록시"
SETTINGS_ADD_LRC_FILE = "timed 가사 저장 (.lrc 파일)"
SETTING_ADD_LRC_FILE = "timed 가사 저장 (.lrc 파일)"
SETTING_PATH = "설정 경로"
SETTING_APIKEY = "APIKey support"
SETTING_ADD_TYPE_FOLDER = "Add Type-Folder"
SETTING_DOWNLOAD_DELAY = "Use Download Delay"
CHOICE = "선택"
FUNCTION = "기능"
@@ -65,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'-예):"
@@ -79,15 +82,19 @@ class LangKorean(object):
CHANGE_SAVE_COVERS = "커버 저장('0'-아니요,'1'-예):"
CHANGE_LANGUAGE = "언어 선택"
CHANGE_ALBUM_FOLDER_FORMAT = "앨범 폴더 형식('0'-변경 안 함,'default'-기본 설정):"
CHANGE_PLAYLIST_FOLDER_FORMAT = "Playlist folder format('0'-not modify,'default'-to set default):"
CHANGE_TRACK_FILE_FORMAT = "트랙 파일 형식('0'-변경 안 함,'default'-기본 설정):"
CHANGE_VIDEO_FILE_FORMAT = "Video file format('0'-not modify,'default'-to set default):"
CHANGE_SHOW_PROGRESS = "진행 상태 표시('0'-아니요,'1'-예):"
CHANGE_SHOW_TRACKINFO = "트랙 정보 표시('0'-아니요,'1'-예):"
CHANGE_SAVE_ALBUM_INFO = "AlbumInfo.txt 저장('0'-아니요,'1'-예):"
CHANGE_DOWNLOAD_VIDEOS = "Download videos (when downloading playlists, albums, mixes)('0'-No,'1'-Yes):"
CHANGE_ADD_LYRICS = "가사 추가('0'-아니요,'1'-예):"
CHANGE_LYRICS_SERVER_PROXY = "가사 서버 프록시('0'-변경 안 함):"
CHANGE_ADD_LRC_FILE = "timed 가사 .lrc 파일 저장 ('0'-아니요,'1'-예):"
CHANGE_ADD_TYPE_FOLDER = "Add Type-Folder,eg Album/Video/Playlist('0'-No,'1'-Yes):"
CHANGE_MULITHREAD_DOWNLOAD = "Multi thread download('0'-No,'1'-Yes):"
CHANGE_USE_DOWNLOAD_DELAY = "Use Download Delay('0'-No,'1'-Yes):"
# {} are required in these strings
AUTH_START_LOGIN = "로그인 중..."
+82 -128
View File
@@ -6,136 +6,90 @@
@Author : Yaronzz
@Version : 1.0
@Contact : yaronhuang@foxmail.com
@Desc :
@Desc :
'''
from tidal_dl.lang.arabic import LangArabic
from tidal_dl.lang.chinese import LangChinese
from tidal_dl.lang.croatian import LangCroatian
from tidal_dl.lang.czech import LangCzech
from tidal_dl.lang.danish import LangDanish
from tidal_dl.lang.dutch import LangDutch
from tidal_dl.lang.english import LangEnglish
from tidal_dl.lang.filipino import LangFilipino
from tidal_dl.lang.french import LangFrench
from tidal_dl.lang.german import LangGerman
from tidal_dl.lang.hungarian import LangHungarian
from tidal_dl.lang.italian import LangItalian
from tidal_dl.lang.polish import LangPolish
from tidal_dl.lang.portuguese import LangPortuguese
from tidal_dl.lang.russian import LangRussian
from tidal_dl.lang.spanish import LangSpanish
from tidal_dl.lang.turkish import LangTurkish
from tidal_dl.lang.ukrainian import LangUkrainian
from tidal_dl.lang.vietnamese import LangVietnamese
from tidal_dl.lang.korean import LangKorean
from tidal_dl.lang.japanese import LangJapanese
from lang.arabic import LangArabic
from lang.chinese import LangChinese
from lang.croatian import LangCroatian
from lang.czech import LangCzech
from lang.danish import LangDanish
from lang.dutch import LangDutch
from lang.english import LangEnglish
from lang.filipino import LangFilipino
from lang.french import LangFrench
from lang.german import LangGerman
from lang.hungarian import LangHungarian
from lang.italian import LangItalian
from lang.norwegian import LangNorwegian
from lang.polish import LangPolish
from lang.portuguese import LangPortuguese
from lang.russian import LangRussian
from lang.spanish import LangSpanish
from lang.turkish import LangTurkish
from lang.ukrainian import LangUkrainian
from lang.vietnamese import LangVietnamese
from lang.korean import LangKorean
from lang.japanese import LangJapanese
LANG = LangEnglish()
_ALL_LANGUAGE_ = [
['English', LangEnglish()],
['中文', LangChinese()],
['Turkish', LangTurkish()],
['Italian', LangItalian()],
['Czech', LangCzech()],
['Arabic', LangArabic()],
['Russian', LangRussian()],
['Filipino', LangFilipino()],
['Croatian', LangCroatian()],
['Spanish', LangSpanish()],
['Portuguese', LangPortuguese()],
['Ukrainian', LangUkrainian()],
['Vietnamese', LangVietnamese()],
['French', LangFrench()],
['German', LangGerman()],
['Danish', LangDanish()],
['Hungarian', LangHungarian()],
['Korean', LangKorean()],
['Japanese', LangJapanese()],
['Dutch', LangDutch()],
['Polish', LangPolish()],
['Norwegian', LangNorwegian()],
]
class Language(object):
def __init__(self) -> None:
self.select = LangEnglish()
def __toInt__(self, str):
try:
return int(str)
except:
return 0
def setLang(self, index):
index = self.__toInt__(index)
if index >= 0 and index < len(_ALL_LANGUAGE_):
self.select = _ALL_LANGUAGE_[index][1]
else:
self.select = LangEnglish()
def getLangName(self, index):
index = self.__toInt__(index)
if index >= 0 and index < len(_ALL_LANGUAGE_):
return _ALL_LANGUAGE_[index][0]
return ""
def getLangChoicePrint(self):
array = []
index = 0
while True:
name = self.getLangName(index)
if name == "":
break
array.append('\'' + str(index) + '\'-' + name)
index += 1
return ','.join(array)
def setLang(index):
global LANG
if str(index) == '0':
LANG = LangEnglish()
elif str(index) == '1':
LANG = LangChinese()
elif str(index) == '2':
LANG = LangTurkish()
elif str(index) == '3':
LANG = LangItalian()
elif str(index) == '4':
LANG = LangCzech()
elif str(index) == '5':
LANG = LangArabic()
elif str(index) == '6':
LANG = LangRussian()
elif str(index) == '7':
LANG = LangFilipino()
elif str(index) == '8':
LANG = LangCroatian()
elif str(index) == '9':
LANG = LangSpanish()
elif str(index) == '10':
LANG = LangPortuguese()
elif str(index) == '11':
LANG = LangUkrainian()
elif str(index) == '12':
LANG = LangVietnamese()
elif str(index) == '13':
LANG = LangFrench()
elif str(index) == '14':
LANG = LangGerman()
elif str(index) == '15':
LANG = LangDanish()
elif str(index) == '16':
LANG = LangHungarian()
elif str(index) == '17':
LANG = LangKorean()
elif str(index) == '18':
LANG = LangJapanese()
elif str(index) == '19':
LANG = LangDutch()
elif str(index) == '20':
LANG = LangPolish()
else:
LANG = LangEnglish()
return LANG
def getLangName(index):
if str(index) == '0':
return "English"
if str(index) == '1':
return "中文"
if str(index) == '2':
return "Turkish"
if str(index) == '3':
return "Italian"
if str(index) == '4':
return "Czech"
if str(index) == '5':
return "Arabic"
if str(index) == '6':
return "Russian"
if str(index) == '7':
return "Filipino"
if str(index) == '8':
return "Croatian"
if str(index) == '9':
return "Spanish"
if str(index) == '10':
return "Portuguese"
if str(index) == '11':
return "Ukrainian"
if str(index) == '12':
return "Vietnamese"
if str(index) == '13':
return "French"
if str(index) == '14':
return "German"
if str(index) == '15':
return "Danish"
if str(index) == '16':
return "Hungarian"
if str(index) == '17':
return "Korean"
if str(index) == '18':
return "Japanese"
if str(index) == '19':
return "Dutch"
if str(index) == '20':
return "Polish"
return ""
def getLangChoicePrint():
array = []
index = 0
while True:
name = getLangName(index)
if name == "":
break
array.append('\'' + str(index) + '\'-' + name)
index += 1
return ','.join(array)
LANG = Language()
+126
View File
@@ -0,0 +1,126 @@
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File : norwegian.py
@Time : 2021/03/25
@Author : roberts91
@Version : 1.0
@Contact :
@Desc :
'''
class LangNorwegian(object):
SETTING = "INNSTILLINGER"
VALUE = "Verdi"
SETTING_DOWNLOAD_PATH = "Nedlastingssti"
SETTING_ONLY_M4A = "Konverter MP4 til M4A"
SETTING_ADD_EXPLICIT_TAG = "Legg til eksplisitt tag"
SETTING_ADD_HYPHEN = "Legg til bindestrek"
SETTING_ADD_YEAR = "Legg til år før albummappenavn"
SETTING_USE_TRACK_NUM = "Legg til spornummer"
SETTING_AUDIO_QUALITY = "Lydkvalitet"
SETTING_VIDEO_QUALITY = "Videokvalitet"
SETTING_CHECK_EXIST = "Kontroller eksistens"
SETTING_ARTIST_BEFORE_TITLE = "Artistnavn før spornummer"
SETTING_ALBUMID_BEFORE_FOLDER = "Id før album mappe"
SETTING_INCLUDE_EP = "Inkluder single&EP"
SETTING_SAVE_COVERS = "Lagre cover"
SETTING_LANGUAGE = "Språk"
SETTING_USE_PLAYLIST_FOLDER = "Bruk spillelistemappe"
SETTING_MULITHREAD_DOWNLOAD = "Last ned flere samtidig"
SETTING_ALBUM_FOLDER_FORMAT = "Albummappens format"
SETTING_PLAYLIST_FOLDER_FORMAT = "Spillelistemappens format"
SETTING_TRACK_FILE_FORMAT = "Spor filformat"
SETTING_VIDEO_FILE_FORMAT = "Video filformat"
SETTING_SHOW_PROGRESS = "Vis fremgang"
SETTING_SHOW_TRACKINFO = "Vis sporinformasjon"
SETTING_SAVE_ALBUMINFO = "Lagre AlbumInfo.txt"
SETTING_DOWNLOAD_VIDEOS = "Last ned video"
SETTING_ADD_LYRICS = "Legg til sangtekst"
SETTING_LYRICS_SERVER_PROXY = "Sangtekst server proxy"
SETTING_ADD_LRC_FILE = "Lagre sangtekster med tidsreferanser (.lrc fil)"
SETTING_PATH = "Innstillinger sti"
SETTING_APIKEY = "API-nøkkel støtte"
SETTING_ADD_TYPE_FOLDER = "Legg til Type-Folder"
SETTING_DOWNLOAD_DELAY = "Use Download Delay"
CHOICE = "VALG"
FUNCTION = "FUNKSJON"
CHOICE_ENTER = "Tast inn"
CHOICE_ENTER_URLID = "Tast inn 'Url/ID':"
CHOICE_EXIT = "Avslutt"
CHOICE_LOGIN = "Kontroller AccessToken"
CHOICE_SETTINGS = "Innstillinger"
CHOICE_SET_ACCESS_TOKEN = "Sett AccessToken"
CHOICE_DOWNLOAD_BY_URL = "Last ned via URL eller ID"
CHOICE_LOGOUT = "Logg ut"
CHOICE_APIKEY = "Velg APIKey"
PRINT_ERR = "[FEIL]"
PRINT_INFO = "[INFO]"
PRINT_SUCCESS = "[SUCCES]"
PRINT_ENTER_CHOICE = "Tast inn valg:"
PRINT_LATEST_VERSION = "Seneste versjon:"
# PRINT_USERNAME = "username:"
# PRINT_PASSWORD = "password:"
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,'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):"
CHANGE_ADD_HYPHEN = "Bruk bindestreker i stedet for mellomrom i filnavn('0'-Nei,'1'-Ja):"
CHANGE_ADD_YEAR = "Legg til år i albumnavn('0'-Nei,'1'-Ja):"
CHANGE_USE_TRACK_NUM = "Legg til spornummer før filnavn('0'-Nei,'1'-Ja):"
CHANGE_CHECK_EXIST = "Kontrollér filens eksistens før nedlasting('0'-Nei,'1'-Ja):"
CHANGE_ARTIST_BEFORE_TITLE = "Legg til artistnavn før sportittel('0'-Nei,'1'-Ja):"
CHANGE_INCLUDE_EP = "Inkluder singler og EP'er når man laster ned en artists album('0'-Nei,'1'-Ja):"
CHANGE_ALBUMID_BEFORE_FOLDER = "Legg til ID før albummappe('0'-Nei,'1'-Ja):"
CHANGE_SAVE_COVERS = "Lagre cover('0'-Nei,'1'-Ja):"
CHANGE_LANGUAGE = "Velg språk"
CHANGE_ALBUM_FOLDER_FORMAT = "Albummappe format('0'-ikke endre, 'default'-for å sette til standardverdi):"
CHANGE_PLAYLIST_FOLDER_FORMAT = "Spillelistemappe format('0'-ikke endre, 'default'-for å sette til standardverdi):"
CHANGE_TRACK_FILE_FORMAT = "Sportittel filformat('0'-ikke endre, 'default'-for å sette til standardverdi):"
CHANGE_VIDEO_FILE_FORMAT = "Videofil format('0'-ikke endre, 'default'-for å sette til standardverdi):"
CHANGE_SHOW_PROGRESS = "Vis fremgang('0'-Nei,'1'-Ja):"
CHANGE_SHOW_TRACKINFO = "Vis sporinformasjon('0'-Nei,'1'-Ja):"
CHANGE_SAVE_ALBUM_INFO = "Lagre AlbumInfo.txt('0'-Nei,'1'-Ja):"
CHANGE_DOWNLOAD_VIDEOS = "Last ned videers (i spillelister, album, mikser)('0'-No,'1'-Yes):"
CHANGE_ADD_LYRICS = "Legg til sangtekst('0'-Nei,'1'-Ja):"
CHANGE_LYRICS_SERVER_PROXY = "Sangtekst server proxy('0'-not modify):"
CHANGE_ADD_LRC_FILE = "Lagre sangtekster med tidsreferanser .lrc fil ('0'-Nei,'1'-Ja):"
CHANGE_ADD_TYPE_FOLDER = "Legg til Type-mappe, f.eks. Album/Video/Spilleliste('0'-Nei,'1'-Ja):"
CHANGE_MULITHREAD_DOWNLOAD = "Last ned flere samtidig('0'-Nei,'1'-Ja):"
CHANGE_USE_DOWNLOAD_DELAY = "Use Download Delay('0'-No,'1'-Yes):"
# {} are required in these strings
AUTH_START_LOGIN = "Starter login-prosessen."
AUTH_LOGIN_CODE = "Din login kode er {}"
AUTH_NEXT_STEP = "Gå til {} innen de neste {} for å avslutte setup."
AUTH_WAITING = "Venter på godkjennelse..."
AUTH_TIMEOUT = "Tiden gikk ut."
MSG_VALID_ACCESSTOKEN = "AccessToken tilgjengelig for {}."
MSG_INVALID_ACCESSTOKEN = "AccessToken utløpt. Forøsker å oppdatere"
MSG_PATH_ERR = "Sti feil!"
MSG_INPUT_ERR = "Inntastningsfeol!"
MODEL_ALBUM_PROPERTY = "ALBUM-PROPERTY"
MODEL_TRACK_PROPERTY = "TRACK-PROPERTY"
MODEL_VIDEO_PROPERTY = "VIDEO-PROPERTY"
MODEL_ARTIST_PROPERTY = "ARTIST-PROPERTY"
MODEL_PLAYLIST_PROPERTY = "PLAYLIST-PROPERTY"
MODEL_TITLE = 'Tittel'
MODEL_TRACK_NUMBER = 'Spornummer'
MODEL_VIDEO_NUMBER = 'Videonummer'
MODEL_RELEASE_DATE = 'Utgivelsesdato'
MODEL_VERSION = 'Versjon'
MODEL_EXPLICIT = 'Eksplisitt'
MODEL_ALBUM = 'Album'
MODEL_ID = 'ID'
MODEL_NAME = 'Navn'
MODEL_TYPE = 'Type'
+9 -2
View File
@@ -30,17 +30,20 @@ class LangPolish(object):
SETTING_USE_PLAYLIST_FOLDER = "Użyj folder playlisty"
SETTING_MULITHREAD_DOWNLOAD = "Pobieranie wielowątkowe"
SETTING_ALBUM_FOLDER_FORMAT = "Format folderu albumu"
SETTING_PLAYLIST_FOLDER_FORMAT = "Playlist folder format"
SETTING_TRACK_FILE_FORMAT = "Format pliku utworu"
SETTING_VIDEO_FILE_FORMAT = "Video file format"
SETTING_SHOW_PROGRESS = "Pokaż postęp"
SETTING_SHOW_TRACKINFO = "Pokaż informacje o utworze"
SETTING_SAVE_ALBUMINFO = "Zapisz AlbumInfo.txt"
SETTING_DOWNLOAD_VIDEOS = "Download videos"
SETTING_ADD_LYRICS = "Dodaj teksty utworów"
SETTING_LYRICS_SERVER_PROXY = "Serwer proxy dla tekstów"
SETTINGS_ADD_LRC_FILE = "Zapisz czasowe teksty utworów (plik .lrc)"
SETTING_ADD_LRC_FILE = "Zapisz czasowe teksty utworów (plik .lrc)"
SETTING_PATH = "Ścieżka ustawień"
SETTING_APIKEY = "Obsługa APIKey"
SETTING_ADD_TYPE_FOLDER = "Dodaj folder typu"
SETTING_DOWNLOAD_DELAY = "Use Download Delay"
CHOICE = "WYBÓR"
FUNCTION = "FUNKCJA"
@@ -65,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):"
@@ -79,15 +82,19 @@ class LangPolish(object):
CHANGE_SAVE_COVERS = "Zapisz okładki('0'-Nie,'1'-Tak):"
CHANGE_LANGUAGE = "Wybierz język"
CHANGE_ALBUM_FOLDER_FORMAT = "Format folderu albumu('0'-nie modyfikuj,'default'-by ustawić domyślny):"
CHANGE_PLAYLIST_FOLDER_FORMAT = "Playlist folder format('0'-not modify,'default'-to set default):"
CHANGE_TRACK_FILE_FORMAT = "Format pliku utworu('0'-nie modyfikuj,'default'-by ustawić domyślny):"
CHANGE_VIDEO_FILE_FORMAT = "Video file format('0'-not modify,'default'-to set default):"
CHANGE_SHOW_PROGRESS = "Pokaż postęp('0'-Nie,'1'-Tak):"
CHANGE_SHOW_TRACKINFO = "Pokaż informacje o utworze('0'-Nie,'1'-Tak):"
CHANGE_SAVE_ALBUM_INFO = "Zapisz AlbumInfo.txt('0'-Nie,'1'-Tak):"
CHANGE_DOWNLOAD_VIDEOS = "Download videos (when downloading playlists, albums, mixes)('0'-No,'1'-Yes):"
CHANGE_ADD_LYRICS = "Dodaj teksty utworów('0'-Nie,'1'-Tak):"
CHANGE_LYRICS_SERVER_PROXY = "Serwer proxy dla tekstów('0'-nie modyfikuj):"
CHANGE_ADD_LRC_FILE = "Zapisz plik .lrc czasowych tekstów utworów ('0'-Nie,'1'-Tak):"
CHANGE_ADD_TYPE_FOLDER = "Dodaj folder typu, np. Album/wideo/lista odtwarzania('0'-Nie,'1'-Tak):"
CHANGE_MULITHREAD_DOWNLOAD = "Multi thread download('0'-No,'1'-Yes):"
CHANGE_USE_DOWNLOAD_DELAY = "Use Download Delay('0'-No,'1'-Yes):"
# {} are required in these strings
AUTH_START_LOGIN = "Rozpoczęcie procesu logowania..."
+9 -2
View File
@@ -30,17 +30,20 @@ class LangPortuguese(object):
SETTING_USE_PLAYLIST_FOLDER = "Usar pasta de lista de reprodução"
SETTING_MULITHREAD_DOWNLOAD = "Download de vários tópicos"
SETTING_ALBUM_FOLDER_FORMAT = "Formato da pasta do álbum"
SETTING_PLAYLIST_FOLDER_FORMAT = "Playlist folder format"
SETTING_TRACK_FILE_FORMAT = "Track file format"
SETTING_VIDEO_FILE_FORMAT = "Video file format"
SETTING_SHOW_PROGRESS = "Mostrar progresso"
SETTING_SHOW_TRACKINFO = "Mostrar informações da faixa"
SETTING_SAVE_ALBUMINFO = "Salvar AlbumInfo.txt"
SETTING_DOWNLOAD_VIDEOS = "Download videos"
SETTING_ADD_LYRICS = "Adicionar Letra da Música"
SETTING_LYRICS_SERVER_PROXY = "Proxy do servidor de letras"
SETTING_ADD_LRC_FILE = "Salvar letras cronometradas (.lrc file)"
SETTING_PATH = "Settings path"
SETTINGS_ADD_LRC_FILE = "Salvar letras cronometradas (.lrc file)"
SETTING_APIKEY = "Suporte APIKey"
SETTING_ADD_TYPE_FOLDER = "Adicionar tipo de pasta"
SETTING_DOWNLOAD_DELAY = "Use Download Delay"
CHOICE = "ESCOLHER"
FUNCTION = "FUNÇÃO"
@@ -65,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):"
@@ -79,15 +82,19 @@ class LangPortuguese(object):
CHANGE_SAVE_COVERS = "Salvar Capas('0'-Não,'1'-Sim):"
CHANGE_LANGUAGE = "Selecionar idioma"
CHANGE_ALBUM_FOLDER_FORMAT = "Formato da pasta do álbum ('0' não modificar)"
CHANGE_PLAYLIST_FOLDER_FORMAT = "Playlist folder format('0'-not modify,'default'-to set default):"
CHANGE_TRACK_FILE_FORMAT = "Formato do arquivo de trilha ('0' não modificar):"
CHANGE_VIDEO_FILE_FORMAT = "Video file format('0'-not modify,'default'-to set default):"
CHANGE_SHOW_PROGRESS = "Mostrar progresso('0'-Não,'1'-Sim):"
CHANGE_SHOW_TRACKINFO = "Mostrar informações da faixa('0'-Não,'1'-Sim):"
CHANGE_SAVE_ALBUM_INFO = "Salvar AlbumInfo.txt('0'-Não,'1'-Sim):"
CHANGE_DOWNLOAD_VIDEOS = "Download videos (when downloading playlists, albums, mixes)('0'-No,'1'-Yes):"
CHANGE_ADD_LYRICS = "Adicionar letras('0'-Não,'1'-Sim):"
CHANGE_LYRICS_SERVER_PROXY = "Proxy do servidor de letras ('0' não modificar):"
CHANGE_ADD_LRC_FILE = "Salvar arquivo .lrc de letras cronometradas ('0'-Não,'1'-Sim):"
CHANGE_ADD_TYPE_FOLDER = "Adicionar Tipo de Pasta, por exemplo, Álbum/Vídeo/Lista de Reprodução('0'-Não,'1'-Sim):"
CHANGE_MULITHREAD_DOWNLOAD = "Multi thread download('0'-No,'1'-Yes):"
CHANGE_USE_DOWNLOAD_DELAY = "Use Download Delay('0'-No,'1'-Yes):"
# {} are required in these strings
AUTH_START_LOGIN = "Iniciando o processo de login..."
+9 -2
View File
@@ -30,17 +30,20 @@ class LangRussian(object):
SETTING_USE_PLAYLIST_FOLDER = "Плейлисты в отдельную папку"
SETTING_MULITHREAD_DOWNLOAD = "Многопоточная загрузка"
SETTING_ALBUM_FOLDER_FORMAT = "Маска имени альбома"
SETTING_PLAYLIST_FOLDER_FORMAT = "Playlist folder format"
SETTING_TRACK_FILE_FORMAT = "Маска имени трека"
SETTING_VIDEO_FILE_FORMAT = "Video file format"
SETTING_SHOW_PROGRESS = "Показывать процесс загрузки"
SETTING_SHOW_TRACKINFO = "Show Track Info"
SETTING_SAVE_ALBUMINFO = "Сохранять AlbumInfo.txt"
SETTING_DOWNLOAD_VIDEOS = "Download videos"
SETTING_ADD_LYRICS = "Добавлять текст песень"
SETTING_LYRICS_SERVER_PROXY = "Прокси сервер для текстов песен"
SETTING_ADD_LRC_FILE = "Save timed lyrics (.lrc file)"
SETTING_PATH = "Путь для настроек"
SETTINGS_ADD_LRC_FILE = "Save timed lyrics (.lrc file)"
SETTING_APIKEY = "APIKey support"
SETTING_ADD_TYPE_FOLDER = "Add Type-Folder"
SETTING_DOWNLOAD_DELAY = "Use Download Delay"
CHOICE = "ВЫБРАТЬ"
FUNCTION = "ФУНКЦИИ"
@@ -65,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'-Да):"
@@ -79,15 +82,19 @@ class LangRussian(object):
CHANGE_SAVE_COVERS = "Сохранять обложки('0'-Нет,'1'-Да):"
CHANGE_LANGUAGE = "Выбрать язык"
CHANGE_ALBUM_FOLDER_FORMAT = "Маска имени альбома('0' не менять):"
CHANGE_PLAYLIST_FOLDER_FORMAT = "Playlist folder format('0'-not modify,'default'-to set default):"
CHANGE_TRACK_FILE_FORMAT = "Маска имени трека('0' не менять):"
CHANGE_VIDEO_FILE_FORMAT = "Video file format('0'-not modify,'default'-to set default):"
CHANGE_SHOW_PROGRESS = "Показывать процесс загрузки('0'-Нет,'1'-Да):"
CHANGE_SHOW_TRACKINFO = "Show track info('0'-No,'1'-Yes):"
CHANGE_SAVE_ALBUM_INFO = "Сохранять AlbumInfo.txt('0'-Нет,'1'-Да):"
CHANGE_DOWNLOAD_VIDEOS = "Download videos (when downloading playlists, albums, mixes)('0'-No,'1'-Yes):"
CHANGE_ADD_LYRICS = "Добавлять тексты песень ('0'-Нет,'1'-Да):"
CHANGE_LYRICS_SERVER_PROXY = "Прокси для сервера с текстом песень('0' не менять):"
CHANGE_ADD_LRC_FILE = "Save timed lyrics .lrc file ('0'-No,'1'-Yes):"
CHANGE_ADD_TYPE_FOLDER = "Add Type-Folder,eg Album/Video/Playlist('0'-No,'1'-Yes):"
CHANGE_MULITHREAD_DOWNLOAD = "Multi thread download('0'-No,'1'-Yes):"
CHANGE_USE_DOWNLOAD_DELAY = "Use Download Delay('0'-No,'1'-Yes):"
# {} are required in these strings
AUTH_START_LOGIN = "Входим в сервис..."
+13 -6
View File
@@ -2,7 +2,7 @@
# -*- encoding: utf-8 -*-
'''
@File : spanish.py
@Time : 2022/01/19
@Time : 2022/07/07
@Author : Frikilinux & JavierSC
@Version : 2.3
@Contact :
@@ -30,17 +30,20 @@ class LangSpanish(object):
SETTING_USE_PLAYLIST_FOLDER = "Usar directorio de la lista de reproducción"
SETTING_MULITHREAD_DOWNLOAD = "Descarga Multi-hilo"
SETTING_ALBUM_FOLDER_FORMAT = "Formato del nombre de carpeta del álbum"
SETTING_PLAYLIST_FOLDER_FORMAT = "Playlist folder format"
SETTING_TRACK_FILE_FORMAT = "Formato del nombre de archivo de la pista"
SETTING_VIDEO_FILE_FORMAT = "Video file format"
SETTING_SHOW_PROGRESS = "Mostrar progreso"
SETTING_SHOW_TRACKINFO = "Mostrar información de pista"
SETTING_SAVE_ALBUMINFO = "Guardar AlbumInfo.txt"
SETTING_DOWNLOAD_VIDEOS = "Download videos"
SETTING_ADD_LYRICS = "Añadir letras"
SETTING_LYRICS_SERVER_PROXY = "Proxy del servidor de letras"
SETTING_ADD_LRC_FILE = "Añadir letras cronometradas (archivo .lrc)"
SETTING_PATH = "Ruta de ajustes"
SETTINGS_ADD_LRC_FILE = "Añadir letras cronometradas (archivo .lrc)"
SETTING_APIKEY = "Soporte de la APIKey"
SETTING_ADD_TYPE_FOLDER = "Añadir tipo de carpeta"
SETTING_DOWNLOAD_DELAY = "Use Download Delay"
CHOICE = "SELECCIÓN"
FUNCTION = "FUNCIÓN"
@@ -65,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í):"
@@ -79,15 +82,19 @@ class LangSpanish(object):
CHANGE_SAVE_COVERS = "¿Guardar carátulas?('0'-No,'1'-Sí):"
CHANGE_LANGUAGE = "Seleccione el idioma"
CHANGE_ALBUM_FOLDER_FORMAT = "Formato del nombre de carpeta del álbum ('0' No modificar):"
CHANGE_PLAYLIST_FOLDER_FORMAT = "Playlist folder format('0'-not modify,'default'-to set default):"
CHANGE_TRACK_FILE_FORMAT = "Formato del nombre de archivo de la pista ('0' No modificar):"
CHANGE_VIDEO_FILE_FORMAT = "Video file format('0'-not modify,'default'-to set default):"
CHANGE_VIDEO_FILE_FORMAT = "Formato del archivo de video('0'-No modificar,'default'-por defecto):"
CHANGE_SHOW_PROGRESS = "¿Mostrar progreso? ('0'-No,'1'-Sí):"
CHANGE_SHOW_TRACKINFO = "¿Mostrar información de pista?('0'-No,'1'-Sí):"
CHANGE_SAVE_ALBUM_INFO = "¿Guardar AlbumInfo.txt?('0'-No,'1'-Sí):"
CHANGE_DOWNLOAD_VIDEOS = "Download videos (when downloading playlists, albums, mixes)('0'-No,'1'-Yes):"
CHANGE_ADD_LYRICS = "¿Añadir letras?('0'-No,'1'-Sí):"
CHANGE_LYRICS_SERVER_PROXY = "¿Proxy del servidor de letras?('0' no modificar):"
CHANGE_ADD_LRC_FILE = "¿Añadir letras cronometradas en un archivo .lrc? ('0'-No,'1'-Sí):"
CHANGE_ADD_TYPE_FOLDER = "Añadir tipo de carpeta, ej: Album/Video/Playlist('0'-No,'1'-Sí):"
CHANGE_MULITHREAD_DOWNLOAD = "¿Descarga Multi-hilo?('0'-No,'1'-Sí:"
CHANGE_USE_DOWNLOAD_DELAY = "Use Download Delay('0'-No,'1'-Yes):"
# {} are required in these strings
AUTH_START_LOGIN = "Iniciando sesión..."
@@ -108,8 +115,8 @@ class LangSpanish(object):
MODEL_PLAYLIST_PROPERTY = "PROPIEDAD-DE-PLAYLIST"
MODEL_TITLE = 'Título'
MODEL_TRACK_NUMBER = 'Numero de pistas'
MODEL_VIDEO_NUMBER = 'Numero de videos'
MODEL_TRACK_NUMBER = 'Número de pistas'
MODEL_VIDEO_NUMBER = 'Número de videos'
MODEL_RELEASE_DATE = 'Fecha de lanzamiento'
MODEL_VERSION = 'Versión'
MODEL_EXPLICIT = 'Explícito'
+10 -3
View File
@@ -30,17 +30,20 @@ class LangTurkish(object):
SETTING_USE_PLAYLIST_FOLDER = "Albümler klasör halinde indirilsin mi ?"
SETTING_MULITHREAD_DOWNLOAD = "Şarkılar tek tek indirilsin mi?"
SETTING_ALBUM_FOLDER_FORMAT = "Klasör ismi formatı:"
SETTING_PLAYLIST_FOLDER_FORMAT = "Playlist folder format"
SETTING_TRACK_FILE_FORMAT = "Dosya ismi formatı:"
SETTING_VIDEO_FILE_FORMAT = "Video file format"
SETTING_SHOW_PROGRESS = "İndirme Çubuğu Görüntüleme:"
SETTING_SHOW_TRACKINFO = "Show Track Info"
SETTING_SAVE_ALBUMINFO = "Save AlbumInfo.txt"
SETTING_DOWNLOAD_VIDEOS = "Download videos"
SETTING_ADD_LYRICS = "Add lyrics"
SETTING_LYRICS_SERVER_PROXY = "Lyrics server proxy"
SETTING_ADD_LRC_FILE = "Save timed lyrics (.lrc file)"
SETTING_PATH = "Settings path"
SETTINGS_ADD_LRC_FILE = "Save timed lyrics (.lrc file)"
SETTING_APIKEY = "APIKey support"
SETTING_ADD_TYPE_FOLDER = "Add Type-Folder"
SETTING_DOWNLOAD_DELAY = "Use Download Delay"
CHOICE = "Seçim"
FUNCTION = "İşlemler"
@@ -65,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): "
@@ -79,15 +82,19 @@ class LangTurkish(object):
CHANGE_SAVE_COVERS = ">>> Albüm kapağı indirilsin mi?('0'-Hayır,'1'-Evet): "
CHANGE_LANGUAGE = ">>> Lisan Seç "
CHANGE_ALBUM_FOLDER_FORMAT = "Albüm Klasör İsmi Formatı('0' aynı kalsın):"
CHANGE_PLAYLIST_FOLDER_FORMAT = "Playlist folder format('0'-not modify,'default'-to set default):"
CHANGE_TRACK_FILE_FORMAT = "Dosya İsmi Formatı('0' aynı kalsın):"
CHANGE_VIDEO_FILE_FORMAT = "Video file format('0'-not modify,'default'-to set default):"
CHANGE_SHOW_PROGRESS = "İndirme Çubuğu Görüntülensin mi?('0'-Hayır,'1'-Evet):"
CHANGE_SHOW_TRACKINFO = "Show track info('0'-No,'1'-Yes):"
CHANGE_SAVE_ALBUM_INFO = "Save AlbumInfo.txt('0'-No,'1'-Yes):"
CHANGE_DOWNLOAD_VIDEOS = "Download videos (when downloading playlists, albums, mixes)('0'-No,'1'-Yes):"
CHANGE_ADD_LYRICS = "Add lyrics('0'-No,'1'-Yes):"
CHANGE_LYRICS_SERVER_PROXY = "Lyrics server proxy('0' not modify):"
CHANGE_LYRICS_SERVER_PROXY = "Lyrics server proxy('0'-not modify):"
CHANGE_ADD_LRC_FILE = "Save timed lyrics .lrc file ('0'-No,'1'-Yes):"
CHANGE_ADD_TYPE_FOLDER = "Add Type-Folder,eg Album/Video/Playlist('0'-No,'1'-Yes):"
CHANGE_MULITHREAD_DOWNLOAD = "Multi thread download('0'-No,'1'-Yes):"
CHANGE_USE_DOWNLOAD_DELAY = "Use Download Delay('0'-No,'1'-Yes):"
# {} are required in these strings
AUTH_START_LOGIN = "Giriş işlemleri başlatıldı..."
+9 -2
View File
@@ -30,17 +30,20 @@ class LangUkrainian(object):
SETTING_USE_PLAYLIST_FOLDER = "Використовувати папку плейлиста"
SETTING_MULITHREAD_DOWNLOAD = "Багатопоточне завантаження"
SETTING_ALBUM_FOLDER_FORMAT = "Формат папки альбому"
SETTING_PLAYLIST_FOLDER_FORMAT = "Playlist folder format"
SETTING_TRACK_FILE_FORMAT = "Формат файлу треку"
SETTING_VIDEO_FILE_FORMAT = "Video file format"
SETTING_SHOW_PROGRESS = "Показувати прогрес"
SETTING_SHOW_TRACKINFO = "Показувати інформацію про трек"
SETTING_SAVE_ALBUMINFO = "Зберігати AlbumInfo.txt"
SETTING_DOWNLOAD_VIDEOS = "Download videos"
SETTING_ADD_LYRICS = "Додавати тексти пісень"
SETTING_LYRICS_SERVER_PROXY = "Проксі для сервера з текстами пісень"
SETTING_ADD_LRC_FILE = "Зберігати тексти з відмітками часу (.lrc файл)"
SETTING_PATH = "Шлях налаштувань"
SETTINGS_ADD_LRC_FILE = "Зберігати тексти з відмітками часу (.lrc файл)"
SETTING_APIKEY = "Підтримка ключа API"
SETTING_ADD_TYPE_FOLDER = "Додавати папку-тип"
SETTING_DOWNLOAD_DELAY = "Use Download Delay"
CHOICE = "ВИБІР"
FUNCTION = "ФУНКЦІЇ"
@@ -65,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'-Так):"
@@ -79,15 +82,19 @@ class LangUkrainian(object):
CHANGE_SAVE_COVERS = "Зберігати обкладинки('0'-Ні,'1'-Так):"
CHANGE_LANGUAGE = "Обрати мову"
CHANGE_ALBUM_FOLDER_FORMAT = "Формат теки альбому('0'-не змінювати):"
CHANGE_PLAYLIST_FOLDER_FORMAT = "Playlist folder format('0'-not modify,'default'-to set default):"
CHANGE_TRACK_FILE_FORMAT = "Формат файлу треку('0'-не змінювати):"
CHANGE_VIDEO_FILE_FORMAT = "Video file format('0'-not modify,'default'-to set default):"
CHANGE_SHOW_PROGRESS = "Показувати прогрес('0'-Ні,'1'-Так):"
CHANGE_SHOW_TRACKINFO = "Показувати інформацію про трек('0'-Ні,'1'-Так):"
CHANGE_SAVE_ALBUM_INFO = "Зберігати AlbumInfo.txt('0'-Ні,'1'-Так):"
CHANGE_DOWNLOAD_VIDEOS = "Download videos (when downloading playlists, albums, mixes)('0'-No,'1'-Yes):"
CHANGE_ADD_LYRICS = "Додавати тексти пісень('0'-Ні,'1'-Так):"
CHANGE_LYRICS_SERVER_PROXY = "Проксі для сервера з текстами пісень('0'-не змінювати):"
CHANGE_ADD_LRC_FILE = "Зберігати тексти пісень з відмітками часу в .lrc файл('0'-Ні,'1'-Так):"
CHANGE_ADD_TYPE_FOLDER = "Додавати теку-тип,наприклад Альбом/Відео/Плейлист('0'-Ні,'1'-Так):"
CHANGE_MULITHREAD_DOWNLOAD = "Multi thread download('0'-No,'1'-Yes):"
CHANGE_USE_DOWNLOAD_DELAY = "Use Download Delay('0'-No,'1'-Yes):"
# {} are required in these strings
AUTH_START_LOGIN = "Початок процесу авторизації..."
+9 -2
View File
@@ -30,17 +30,20 @@ class LangVietnamese(object):
SETTING_USE_PLAYLIST_FOLDER = "Thư mục cho danh sách phát"
SETTING_MULITHREAD_DOWNLOAD = "Tải về đa luồng"
SETTING_ALBUM_FOLDER_FORMAT = "Định dạng thư mục album"
SETTING_PLAYLIST_FOLDER_FORMAT = "Playlist folder format"
SETTING_TRACK_FILE_FORMAT = "Định dạng tên tệp nhạc"
SETTING_VIDEO_FILE_FORMAT = "Video file format"
SETTING_SHOW_PROGRESS = "Hiện tiến trình"
SETTING_SHOW_TRACKINFO = "Hiện thông tin bài"
SETTING_SAVE_ALBUMINFO = "Lưu AlbumInfo.txt"
SETTING_DOWNLOAD_VIDEOS = "Download videos"
SETTING_ADD_LYRICS = "Thêm lời bài hát"
SETTING_LYRICS_SERVER_PROXY = "Máy chủ proxy cho lyrics"
SETTINGS_ADD_LRC_FILE = "Lưu timed lyrics (tệp .lrc)"
SETTING_ADD_LRC_FILE = "Lưu timed lyrics (tệp .lrc)"
SETTING_PATH = "Đường dẫn cài đặt"
SETTING_APIKEY = "Hỗ trợ APIKey"
SETTING_ADD_TYPE_FOLDER = "Thêm Loại-Thư mục"
SETTING_DOWNLOAD_DELAY = "Use Download Delay"
CHOICE = "LỰA CHỌN"
FUNCTION = "CHỨC NĂNG"
@@ -65,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ó):"
@@ -79,15 +82,19 @@ class LangVietnamese(object):
CHANGE_SAVE_COVERS = "Tải ảnh bìa('0'-Không,'1'-Có):"
CHANGE_LANGUAGE = "Chọn ngôn ngữ"
CHANGE_ALBUM_FOLDER_FORMAT = "Định dạng thư mục album('0' không đổi,'default' để đặt về mặc định):"
CHANGE_PLAYLIST_FOLDER_FORMAT = "Playlist folder format('0'-not modify,'default'-to set default):"
CHANGE_TRACK_FILE_FORMAT = "Định dạng tên tệp nhạc('0' không đổi,'default' để đặt về mặc định):"
CHANGE_VIDEO_FILE_FORMAT = "Video file format('0'-not modify,'default'-to set default):"
CHANGE_SHOW_PROGRESS = "Hiện tiến trình('0'-Không,'1'-Có):"
CHANGE_SHOW_TRACKINFO = "Hiện thông tin bài('0'-Không,'1'-Có):"
CHANGE_SAVE_ALBUM_INFO = "Lưu AlbumInfo.txt('0'-Không,'1'-Có):"
CHANGE_DOWNLOAD_VIDEOS = "Download videos (when downloading playlists, albums, mixes)('0'-No,'1'-Yes):"
CHANGE_ADD_LYRICS = "Thêm lời bài hát('0'-Không,'1'-Có):"
CHANGE_LYRICS_SERVER_PROXY = "Máy chủ proxy cho lyrics('0' không đổi):"
CHANGE_ADD_LRC_FILE = "Lưu timed lyrics tệp .lrc ('0'-Không,'1'-Có):"
CHANGE_ADD_TYPE_FOLDER = "Thêm Loại-Thư mục, ví dụ Album/Video/Playlist('0'-Không,'1'-Có):"
CHANGE_MULITHREAD_DOWNLOAD = "Multi thread download('0'-No,'1'-Yes):"
CHANGE_USE_DOWNLOAD_DELAY = "Use Download Delay('0'-No,'1'-Yes):"
# {} are required in these strings
AUTH_START_LOGIN = "Đang bắt đầu đăng nhập..."
+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
+17 -10
View File
@@ -6,14 +6,14 @@
@Author : Yaronzz
@Version : 1.0
@Contact : yaronhuang@foxmail.com
@Desc :
@Desc :
"""
import os
import aigpy
import datetime
from tidal_dl.tidal import *
from tidal_dl.settings import *
from tidal import *
from settings import *
def __fixPath__(name: str):
@@ -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 + "] "
@@ -80,11 +82,16 @@ def getAlbumPath(album):
retpath = retpath.strip()
return f"{SETTINGS.downloadPath}/{retpath}"
def getPlaylistPath(playlist):
# name
name = __fixPath__(playlist.title)
return f"{SETTINGS.downloadPath}/Playlist/{name}"
playlistName = __fixPath__(playlist.title)
# retpath
retpath = SETTINGS.playlistFolderFormat
if retpath is None or len(retpath) <= 0:
retpath = SETTINGS.getDefaultPlaylistFolderFormat()
retpath = retpath.replace(R"{PlaylistUUID}", str(playlist.uuid))
retpath = retpath.replace(R"{PlaylistName}", playlistName)
return f"{SETTINGS.downloadPath}/{retpath}"
def getTrackPath(track, stream, album=None, playlist=None):
@@ -112,8 +119,8 @@ def getTrackPath(track, stream, album=None, playlist=None):
explicit = "(Explicit)" if track.explicit else ''
# album and addyear
albumName = __fixPath__(album.title)
year = __getYear__(album.releaseDate)
albumName = __fixPath__(album.title) if album is not None else ''
year = __getYear__(album.releaseDate) if album is not None else ''
# extension
extension = __getExtension__(stream)
+100 -85
View File
@@ -6,21 +6,23 @@
@Author : Yaronzz
@Version : 3.0
@Contact : yaronhuang@foxmail.com
@Desc :
@Desc :
'''
from pickle import GLOBAL
import threading
import aigpy
import logging
import prettytable
import tidal_dl.apiKey as apiKey
import apiKey as apiKey
from tidal_dl.model import *
from tidal_dl.paths import *
from tidal_dl.settings import *
from tidal_dl.lang.language import *
from model import *
from paths import *
from settings import *
from lang.language import *
VERSION = '2022.06.23.1'
VERSION = '2022.10.31.1'
__LOGO__ = f'''
/$$$$$$$$ /$$ /$$ /$$ /$$ /$$
|__ $$__/|__/ | $$ | $$ | $$| $$
@@ -30,13 +32,13 @@ __LOGO__ = f'''
| $$ | $$| $$ | $$ /$$__ $$| $$ | $$ | $$| $$
| $$ | $$| $$$$$$$| $$$$$$$| $$ | $$$$$$$| $$
|__/ |__/ \_______/ \_______/|__/ \_______/|__/
https://github.com/yaronzz/Tidal-Media-Downloader
https://github.com/yaronzz/Tidal-Media-Downloader
{VERSION}
'''
print_mutex = threading.Lock()
class Printf(object):
@@ -54,7 +56,7 @@ class Printf(object):
for item in rows:
tb.add_row(item)
return tb
@staticmethod
def usage():
print("=============TIDAL-DL HELP==============")
@@ -68,57 +70,61 @@ class Printf(object):
["-r or --resolution", "video resolution('P1080', 'P720', 'P480', 'P360')"]
])
print(tb)
@staticmethod
def checkVersion():
onlineVer = aigpy.pip.getLastVersion('tidal-dl')
if onlineVer is None:
if onlineVer is not None:
icmp = aigpy.system.cmpVersion(onlineVer, VERSION)
if icmp > 0:
Printf.info(LANG.PRINT_LATEST_VERSION + ' ' + onlineVer)
Printf.info(LANG.select.PRINT_LATEST_VERSION + ' ' + onlineVer)
@staticmethod
def settings():
data = SETTINGS
tb = Printf.__gettable__([LANG.SETTING, LANG.VALUE], [
tb = Printf.__gettable__([LANG.select.SETTING, LANG.select.VALUE], [
#settings - path and format
[LANG.SETTING_PATH, getProfilePath()],
[LANG.SETTING_DOWNLOAD_PATH, data.downloadPath],
[LANG.SETTING_ALBUM_FOLDER_FORMAT, data.albumFolderFormat],
[LANG.SETTING_TRACK_FILE_FORMAT, data.trackFileFormat],
[LANG.SETTING_VIDEO_FILE_FORMAT, data.videoFileFormat],
[LANG.select.SETTING_PATH, getProfilePath()],
[LANG.select.SETTING_DOWNLOAD_PATH, data.downloadPath],
[LANG.select.SETTING_ALBUM_FOLDER_FORMAT, data.albumFolderFormat],
[LANG.select.SETTING_PLAYLIST_FOLDER_FORMAT, data.playlistFolderFormat],
[LANG.select.SETTING_TRACK_FILE_FORMAT, data.trackFileFormat],
[LANG.select.SETTING_VIDEO_FILE_FORMAT, data.videoFileFormat],
#settings - quality
[LANG.SETTING_AUDIO_QUALITY, data.audioQuality],
[LANG.SETTING_VIDEO_QUALITY, data.videoQuality],
[LANG.select.SETTING_AUDIO_QUALITY, data.audioQuality],
[LANG.select.SETTING_VIDEO_QUALITY, data.videoQuality],
#settings - else
[LANG.SETTING_USE_PLAYLIST_FOLDER, data.usePlaylistFolder],
[LANG.SETTING_CHECK_EXIST, data.checkExist],
[LANG.SETTING_SHOW_PROGRESS, data.showProgress],
[LANG.SETTING_SHOW_TRACKINFO, data.showTrackInfo],
[LANG.SETTING_SAVE_ALBUMINFO, data.saveAlbumInfo],
[LANG.SETTING_SAVE_COVERS, data.saveCovers],
[LANG.SETTING_INCLUDE_EP, data.includeEP],
[LANG.SETTING_LANGUAGE, getLangName(data.language)],
[LANG.SETTINGS_ADD_LRC_FILE, data.lyricFile],
[LANG.SETTING_APIKEY, f"[{data.apiKeyIndex}]" + apiKey.getItem(data.apiKeyIndex)['formats']]
[LANG.select.SETTING_USE_PLAYLIST_FOLDER, data.usePlaylistFolder],
[LANG.select.SETTING_CHECK_EXIST, data.checkExist],
[LANG.select.SETTING_SHOW_PROGRESS, data.showProgress],
[LANG.select.SETTING_SHOW_TRACKINFO, data.showTrackInfo],
[LANG.select.SETTING_SAVE_ALBUMINFO, data.saveAlbumInfo],
[LANG.select.SETTING_DOWNLOAD_VIDEOS, data.downloadVideos],
[LANG.select.SETTING_SAVE_COVERS, data.saveCovers],
[LANG.select.SETTING_INCLUDE_EP, data.includeEP],
[LANG.select.SETTING_LANGUAGE, LANG.getLangName(data.language)],
[LANG.select.SETTING_ADD_LRC_FILE, data.lyricFile],
[LANG.select.SETTING_MULITHREAD_DOWNLOAD, data.multiThread],
[LANG.select.SETTING_APIKEY, f"[{data.apiKeyIndex}]" + apiKey.getItem(data.apiKeyIndex)['formats']],
[LANG.select.SETTING_DOWNLOAD_DELAY, data.downloadDelay],
])
print(tb)
@staticmethod
def choices():
print("====================================================")
tb = Printf.__gettable__([LANG.CHOICE, LANG.FUNCTION], [
[aigpy.cmd.green(LANG.CHOICE_ENTER + " '0':"), LANG.CHOICE_EXIT],
[aigpy.cmd.green(LANG.CHOICE_ENTER + " '1':"), LANG.CHOICE_LOGIN],
[aigpy.cmd.green(LANG.CHOICE_ENTER + " '2':"), LANG.CHOICE_LOGOUT],
[aigpy.cmd.green(LANG.CHOICE_ENTER + " '3':"), LANG.CHOICE_SET_ACCESS_TOKEN],
[aigpy.cmd.green(LANG.CHOICE_ENTER + " '4':"), LANG.CHOICE_SETTINGS + '-Path'],
[aigpy.cmd.green(LANG.CHOICE_ENTER + " '5':"), LANG.CHOICE_SETTINGS + '-Quality'],
[aigpy.cmd.green(LANG.CHOICE_ENTER + " '6':"), LANG.CHOICE_SETTINGS + '-Else'],
[aigpy.cmd.green(LANG.CHOICE_ENTER + " '7':"), LANG.CHOICE_APIKEY],
[aigpy.cmd.green(LANG.CHOICE_ENTER_URLID), LANG.CHOICE_DOWNLOAD_BY_URL],
tb = Printf.__gettable__([LANG.select.CHOICE, LANG.select.FUNCTION], [
[aigpy.cmd.green(LANG.select.CHOICE_ENTER + " '0':"), LANG.select.CHOICE_EXIT],
[aigpy.cmd.green(LANG.select.CHOICE_ENTER + " '1':"), LANG.select.CHOICE_LOGIN],
[aigpy.cmd.green(LANG.select.CHOICE_ENTER + " '2':"), LANG.select.CHOICE_LOGOUT],
[aigpy.cmd.green(LANG.select.CHOICE_ENTER + " '3':"), LANG.select.CHOICE_SET_ACCESS_TOKEN],
[aigpy.cmd.green(LANG.select.CHOICE_ENTER + " '4':"), LANG.select.CHOICE_SETTINGS + '-Path'],
[aigpy.cmd.green(LANG.select.CHOICE_ENTER + " '5':"), LANG.select.CHOICE_SETTINGS + '-Quality'],
[aigpy.cmd.green(LANG.select.CHOICE_ENTER + " '6':"), LANG.select.CHOICE_SETTINGS + '-Else'],
[aigpy.cmd.green(LANG.select.CHOICE_ENTER + " '7':"), LANG.select.CHOICE_APIKEY],
[aigpy.cmd.green(LANG.select.CHOICE_ENTER_URLID), LANG.select.CHOICE_DOWNLOAD_BY_URL],
])
tb.set_style(prettytable.PLAIN_COLUMNS)
print(tb)
@@ -129,7 +135,7 @@ class Printf(object):
aigpy.cmd.colorPrint(string, aigpy.cmd.TextColor.Yellow, None)
ret = input("")
return ret
@staticmethod
def enterBool(string):
aigpy.cmd.colorPrint(string, aigpy.cmd.TextColor.Yellow, None)
@@ -143,7 +149,7 @@ class Printf(object):
if ret == retWord:
return default
elif ret == "":
print(aigpy.cmd.red(LANG.PRINT_ERR + " ") + errmsg)
print(aigpy.cmd.red(LANG.select.PRINT_ERR + " ") + errmsg)
else:
break
return ret
@@ -153,7 +159,7 @@ class Printf(object):
while True:
ret = aigpy.cmd.inputLimit(aigpy.cmd.yellow(string), limit)
if ret is None:
print(aigpy.cmd.red(LANG.PRINT_ERR + " ") + errmsg)
print(aigpy.cmd.red(LANG.select.PRINT_ERR + " ") + errmsg)
else:
break
return ret
@@ -169,27 +175,36 @@ class Printf(object):
@staticmethod
def err(string):
print(aigpy.cmd.red(LANG.PRINT_ERR + " ") + string)
global print_mutex
print_mutex.acquire()
print(aigpy.cmd.red(LANG.select.PRINT_ERR + " ") + string)
# logging.error(string)
print_mutex.release()
@staticmethod
def info(string):
print(aigpy.cmd.blue(LANG.PRINT_INFO + " ") + string)
global print_mutex
print_mutex.acquire()
print(aigpy.cmd.blue(LANG.select.PRINT_INFO + " ") + string)
print_mutex.release()
@staticmethod
def success(string):
print(aigpy.cmd.green(LANG.PRINT_SUCCESS + " ") + string)
global print_mutex
print_mutex.acquire()
print(aigpy.cmd.green(LANG.select.PRINT_SUCCESS + " ") + string)
print_mutex.release()
@staticmethod
def album(data: Album):
tb = Printf.__gettable__([LANG.MODEL_ALBUM_PROPERTY, LANG.VALUE], [
[LANG.MODEL_TITLE, data.title],
tb = Printf.__gettable__([LANG.select.MODEL_ALBUM_PROPERTY, LANG.select.VALUE], [
[LANG.select.MODEL_TITLE, data.title],
["ID", data.id],
[LANG.MODEL_TRACK_NUMBER, data.numberOfTracks],
[LANG.MODEL_VIDEO_NUMBER, data.numberOfVideos],
[LANG.MODEL_RELEASE_DATE, data.releaseDate],
[LANG.MODEL_VERSION, data.version],
[LANG.MODEL_EXPLICIT, data.explicit],
[LANG.select.MODEL_TRACK_NUMBER, data.numberOfTracks],
[LANG.select.MODEL_VIDEO_NUMBER, data.numberOfVideos],
[LANG.select.MODEL_RELEASE_DATE, data.releaseDate],
[LANG.select.MODEL_VERSION, data.version],
[LANG.select.MODEL_EXPLICIT, data.explicit],
])
print(tb)
logging.info("====album " + str(data.id) + "====\n" +
@@ -200,12 +215,12 @@ class Printf(object):
@staticmethod
def track(data: Track, stream: StreamUrl = None):
tb = Printf.__gettable__([LANG.MODEL_TRACK_PROPERTY, LANG.VALUE], [
[LANG.MODEL_TITLE, data.title],
tb = Printf.__gettable__([LANG.select.MODEL_TRACK_PROPERTY, LANG.select.VALUE], [
[LANG.select.MODEL_TITLE, data.title],
["ID", data.id],
[LANG.MODEL_ALBUM, data.album.title],
[LANG.MODEL_VERSION, data.version],
[LANG.MODEL_EXPLICIT, data.explicit],
[LANG.select.MODEL_ALBUM, data.album.title],
[LANG.select.MODEL_VERSION, data.version],
[LANG.select.MODEL_EXPLICIT, data.explicit],
["Max-Q", data.audioQuality],
])
if stream is not None:
@@ -219,11 +234,11 @@ class Printf(object):
@staticmethod
def video(data: Video, stream: VideoStreamUrl = None):
tb = Printf.__gettable__([LANG.MODEL_VIDEO_PROPERTY, LANG.VALUE], [
[LANG.MODEL_TITLE, data.title],
[LANG.MODEL_ALBUM, data.album.title if data.album != None else None],
[LANG.MODEL_VERSION, data.version],
[LANG.MODEL_EXPLICIT, data.explicit],
tb = Printf.__gettable__([LANG.select.MODEL_VIDEO_PROPERTY, LANG.select.VALUE], [
[LANG.select.MODEL_TITLE, data.title],
[LANG.select.MODEL_ALBUM, data.album.title if data.album != None else None],
[LANG.select.MODEL_VERSION, data.version],
[LANG.select.MODEL_EXPLICIT, data.explicit],
["Max-Q", data.quality],
])
if stream is not None:
@@ -237,11 +252,11 @@ class Printf(object):
@staticmethod
def artist(data: Artist, num):
tb = Printf.__gettable__([LANG.MODEL_ARTIST_PROPERTY, LANG.VALUE], [
[LANG.MODEL_ID, data.id],
[LANG.MODEL_NAME, data.name],
tb = Printf.__gettable__([LANG.select.MODEL_ARTIST_PROPERTY, LANG.select.VALUE], [
[LANG.select.MODEL_ID, data.id],
[LANG.select.MODEL_NAME, data.name],
["Number of albums", num],
[LANG.MODEL_TYPE, str(data.type)],
[LANG.select.MODEL_TYPE, str(data.type)],
])
print(tb)
logging.info("====artist " + str(data.id) + "====\n" +
@@ -251,10 +266,10 @@ class Printf(object):
@staticmethod
def playlist(data):
tb = Printf.__gettable__([LANG.MODEL_PLAYLIST_PROPERTY, LANG.VALUE], [
[LANG.MODEL_TITLE, data.title],
[LANG.MODEL_TRACK_NUMBER, data.numberOfTracks],
[LANG.MODEL_VIDEO_NUMBER, data.numberOfVideos],
tb = Printf.__gettable__([LANG.select.MODEL_PLAYLIST_PROPERTY, LANG.select.VALUE], [
[LANG.select.MODEL_TITLE, data.title],
[LANG.select.MODEL_TRACK_NUMBER, data.numberOfTracks],
[LANG.select.MODEL_VIDEO_NUMBER, data.numberOfVideos],
])
print(tb)
logging.info("====playlist " + str(data.uuid) + "====\n" +
@@ -265,10 +280,10 @@ class Printf(object):
@staticmethod
def mix(data):
tb = Printf.__gettable__([LANG.MODEL_PLAYLIST_PROPERTY, LANG.VALUE], [
[LANG.MODEL_ID, data.id],
[LANG.MODEL_TRACK_NUMBER, len(data.tracks)],
[LANG.MODEL_VIDEO_NUMBER, len(data.videos)],
tb = Printf.__gettable__([LANG.select.MODEL_PLAYLIST_PROPERTY, LANG.select.VALUE], [
[LANG.select.MODEL_ID, data.id],
[LANG.select.MODEL_TRACK_NUMBER, len(data.tracks)],
[LANG.select.MODEL_VIDEO_NUMBER, len(data.videos)],
])
print(tb)
logging.info("====Mix " + str(data.id) + "====\n" +
@@ -280,15 +295,15 @@ class Printf(object):
def apikeys(items):
print("-------------API-KEYS---------------")
tb = prettytable.PrettyTable()
tb.field_names = [aigpy.cmd.green('Index'),
tb.field_names = [aigpy.cmd.green('Index'),
aigpy.cmd.green('Valid'),
aigpy.cmd.green('Platform'),
aigpy.cmd.green('Platform'),
aigpy.cmd.green('Formats'), ]
tb.align = 'l'
for index, item in enumerate(items):
tb.add_row([str(index),
tb.add_row([str(index),
aigpy.cmd.green('True') if item["valid"] == "True" else aigpy.cmd.red('False'),
item["platform"],
item["platform"],
item["formats"]])
print(tb)
+13 -3
View File
@@ -12,7 +12,8 @@ import json
import aigpy
import base64
from tidal_dl.enums import *
from lang.language import *
from enums import *
class Settings(aigpy.model.ModelBase):
@@ -25,18 +26,24 @@ class Settings(aigpy.model.ModelBase):
showProgress = True
showTrackInfo = True
saveAlbumInfo = False
downloadVideos = True
multiThread = False
downloadDelay = True
downloadPath = "./download/"
audioQuality = AudioQuality.Normal
videoQuality = VideoQuality.P360
usePlaylistFolder = True
albumFolderFormat = R"{ArtistName}/{Flag} {AlbumTitle} [{AlbumID}] [{AlbumYear}]"
playlistFolderFormat = R"Playlist/{PlaylistName} [{PlaylistUUID}]"
trackFileFormat = R"{TrackNumber} - {ArtistName} - {TrackTitle}{ExplicitFlag}"
videoFileFormat = R"{VideoNumber} - {ArtistName} - {VideoTitle}{ExplicitFlag}"
def getDefaultPathFormat(self, type: Type):
if type == Type.Album:
return R"{ArtistName}/{Flag} {AlbumTitle} [{AlbumID}] [{AlbumYear}]"
elif type == Type.Playlist:
return R"Playlist/{PlaylistName} [{PlaylistUUID}]"
elif type == Type.Track:
return R"{TrackNumber} - {ArtistName} - {TrackTitle}{ExplicitFlag}"
elif type == Type.Video:
@@ -54,7 +61,7 @@ class Settings(aigpy.model.ModelBase):
if item.name == value:
return item
return VideoQuality.P360
def read(self, path):
self._path_ = path
txt = aigpy.file.getContent(self._path_)
@@ -70,11 +77,15 @@ class Settings(aigpy.model.ModelBase):
self.albumFolderFormat = self.getDefaultPathFormat(Type.Album)
if self.trackFileFormat is None:
self.trackFileFormat = self.getDefaultPathFormat(Type.Track)
if self.playlistFolderFormat is None:
self.playlistFolderFormat = self.getDefaultPathFormat(Type.Playlist)
if self.videoFileFormat is None:
self.videoFileFormat = self.getDefaultPathFormat(Type.Video)
if self.apiKeyIndex is None:
self.apiKeyIndex = 0
LANG.setLang(self.language)
def save(self):
data = aigpy.model.modelToDict(self)
data['audioQuality'] = self.audioQuality.name
@@ -83,7 +94,6 @@ class Settings(aigpy.model.ModelBase):
aigpy.file.write(self._path_, txt, 'w+')
class TokenSettings(aigpy.model.ModelBase):
userid = None
countryCode = None
+110 -11
View File
@@ -8,13 +8,16 @@
@Contact : yaronhuang@foxmail.com
@Desc : tidal api
'''
import json
import aigpy
import base64
import random
import re
import time
from typing import List
from xml.etree import ElementTree
import requests
from tidal_dl.model import *
from tidal_dl.enums import *
from model import *
from settings import *
# SSL Warnings | retry number
requests.packages.urllib3.disable_warnings()
@@ -35,6 +38,22 @@ class TidalAPI(object):
for index in range(0, 3):
try:
respond = requests.get(urlpre + path, headers=header, params=params)
if respond.url.find("playbackinfopostpaywall") != -1 and SETTINGS.downloadDelay is not False:
# random sleep between 0.5 and 5 seconds and print it
sleep_time = random.randint(500, 5000) / 1000
print(
f"Sleeping for {sleep_time} seconds, to mimic human behaviour and prevent too many requests error")
time.sleep(sleep_time)
if respond.status_code == 429:
print('Too many requests, waiting for 20 seconds...')
# Loop countdown 20 seconds and print the remaining time
for i in range(20, 0, -1):
time.sleep(1)
print(i, end=' ')
print('')
continue
result = json.loads(respond.text)
if 'status' not in result:
return result
@@ -87,12 +106,12 @@ class TidalAPI(object):
return ret
def __post__(self, path, data, auth=None, urlpre='https://auth.tidal.com/v1/oauth2'):
for index in range(0, 3):
for index in range(3):
try:
result = requests.post(urlpre+path, data=data, auth=auth, verify=False).json()
result = requests.post(urlpre + path, data=data, auth=auth, verify=False).json()
return result
except Exception as e:
if index >= 3:
if index == 2:
raise e
def getDeviceCode(self) -> str:
@@ -137,6 +156,7 @@ class TidalAPI(object):
def verifyAccessToken(self, accessToken) -> bool:
header = {'authorization': 'Bearer {}'.format(accessToken)}
result = requests.get('https://api.tidal.com/v1/sessions', headers=header).json()
if 'status' in result and result['status'] != 200:
return False
return True
@@ -168,11 +188,12 @@ class TidalAPI(object):
if not aigpy.string.isNull(userid):
if str(result['userId']) != str(userid):
raise Exception("User mismatch! Please use your own accesstoken.",)
raise Exception("User mismatch! Please use your own accesstoken.", )
self.key.userId = result['userId']
self.key.countryCode = result['countryCode']
self.key.accessToken = accessToken
return
def getAlbum(self, id) -> Album:
@@ -180,6 +201,13 @@ class TidalAPI(object):
def getPlaylist(self, id) -> Playlist:
return aigpy.model.dictToModel(self.__get__('playlists/' + str(id)), Playlist())
def getPlaylistSelf(self) -> List[Playlist]:
ret = self.__get__(f'users/{self.key.userId}/playlists')
playlists = []
for item in ret['items']:
playlists.append(aigpy.model.dictToModel(item, Playlist()))
return playlists
def getArtist(self, id) -> Artist:
return aigpy.model.dictToModel(self.__get__('artists/' + str(id)), Artist())
@@ -213,6 +241,7 @@ class TidalAPI(object):
def search(self, text: str, type: Type, offset: int = 0, limit: int = 10) -> SearchResult:
typeStr = type.name.upper() + "S"
if type == Type.Null:
typeStr = "ARTISTS,ALBUMS,TRACKS,VIDEOS,PLAYLISTS"
@@ -252,7 +281,7 @@ class TidalAPI(object):
tracks = []
videos = []
for item in data:
if item['type'] == 'track':
if item['type'] == 'track' and item['item']['streamReady']:
tracks.append(aigpy.model.dictToModel(item['item'], Track()))
else:
videos.append(aigpy.model.dictToModel(item['item'], Video()))
@@ -268,6 +297,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:
@@ -276,6 +359,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)
@@ -289,7 +374,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
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):
@@ -315,6 +413,8 @@ class TidalAPI(object):
return self.__get__(f'tracks/{str(id)}/contributors')
def getCoverUrl(self, sid, width="320", height="320"):
if sid is None:
return ""
return f"https://resources.tidal.com/images/{sid.replace('-', '/')}/{width}x{height}.jpg"
def getCoverData(self, sid, width="320", height="320"):
@@ -383,6 +483,5 @@ class TidalAPI(object):
raise Exception("No result.")
# Singleton
TIDAL_API = TidalAPI()
+15 -3
View File
@@ -1,11 +1,23 @@
TYPE tidal-dl
USE pip3 install tidal-dl --upgrade
#### v2022-10-31
- [X] Add delay setting by @grzekru
#### v2022-08-29
- [X] Fix #931
#### v2022-07-06
- [X] Mulithread download
#### v2022-06-23
1. [X] remove redundant configuration
2. [X] add simple-gui
3. [X] optimize code
- [X] remove redundant configuration
- [X] add simple-gui
- [X] optimize code
#### v2022-03-04
-58
View File
@@ -1,58 +0,0 @@
cd TIDALDL-PY
rm -rf dist
rm -rf build
rm -rf exe/tidal-dl.exe
rm MANIFEST.in
rm -rf tidal_dl.egg-info
rm -rf tidal_gui.egg-info
rm -rf tidal_dl_test.egg-info
mkdir exe
# pack
python setup.py sdist bdist_wheel
# creat exe file
pyinstaller -F tidal_dl/__init__.py
# rename exe name
mv dist/__init__.exe exe/tidal-dl.exe
pip uninstall -y tidal-dl
# creat requirements.txt
# pipreqs ./ --force --encoding=utf8
# python setup.py install
# upload
twine upload dist/*
cd TIDALDL-PY
rm -rf dist
rm -rf build
rm -rf exe/tidal-gui.exe
cp -rf guiStatic.in MANIFEST.in
rm -rf tidal_dl.egg-info
rm -rf tidal_gui.egg-info
rm -rf tidal_dl_test.egg-info
# pack
python setup-gui.py sdist bdist_wheel
# creat exe file
pyinstaller -F tidal_gui/__init__.py -w
pyinstaller -F -w -p C:/Windows/System32/downlevel tidal_gui/__init__.py
# rename exe name
mv dist/__init__.exe exe/tidal-gui.exe
pip uninstall -y tidal-gui
# upload
twine upload dist/*
+20
View File
@@ -0,0 +1,20 @@
rm -rf dist
rm -rf build
rm -rf __init__.spec
cd TIDALDL-PY
rm -rf __init__.spec
rm -rf dist
rm -rf build
rm -rf exe
rm -rf MANIFEST.in
rm -rf *.egg-info
python setup.py sdist bdist_wheel
pyinstaller -F tidal_dl/__init__.py
mkdir exe
mv dist/__init__.exe exe/tidal-dl.exe
pip uninstall -y tidal-dl
cd ..
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

+4
View File
@@ -0,0 +1,4 @@
cd TIDALDL-PY
twine upload dist/*
cd ..