Jump to content

Cheater

Active Members
  • Content Count

    1528
  • Joined

  • Last visited

  • Days Won

    14

Cheater last won the day on January 4

Cheater had the most liked content!

Community Reputation

187 Excellent

About Cheater

  • Rank
    V.I.P.

Converted

  • Location
    Random Access Memory
  • Interests
    Security, smocking & drinking

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Nu, API nu e scris de mine, l-am gasit gata scris, si am inceput de acolo. Poate il scriam eu daca nu exista, cand m-am lovit de bugul mentionat m-am gandit sa imi scriu singur api, apoi am zis ca e in afara scopului...voiam sa ajung repede la rezultat fara prea mare bataie de cap. Este un proiect de fun, nu vreau sa investesc in el sau sa il dezvolt mai mult.
  2. Vad ca te-ai documentat putin. Diferenta e ca pot sa iti descarc si flac-uri (prin link de app desktop/mobile) doar ca, sunt cum spui si tu criptate. Foloesc WidevineCDM. Iti dau multe fisiere prin web doar. Si calitate master ai doar pe Mac/Win cu aplicatia de desktop. Eu folosesc de cativa ani Tidal, si sunt fan, chiar face diferenta pe un sistem bun/casti bune, adica e asta si restul din punctul meu de vedere. (legat de valorile exacte le-am mentionat in primul post) Da asa este Spotify are un sistem de recomandari incredibil de bine pus la punct! Asta e motivul pentru care am si Spotify :)))).
  3. Nu intentionez sa postez jucaria in alta parte. Am facut-o pt mine si am zis sa o pun si aici, nu vreau sa o stie chiar tot netul dupa :))) Daca nu te descurci la ceva, scrie-mi PM si o sa incerc sa te ajut.
  4. Pentru android si ios, ai optiunea de a le descarca si asculta offline, diferenta intre ce gasesti pe torrent si asta, este calitatea. Daca te gandesti la piraterie, ma gandesc la compatibilitate, eu in continuare platesc abonamentul, si daca masina nu e compatibila si am placerea de a asculta melodiile in masina, gresesc cu ceva?
  5. Salutare Guys, Cum se mai intampla sa te plictisesti in concediu, am facut azi, un script in python cu care poti descarca melodii de pe Tidal (https://tidal.com). Tidal este un serviciu de streaming online asemanator Spotify, doar ca are o calitate net superioara: HI-FI - 44.1 kHz/16 bit flac si mp4 si Master - 96 kHz/24 bit (MQA) - flac . Daca ai niste scule decente (fie ca e vorba de casti sau un sistem) e must have! Povestea a inceput de la nevoia de a descarca niste melodii pentru a le asculta offline, si cum nu am gasit nimic functional, am decis sa scriu eu aceasta aplicatie. Si m-am gandit sa impartasesc cu voi! Dependinte (e posibil sa imi fi scapat cateva): pip install tidalapi Unidecode ffmpeg - trebuie sa fie in system path Testand jucaria am gasit un bug in tidalapi: in cazul in care o melodie nu are relese date, va crapa, este un caz extrem de rar, si se intampla inspecial la unele melodii vechi. Daca iti place doar muzica noua si foarte comerciala cu siguranta nu ai neaparat nevoie de acest fix. # fix in tidalapi: # edit __init__.py # from line 224 # change: # if 'releaseDate' in json_obj: # try: # kwargs['release_date'] = datetime.datetime(*map(int, json_obj['releaseDate'].split('-'))) # except ValueError: # pass # return Album(**kwargs) # with: # if 'releaseDate' in json_obj: # if json_obj['releaseDate'] is None: # json_obj['releaseDate'] = '2008-10-14' # try: # kwargs['release_date'] = datetime.datetime(*map(int, json_obj['releaseDate'].split('-'))) # except ValueError: # pass # return Album(**kwargs) Salvati codul intr-un fisier .py, si rulati-l. Apropo, caile catre fisierele salvate/creerea de directoare este hardcodata in format *nix, deci nu va asteptati sa va mearga pe windoza fara mici finisaje. Este scris si testat in Python 2,7 (defaultul la macOS Majave) dar am cautat sa il tin compatibil si cu Python 3.x (sper ca mi-a iesit). # -*- coding: utf-8 -*- # RST Tidal MP4 Downloader by Cheater v1.0 (https://rstforums.com) # All tracks will be download in PCM (MPEG AAC Audio coded, MP4A) at 44100 Hz/16 bits, 320 kbps and stored in MP4 container # requirements: # pip install tidalapi Unidecode # ffmpeg # tidalapi has a bug, so if some album/playlist contains one song with no date, it will exit, this is very rare, however, there is some workaround. # fix in tidalapi: # edit __init__.py # from line 224 # change: # if 'releaseDate' in json_obj: # try: # kwargs['release_date'] = datetime.datetime(*map(int, json_obj['releaseDate'].split('-'))) # except ValueError: # pass # return Album(**kwargs) # with: # if 'releaseDate' in json_obj: # if json_obj['releaseDate'] is None: # json_obj['releaseDate'] = '2008-10-14' # try: # kwargs['release_date'] = datetime.datetime(*map(int, json_obj['releaseDate'].split('-'))) # except ValueError: # pass # return Album(**kwargs) import tidalapi import os import subprocess import errno import shlex from aigpy.cmdHelper import myinput from subprocess import Popen, PIPE, STDOUT from random import randint from time import sleep import unidecode # compatibility workaround for py27/py3 try: from subprocess import DEVNULL # py3k except ImportError: import os DEVNULL = open(os.devnull, 'wb') # fill this with your tidal user and pass tidalUser = '' tidalPass = '' cwd = os.getcwd() config = tidalapi.Config() # using HIGH quality in order to get mp4's unencrypted url instead of enctyped flac config.quality = 'HIGH' session = tidalapi.Session(config) session.login(tidalUser, tidalPass) def getTidalTrackUrl(track_id): try: url = session.get_media_url(track_id) return url except: # in case we need to retry we add a random sleep, in order to worckaround bot detection sleep(randint(1,10)) print('Tidal responds with 401. Retrying track url discovery for track id: ' + str(track_id)) generatePlaylistTrackUrl(track_id) def downloadAlbum(): while True: print("----------------ALBUM------------------") sID = myinput("Enter AlbumID(Enter '0' go back) :") if sID == '0': return tracks = session.get_album_tracks(album_id=sID) queue = [] for track in tracks: trackNo = str(tracks.index(track) + 1) # don't try to download unavailable track, it will fail if track.available is False: continue # replace utf-8 diacritics with ascii equivalent, and cleanup " and ' from album/artist/track name trackName = unidecode.unidecode(track.name).replace('"', '').replace("'", "") artistName = unidecode.unidecode(track.artist.name).replace('"', '').replace("'", "") albumName = unidecode.unidecode(track.album.name).replace('"', '').replace("'", "") print('Adding to queue: ' + artistName + ' - ' + albumName + ' - ' + trackNo + '.' + trackName) # create dw directory and subdirs if it not exits if not os.path.exists(cwd + '/tidalDownloaded/' + albumName): os.makedirs(cwd + '/tidalDownloaded/' + albumName) cmd = 'ffmpeg -y -i "rtmp://' + getTidalTrackUrl(track.id) + '" -acodec copy "' + cwd + '/tidalDownloaded/' + albumName + '/' + trackNo + '.' + artistName + ' - ' + trackName + '.mp4"' queue.append(cmd) print('All track has been added to queue successfully. Download begins....') processes = [] for cmd in queue: p = subprocess.Popen(shlex.split(cmd), shell=False, universal_newlines=True, stdout=DEVNULL, stderr=subprocess.STDOUT) processes.append(p) print('All tracks download is in progress. Please wait....') # wait for all started ffmpeg processes to be finished for p in processes: if p.wait() != 0: print("There was an error") print("Finished. All tracks has been download successfully!") return True def downloadPlaylist(): while True: print("----------------PlayList------------------") sID = myinput("Enter PlayList(Enter '0' go back) :") if sID == '0': return playlist = session.get_playlist(playlist_id=sID) tracks = session.get_playlist_tracks(playlist_id=sID) queue = [] for track in tracks: trackNo = str(tracks.index(track) + 1) # don't try to download unavailable track, it will fail if track.available is False: continue # replace utf-8 diacritics with ascii equivalent, and cleanup " and ' from playlist/artist/track name playlistName = unidecode.unidecode(playlist.name).replace('"', '').replace("'", "") trackName = unidecode.unidecode(track.name).replace('"', '').replace("'", "") artistName = unidecode.unidecode(track.artist.name).replace('"', '').replace("'", "") print('Adding to queue: ' + playlistName + ' - ' + trackNo + '.' + artistName + ' - ' + trackName) # create dw directory and subdirs if it not exits if not os.path.exists(cwd + '/tidalDownloaded/' + playlistName): os.makedirs(cwd + '/tidalDownloaded/' + playlistName) cmd = 'ffmpeg -y -i "rtmp://' + getTidalTrackUrl(track.id) + '" -acodec copy "' + cwd + '/tidalDownloaded/' + playlistName + '/' + trackNo + '.' + artistName + ' - ' + trackName + '.mp4"' queue.append(cmd) print('All track has been added to queue successfully. Download begins....') processes = [] for cmd in queue: p = subprocess.Popen(shlex.split(cmd), shell=False, universal_newlines=True, stdout=DEVNULL, stderr=subprocess.STDOUT) processes.append(p) print('All tracks download is in progress. Please wait....') # wait for all started ffmpeg processes to be finished for p in processes: if p.wait() != 0: print("There was an error") print("Finished. All tracks has been download successfully!") return True while True: print(" RST Tidal MP4 Downloader by Cheater v1.0 (https://rstforums.com)") print("=====================Choice=========================") print(" Enter '0' : Exit") print(" Enter '1' : Download Album.") print(" Enter '2' : Download PlayList.") print("====================================================") print("All tracks will be download in PCM (MPEG AAC Audio coded, MP4A) at 44100 Hz/16 bits, 320 kbps and stored in MP4 container") choice = myinput("Choice:") if choice == '0': quit() elif choice == '1': downloadAlbum() elif choice == '2': downloadPlaylist() Ce stie sa faca? 1. Poti descarca un album 2. Poti descarca un playlist 3. Adauga melodiile intr-o coada, si le descarca simultan pentru a scurta timpul de asteptare semnificativ. Daca aveti intrebari sau nu va descurcati puteti scrie aici, si va voi ajuta in limita timpului disponibil (adica sper sa nu fie nevoie :))) ). PS: Fiti blanzi cu code review, sunt programator si python nu este specialitatea mea, este al 2-lea script scris in python si prima interactiune am avut-o in decembrie. PS2: Distractie si La multi ani! PS3: Feel free to improve it! Later: Am gasit un tool functional de download scris de altcineva (daca il gaseam mai repede probabil ca nu il mai scriam eu pe asta, deci nu e neaparat bine): https://github.com/redsudo/RedSea acest tool spre deosebire de ce am scris eu, stie de si decripteze flacurile, astfel poate descarca inclusiv MQA de 92k / 24bit (cea mai intalta calitate disponibila pe tidal), si flac 44.1k / 16bit cu un bitrate de 1.411 kbps. Decriptarea nu e rocket sience, dar cu siguranta a fost nevoie de un reverse engineering serios pentru aflarea algoritmului si key de criptare (AES cu key binara, tinuta in base64 in cod).
  6. Eu cred ca leak-ul a fost intentionat, ganditi-va ca din mai intra GDPR, si cum ei nu au anuntat nimic in primele 72h, daca s-ar fi aflat dupa aceasta data amenda ar fi fost giganta: Sanctions The following sanctions can be imposed: a warning in writing in cases of first and non-intentional noncompliance regular periodic data protection audits a fine up to €10 million or up to 2% of the annual worldwide turnover of the preceding financial year in case of an enterprise, whichever is greater, if there has been an infringement of the following provisions (Article 83, Paragraph 4[21]) the obligations of the controller and the processor pursuant to Articles 8, 11, 25 to 39, and 42 and 43 the obligations of the certification body pursuant to Articles 42 and 43 the obligations of the monitoring body pursuant to Article 41(4) a fine up to €20 million or up to 4% of the annual worldwide turnover of the preceding financial year in case of an enterprise, whichever is greater, if there has been an infringement of the following provisions: (Article 83, Paragraph 5 & 6[21]) the basic principles for processing, including conditions for consent, pursuant to Articles 5, 6, 7, and 9 the data subjects' rights pursuant to Articles 12 to 22 the transfers of personal data to a recipient in a third country or an international organisation pursuant to Articles 44 to 49 any obligations pursuant to member state law adopted under Chapter IX noncompliance with an order or a temporary or definitive limitation on processing or the suspension of data flows by the supervisory authority pursuant to Article 58(2) or failure to provide access in violation of Article 58(1) https://en.wikipedia.org/wiki/General_Data_Protection_Regulation#Sanctions
  7. Cheater

    Ariadne

    Subscriu, si mie mi-a dat teapa... Bine o sa zica ca am fost sa beau si daia nu eram acolo, dar nu recunosc nimic
  8. Eu am folosit si recomand pfsense, e bazat pe freebsd si merge excelent. Spor!
  9. Cred ca poti intreba si la telefon daca sunteti pe aceeasi pagina. via-a-vis de salariu. Plus serios, acum, daca esti programator sti preturile din piata, si in afara de cateva exceptii, si aici ma refer la firme mai ciudate unde cred ca sunt smecheri si platesc sub piata, salariile sunt tot pe acolo.
  10. @redcoder, pe tine te-a suparat cineva! Este doar un anunt de job, nu stiu cum ai vedea tu anuntul ideal pentru tine. Salariul in 99% din cazul este confidential si nu va fi discutat decat live, lucru ce este firesc. Iar pana la o astfel de discutie este mai putin relevant, ce credem despre, cum ni se pare.... viata bate filmult din mintea noastra Totusi nu cunosc programator senior ce sa ia doar 3000 ron. Iesirile la masa nu sunt obligatorii, si se intampla de obicei in pauza de masa, de la pranz. Eu inteleg ca vrei sa schimbi lumea joburilor, si cred ca nu postezi unde trebuie pt asta, te rog lasa loc si pentru cei cu adevarat interesati sa posteze. Multumesc,
  11. Am actualizat anuntul, si legat de salariu, pot spune ca se plateste fair, in rest mai multe detalii puteti vorbi cu colega de la HR dupa ce aplicati.
  12. Misiunea job-ului tau: Sa faci o diferenta prin valoarea pe care o poti aduce in cadrul echipei! Mai exact, sa contribui la dezvoltarea si imbunatatirea platformei software Co-Factor cu ajutorul careia generam un impact pozitiv asupra angajatilor si business-urilor clientilor nostri. Cine suntem noi, Co-Factor:O echipa tanara si motivata, cu ambitii care depasesc granitele Romaniei, pozitionandu-ne ca un creator de valoare si nu un provider de servicii de outsourcing. Ca si confirmare a inovativitatii noastre, solutia software dezvoltata de Co-Factor a fost premiata de industria de HR iar clientii nostri sunt companii de top precum Banca Transilvania, Regina Maria, Groupama, eMAG, Deloitte, Avon Cosmetics, Ernst & Young si altii.Biroul este pozitionat intr-o zona premium, pe Bulevardul Primaverii (langa Parcul Herastrau si in apropiere de Pta Charles de Gaulle) intr-o atmosfera fresh si relaxanta.Responsabilitati: • Dezvoltarea si perfectionarea solutiei software Co-Factor care integreaza procese de HR si business precum managementul performantei, inovare interna colaborativa, comunicare sociala, recunoastere si gamification etc • Colaborarea cu restul echipei, aducand valoare prin participarea la intalniri de planificare, organizare si strategie, intalniri de code review, precum si prin idei de imbunatatire continua a solutiei• Furnizarea de solutii creative si eficiente la probleme care par in munca de zi cu zi • Root-cause analysis si definirea de solutii tehnice• Oferirea de sugestii de imbunatatire a proceselor si tehnologiilor oferite • Definirea/ clarificarea task-urilor si estimarea corecta a nivelului de efort in proiecte• Colaborarea activa cu ceilalti colegi din cadrul Co-Factor, in vederea indeplinirii cu succes a misiunii job-ului. • Prioritizarea task-urilor si executia lor in timing-ul asumat pentru a livra conform promisiunilor• Contributia la definirea solutiilor impreuna cu echipa atat in ceea ce priveste proiectele noi cat si cele existente • Mentorat si inspiratie pentru colegii cu mai putina experienta • Nu in ultimul rand, apetit pentru inovare si o atitudine plina de energie pozitiva, ca factor motivator in munca de zi cu zi!Expertiza tehnica: 2-4 ani de experienta ca PHP developer.Experienta in PHP, MySql, OOP, MVC, javascript (jquery), versioning (git) si composer.Know-how in RESTful services si design patterns.In plus, ar fi “nice to have” daca ti-ai putea aduce aportul si la dezvoltarile in REACT, ES6 si scriind unit tests.Cum lucram noi: Probabil te-ai obisnuit sa lucrezi Agile, asta este si modul nostru de lucru.Ca tehnologie, suntem in proces de migrare spre Symfony 3 si React.Suntem fani linux, si aparatul nostru de cafea face cea mai buna cafea! Nu ne crezi? Te asteptam sa vezi!Ce-ti oferim?Salariu atractivAsigurare de sanatate premiumPosibilitatea de promovare si dezvoltare profesionala Locatie si atmosfera frumoasaTeam-buildinguri anuale, iesiri periodice la masa impreuna, work + fun! Poti aplica aici: https://www.bestjobs.ro/locuri-de-munca-php-developer/295456/5
  13. As adauga, e bine ca dev, sa foloseasca un tool de management al taskurilor (jira, trelo, asana, etc..) iar clientul poate avea access pentru a putea interveni daca taskurile nu sunt bine intelese/definite dar si pentru a avea o imagine de ansamblu asupra dezvoltarii. Asemenea este esential sa existe un server de dev unde clientul sa poata vedea ultimele implementari. Taskurile trebuie sa ie cat mai granulare, iar daca un task ia mai mult de cateva ore/o zi, poate fi spart in taskuri mai mici, pentru ca asta inseamna ca nu este destul de granular definit. Daca taskurile sunt bine definite, atunci estimarile ies mult mai realiste, caci in procesul de definire a taskurilor iti dai seama daca si ce ti-a scapat initial din estimari. Inca un lucru, niciodata nu se estimeaza un task in timpul ideal de lucru, ci in timpul efectiv. Timp ideal = daca am avea un cronometru unde am cronometra cat am lucra, oprindu-l de fiecare data cand iesim la o tigara sau mergem la toaleta, asta ar fi timpul ideal Timpul efectiv = este timpul ideal, la care se adauga intreruperile, firesti, umane, ca doar nu suntem roboti, si daca nu luam in considerare asta, intotdeauna estimarile noastre o sa fie KO. Si nu trebuie ca dev sa se simta vinovati pt asta, si nici beneficiarii furati, caci este felul in care lucrurile merg, orice altel de estimare va cauza probleme pentru ca nu o sa poata fi respectate termenele si ambii o sa ie nemultumiti. Iar, nu exista un termen batut in cuie, totul este estimativ, ideal este ca totul sa ie cat mai aproape de estimare, totusi la un proiect mare o abatere de 15-20% este rezonabila. Desi o data cu experienta estimarile sunt mai bune iar aceasta poate ajunge si la 1%. Abaterile astea pot veni de la ambele parti, ori clientul s-a apucat sa schimbe anumite lucruri, ori echipa de dezvoltare si-a dat seama ca solutia luata in considerare la estimare nu este cea mai optima. Si este la fel de firesc pe cum este firesc sa exista buguri. Daca nu ai buguri, inseamna ca nu ai testat destul de bine aplicatia si atunci e o problema. Fi la final, un contract strong, trebuie sa stea deasura oricarei discutii.
  14. Cauta un CaptivePortal, sunt o gramada gata facute. De obicei autentificarea in Captive Portal este facuta intr-un server radius, iar acesta poate sa aiba in spate un mysql. Din aplicatia ta scri direct in mysql, ce e folosit de radius, iar radius+captiveportal se ocupa de autentificare. Pentru a-ti usura munca, iti recomand sa folosesti PfSense, este un router os, bazat pe freebsd, foarte light, ce are si captive portal, si radius. Configurezi apoi radius sa foloseasca un mysql extern, unde ti aplicatia, partea de comanda si control. Si that's it! CaptivePortal din PfSense suporta template-uri deci poti face o pagina faina, ce sa informeze/ceara o actiune de la user, chiar cont nou, poti folosi link extern catre partea de plati/user management a aplicatiei tale ce o whitelistezi astfel incat userul sa nu trebuiasca sa fie autentificat pentru a accesa aplicatia ta. Mai mult poti configura din radius (efectiv din mysql) ce limite de viteza vrei pe grupuri de useri sau pe useri individuali, iar pfsense si implementarea lui de CaptivePortal se ocupa de tot! Mai mult PfSense va trimite statistici catre radius ce vor fi stocate in mysql, si poti scoate din ele niste grafice faine, poti vedea ce useri sunt conectati, de cat timp...etc, se numeste radius accounting. PfSense se ocupa de asemenea de dhcp si toate celelalte necesare . Spor!
  15. Uite o firma de HR a facut un document foarte interesant ce include inclusiv salariile pe diverse posturi din it: http://www.brainspotting.ro/wp-content/uploads/2015/10/Brainspotting_ITC_Talentmap_2015-2016.pdf E bine de stiut pentru cultura generala a noastra celor ce lucram in IT. Unde suntem si unde mergem. Este adevarat ca sunt firme, ce platesc extrem de prost angajatii, de nici nu sunt in grile, dar de asemenea stiu firme ce platesc foarte bine angajatii de sunt in afara grilelor, in partea de sus. Media, firescul, obisnuitul este in grile. Daca simtiti ca nu sunteti in grile, nu va costa nimic sa mergeti la interviuri si sa tintiti firme mai mari, alea sunt mai serioase, bine sunt si firme mici serioare, dar rar. Iar daca o firma mica/mare nu isi permite sa mearga in aceste grile, este clar ca are o problema de management, ori produsul nu este foarte inspirat, ori este ceva ce nu este ok acolo, so, cand va angajati vin la pachet si problemele firmei, este o alegere sa le accepti sau nu. Apropo de grile, voi cum sunteti, sunteti bine sau?
×
×
  • Create New...