Client MPD
Ma première app, c'est un client pour le serveur MPD ( Music Player Daemon https://www.musicpd.org ).
Pour avoir les couvertures il faut un serveur http qui les fournisse. J'utilise apache qui est intégré à toute les versions de MacOS.
L'avantage par rapport à iTunes c'est qu'il y a moyen de lire beaucoup plus de format de fichier (WavPack, DSD etc.).
Avant il y avait un seul client Mac, Cantata, mais le mainteneur a décidé de s'occuper uniquement de Linux et de lacher Windows et MacOS (certainement un disciple d'RMS).
Ca ressemble à ça:
J'ai mis l'app et le source en fichier joint.
Si y'a des bugs ou des améliorations à apporter au code je suis preneur. Ne pas oublier que je débute
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Bravo !
Par contre les import de type
#import "../../MPDService/MPDCache.h"
c'est vraiment pas terrible, rajoute plutôt des répertoires Header Search Paths
Félicitations !
Alors j'ai testé l'app. J'ai pas grand chose à tester parce que je n'ai pas de serveur MPD. Je peux juste dire que je n'ai jamais entendu un seul son sortir des web radios.
Commence déjà par mettre ton code sur GitHub ou GitLab ça sera plus pratique.
Concernant l'interface c'est pas mal à ceci près que tes assets relatifs au boutons de lecture paraissent flous. Soit tu les as redimensionné à la hache soit tu as voulu mettre une ombre, je ne sais pas, quoi qu'il en soit il ne faut pas (ni l'ombre, ni la hache).
Pour tes vues de collection tu sors des guidelines Apple pour ce qui est du placement du tire et du bouton de retour sans pour autant proposer une alternative satisfaisante. D'ailleurs ce bouton retour fonctionne d'une manière bien singulière et déroutante pour l'utilisateur.
Concernant le code y'a encore du travail. Rien que dans les modèles on sent que quelques subtilités de l'Obj-C t'ont échappé. Quand tu écris dans Stream.h :
On comprend vite que tu n'a pas compris à quoi servait
@property
Tu peux écrire ça de manière plus simple :
Et dans Stream.m tu auras plutôt :
Aussi dans
Album.h
qui est défini un objet appartenant à la couche modèle on retrouve une référenceNSButton *sender;
. Si on veut faire du MVC propre le modèle ne doit pas avoir vent de l'interface et vice-versa.Mais c'est un bon début.
Pas tout regardé, mais, tu fais les setters/getters à la main, c'est étrange, mais comme l'a dit @Pyroh, @property serait utile ici.
Et pour Stream, je n'aurais rien mis dans le .m, le @synthetize étant utile si tu réécris à la fois le getter et le setter, non ?
Sinon, le
[... isEqualToString:@"(null)"]
est bizarre, à corriger sur le parsing sûrement.Quand je vois
J'aurais vu un custom init plutôt que de tout faire à la main ici.
Genre, un init avec mpd_song plutôt.
Intégrer SDWebImage de la sorte rend plus difficile des updates de code. CocoaPods ? Carthage ?
Dans Préférences.m,
Setting *settingPref;
"flotte". Pas une var de la classe ?C'est un beau projet, ambitieux, mais c'est un projet fermé, précis, bon pour quelqu'un qui débute.
Fait, merci.
Merci, c'est un garçon de 3,5Kg
C'est normal si tu n'as pas MPD, c'est lui qui les lit.
C'est déjà le cas, j'ai voulu simplifier la vie.
Ni l'un ni l'autre pourtant, ça vient d'ici https://material.io/tools/icons/ et directement téléchargé en 3 tailles diff. Chez moi c'est net.
On va y travailler.
C'est pas faute d'avoir dit que j'y connaissais rien merci pour l'exemples.
J'avoue que ce truc ne sert à rien et qu'il n'a rien à faire là O_ô, il devait être tard.
Merci
J'en conclu qu'il faut que je bosse sur ce sujet.
C'est un retour d'MPD (de libmpdclient plus précisément), y'a pas de parser entre deux.
Je te fais confiance et vais faire de la sorte alors.
Pas vraiment, il a déjà subit un bonne cure d'amaigrissement (que je n'ai pas terminé).
J'aime pas trop avoir des dépendances avec des trucs externe, ça me rend dépendant et j'aime pas ça. Je préfère l'intégrer, supprimer tout ce qui ne me convient pas et de maintenir le p'tit bout qui reste par moi même.
CocoaPods j'ai testé et ça fait un poil "usinagaz" à l'utilisation. En plus les 3/4 des truc qui sont dessus sont pour iPhone ce qui ne m'intéresse pas du tout. Ce phone étant complètement verrouillé c'est certain que j'en aurais jamais.
C'est le premier fichier que j'ai créé en recopiant des exemples ici et là donc je vais me repencher dessus.
Ambitieux je sais pas, fermé je comprend pas le sens, précis oui, pour débuter je me suis dit la même chose
Merci
Fermé, c'est dans le sens où tu as un but précis, tu ne te perds pas à vouloir faire ci/ça, te perdre à droite à gauche.
C'est toujours le risque dans n'importe quel projet, encore plus quand on est seul.
Ok, oui effectivement c'est fermé
Je fais attention de ne pas partir dans des trucs tordu ou qui ne me serviront jamais, je garde bien à l'esprit que je suis tout seul donc mise à jour et debug c'est pour ma pomme.
C'est quand même plus simple d'insulter des dev quand ça marche pas...
C'est un mal ça ? Tu parle de risque mais je ne vois pas en quoi c'est négatif.
En tout cas, avec vos conseils mon code a fait une sacrée cure d'amaigrissement...
Déjà plus de 300 lignes qui ont sauté et c'est pas fini O_o
Objective-c c'est nul, lent, et energivore
Voila un équivalent swift https://github.com/danbee/persephone
J'adore la franche camaraderie et l'esprit de soutien qui règnent ici
Si il est vrai qu'une petite pique en direction de notre ami @Harlo concernant le langage utilisé est de bon ton, @devulder est allé un peu loin sur le coup-là...
D'autant que persephone a l'air un peu en deçà de ce que propose @Harlo...
Le risque c'est de ne jamais terminer ton projet. Cela dépend des personnalités, mais c'est souvent le risque sur les projets sans deadline (la contrainte de temps influe sur la contrainte de buts)
Le lien a été mis dans le but qu'il voit comment d'autre personne font une app similaire avec surement une autre approche (modèle, langage) dans la mine d'or qu'est Gihub, rien de plus.
Hop, une tite mise à jour du code en suivant vos conseils
Pref et setting étaient vraiment très très crade en fait >_<
Tu ne veux pas mettre ça sur un Repo Git plutôt ? Cela permettrait de voir les progressions et se concentrer sur les modifs.
Version 1.2, meilleurs gestion des playlist, code qui devrait être moins porkz
Playlist au click droit en attendant de maitriser le drag&drop.
Amélioration du code avec codebeat, ça vaut ce que ça vaut...
https://github.com/Old-Geek/MPD-Client/releases/tag/v1.2
J'ai cloné, et j'ai regardé un peu ton code.
Premièrement, je n'aurais pas fait autant de fonctions, mais des méthodes, j'ai l'impression d'être en C. Mais t'as une partie C, alors cela peut se comprendre.
J'ai trouvé ce p'tit bout de code:
Avec:
Et ceci :
Je vais passer le fait que tu préfères envoyer directement un message en français.
Tu te bases sur la description pour ton erreur, or, il faudrait se baser sur son code. Et de la même manière où je t'avais suggéré de faire un initWith, pareil ici.
Après, tu as déjà une classe
NSError
, à toi de l'utiliser plutôt pour ce besoin, en créant une extension plutôt.+(NSError *)errorFromMPDConnection:(struct mpd_connection*)mpdConnection;
Elle contient déjà un champ code, error message, localized message, recovery suggestion, etc.En fait j'utilise les fonctions plus pour me simplifier la vie: fonction( ) = externe, methode: = inclus
Vu que ça change rien au fonctionnement du logiciel j'en profite et c'est uniquement pour les menus contextuel. Je changerais p'têt ça par la suite.
Pour la gestion des erreurs c'est surtout une ébauche et j'ai encore des trucs à tester de ce coté, je ne savais pas encore comment tourner ça mais tu m'as donné la piste
Merci beaucoup pour tout ces conseils qui seront appliqué
C'est toujours plus facile de faire de la review. On ne code pas vraiment, on fait avec des "si...". On lance des pistes quoi.
Et si j'peux aider en pointant vers deux/trois trucs, ça m'va.
Pour tous tes inits, sur iOS, on a tendance à faire, par convention :
Je ne sais pas si sur macOS on ne le fait pas (mais ça m'étonne vu qu'il y a pas mal de logique similaire), mais je ne t'ai pas vu le faire.
Apparement si, d'après ce que j'ai pu trouver il faut aussi le faire sur mac.
C'est flippant ce truc, parfois ça peut foirer, retourner de mauvaises valeur, provoquer des mem leaks voir crash...
De la part d'apple, ça fait quand même un poil bricolo O_o
Si, pareil sur macOS, ça a toujours été ainsi en Objective-C.
En pratique, -[NSObject init] ne renvoie jamais nil.
Je ne saisis pas trop de quoi tu parles. En théorie +alloc peut ne pas fonctionner (mémoire pleine).
Ensuite, même en ayant ARC d'activé (sans doute le cas sur ton projet), on n'est jamais à l'abri des leaks et des zombies. Ce n'est pas Apple qui travaillerait mal; quel que soit le langage, la mémoire doit toujours être gérée d'une manière ou d'une autre.
Gestion des erreurs corrigé
En 3 catégorie, erreur MPD, erreur Serveur MPD et erreur système mais sans passer par une extension de NSError:
NSError *error = [NSError errorWithDomain:NSPOSIXErrorDomain
code:mpd_connection_get_system_error(mpdConnection) userInfo:nil];
self.errorName = @"Erreur système";
self.errorDescription = [NSString stringWithFormat:@"%@", [error localizedDescription]];
Le code de
NSImage* sidebarIcon(NSString *string)
pourrait être ainsi :plutôt que :
Les p'tits trucs bien sympa qui te font voir les choses avec un angle qui ouvre d'autres possibilités, j'adore
Merci
v1.6
https://github.com/Old-Geek/MPD-Client/releases
Consomme moins de:
Surveillance des playlists, streams pour se mettre automatiquement à jour si supprimé à partir d'un autre client.
Amélioration de la fonction recherche (qui est plus un filtre sauf pour la recherche de radio).
Amélioration de l'affichage de tout ce qui est image/icon (y compris en mode dark).
Changement de l'icon d'application, le même que MPD officiel mais revisité (quand on est pas un designer, on l'est pas )
Moins de bug, code plus propre ?