mirror of
https://github.com/yaronzz/Tidal-Media-Downloader.git
synced 2026-06-13 04:05:07 +03:00
Compare commits
86 Commits
2022.06.23.1
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| f4854f4b74 | |||
| 8352f0f6e2 | |||
| a8da5c0ff3 | |||
| df7c444487 | |||
| d88dca4da6 | |||
| 88b5b61328 | |||
| 56c9cf5695 | |||
| 379eca8458 | |||
| 7d6f9fc6e1 | |||
| 87eabab36f | |||
| 288c75bcc7 | |||
| 62d83b5975 | |||
| 251af9e745 | |||
| 0751c37b35 | |||
| 4f32b14441 | |||
| 97928ef207 | |||
| 9edd5967f0 | |||
| 8449b85d81 | |||
| 2f4ad82421 | |||
| 513be57c3d | |||
| 3eb11252c2 | |||
| b972f7cda8 | |||
| b1b643109c | |||
| c15ad63542 | |||
| 09321db35e | |||
| 132e516250 | |||
| a771c598ae | |||
| db76e84123 | |||
| 7eb4419177 | |||
| df3c405667 | |||
| 951fd102ad | |||
| 252076f6dd | |||
| 11828a0e8e | |||
| 93f363f405 | |||
| 12a96d8a46 | |||
| 238b2da4b3 | |||
| 76313d68c9 | |||
| 4e8751ceb1 | |||
| 2dfcbad8f0 | |||
| 07d18ce2d6 | |||
| 7fdd307176 | |||
| 11805382cc | |||
| 044a847e78 | |||
| 6e49253e99 | |||
| 0c83717469 | |||
| 7f1afb27f1 | |||
| 18efb49213 | |||
| a275275cb6 | |||
| 7e5b6d22c4 | |||
| 96742046ba | |||
| 3199dcedc6 | |||
| 2cf59b3195 | |||
| be84a3631a | |||
| 9ce35af72f | |||
| 9d904a0fea | |||
| 5e05afd775 | |||
| dece506d58 | |||
| c2cc170988 | |||
| 3cab9ea295 | |||
| 5cf094d227 | |||
| 2e1e15ed3f | |||
| 7434470216 | |||
| 2ce2a310ae | |||
| dfc7af7796 | |||
| 63bf063dd3 | |||
| 3e8a3436b4 | |||
| e08e5efc88 | |||
| 7f3758e18c | |||
| 3e2d74a37f | |||
| 69ccd65025 | |||
| 81b82e6c29 | |||
| 346befda6d | |||
| 450102bfea | |||
| a966b3d93d | |||
| 55df515256 | |||
| 242747719a | |||
| e3c5886a02 | |||
| 33c49b83db | |||
| ed13b9b92d | |||
| e45f649e46 | |||
| 0172301769 | |||
| a7aa38e563 | |||
| fd97a2b966 | |||
| e1ee47b93c | |||
| 61b9dd3af8 | |||
| 628a42b058 |
@@ -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.'
|
||||
|
||||
@@ -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: |
|
||||
|
||||
Vendored
+4
-4
@@ -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
|
||||
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
<br>
|
||||
<a href="https://github.com/yaronzz/Tidal-Media-Downloader-PRO">[GUI-REPOSITORY]</a>
|
||||
<br>
|
||||
|
||||

|
||||
|
||||
|
||||
<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%;" />
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
## 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.
@@ -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
|
||||
|
||||
|
||||
@@ -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
@@ -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', ]}
|
||||
)
|
||||
|
||||
@@ -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__':
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -16,6 +16,7 @@ class AudioQuality(Enum):
|
||||
High = 1
|
||||
HiFi = 2
|
||||
Master = 3
|
||||
Max = 4
|
||||
|
||||
|
||||
class VideoQuality(Enum):
|
||||
|
||||
@@ -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
@@ -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())
|
||||
|
||||
@@ -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..."
|
||||
|
||||
@@ -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 = "开始启动登录..."
|
||||
|
||||
@@ -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..."
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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..."
|
||||
|
||||
@@ -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..."
|
||||
|
||||
@@ -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..."
|
||||
|
||||
@@ -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 !"
|
||||
|
||||
|
||||
@@ -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!"
|
||||
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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..."
|
||||
|
||||
@@ -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..."
|
||||
|
||||
@@ -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 = "로그인 중..."
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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'
|
||||
@@ -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..."
|
||||
|
||||
@@ -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..."
|
||||
|
||||
@@ -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 = "Входим в сервис..."
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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ı..."
|
||||
|
||||
@@ -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 = "Початок процесу авторизації..."
|
||||
|
||||
@@ -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..."
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
@@ -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
@@ -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
@@ -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
|
||||
|
||||
|
||||
@@ -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/*
|
||||
@@ -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 ..
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 4.9 KiB |
Reference in New Issue
Block a user