├── Changelog.md ├── Classes ├── API │ ├── AccountF.swift │ ├── Albums.swift │ ├── ApiAuthKeys.swift │ ├── ApiLanguage.swift │ ├── Artists.swift │ ├── Auth.swift │ ├── Downloader.swift │ ├── Labels.swift │ ├── Landings.swift │ ├── Likes.swift │ ├── Player.swift │ ├── Playlists.swift │ ├── Provider │ │ └── ApiProvider.swift │ ├── Queues.swift │ ├── RecentListen.swift │ ├── Rotors.swift │ ├── Searches.swift │ ├── Target │ │ ├── ApiBaseUrl.swift │ │ ├── ApiFuncBodyParams.swift │ │ ├── ApiFuncHeaders.swift │ │ ├── ApiFuncID.swift │ │ ├── ApiFuncPath.swift │ │ └── ApiHttpMethod.swift │ ├── Tracks.swift │ ├── YMClient.swift │ ├── YMDevice.swift │ ├── YMInvocationInfo.swift │ └── YMResponse.swift ├── Account │ ├── Account.swift │ ├── Alert.swift │ ├── AlertButton.swift │ ├── Autorenewable.swift │ ├── Deactivation.swift │ ├── NonRenewable.swift │ ├── Operator.swift │ ├── PassportPhone.swift │ ├── Permissions.swift │ ├── PlusSubscription.swift │ ├── Price.swift │ ├── Product.swift │ ├── PurchaseSuggestions.swift │ ├── RenewableReminder.swift │ ├── SocialProfile.swift │ ├── Status.swift │ ├── Subscription.swift │ ├── User.swift │ ├── UserSettings.swift │ ├── UserStatistics.swift │ └── XPassportObj.swift ├── Album │ ├── Album.swift │ ├── Deprecation.swift │ ├── Label.swift │ └── TrackPosition.swift ├── Artist │ ├── Artist.swift │ ├── ArtistAlbums.swift │ ├── ArtistAlbumsSortBy.swift │ ├── ArtistShortInfo.swift │ ├── ArtistTracks.swift │ ├── Counts.swift │ ├── Description.swift │ ├── Link.swift │ ├── Ratings.swift │ └── Vinyl.swift ├── Auth │ ├── AuthChallenge.swift │ ├── AuthMethod.swift │ ├── AuthSentPasswordResponse.swift │ ├── AuthVariantsResponse.swift │ └── ChallengeType.swift ├── Cover.swift ├── Error │ ├── ResponseError.swift │ └── YMError.swift ├── Exclude │ └── apiNotes.txt ├── Feed │ ├── AlbumEvent.swift │ ├── ArtistEvent.swift │ ├── Feed.swift │ ├── FeedDay.swift │ ├── FeedEvent.swift │ ├── GeneratedPlaylist.swift │ ├── Headline.swift │ └── TrackWithAds.swift ├── Genre │ ├── Genre.swift │ ├── GenreImage.swift │ └── GenreTitle.swift ├── Icon.swift ├── Label │ └── MusicLabel.swift ├── Landing │ ├── Block.swift │ ├── BlockEntity.swift │ ├── Chart.swift │ ├── ChartInfoMenu.swift │ ├── ChartInfoMenuItem.swift │ ├── ChartItem.swift │ ├── ChartList.swift │ ├── Landing.swift │ ├── LandingBlock.swift │ ├── LandingList.swift │ ├── MixLink.swift │ ├── PersonalPlaylistsData.swift │ ├── PlayContext.swift │ ├── PlayContextData.swift │ └── Promotion │ │ ├── Promotion.swift │ │ └── PromotionItem.swift ├── Like │ ├── Like.swift │ ├── LikeLibrary.swift │ └── LikeObject.swift ├── ListenHistory │ ├── ListenHistory.swift │ ├── ListenHistoryContextType.swift │ └── ListenHistoryItem.swift ├── Pager.swift ├── PermissionAlert.swift ├── Playlist │ ├── CaseForms.swift │ ├── Contest.swift │ ├── CustomWave.swift │ ├── OpenGraphData.swift │ ├── PlayCounter.swift │ ├── Playlist.swift │ ├── PlaylistAbsence.swift │ ├── PlaylistBrand.swift │ ├── PlaylistFor.swift │ ├── PlaylistId.swift │ ├── PlaylistImportStatus.swift │ ├── PlaylistRecomendation.swift │ ├── PlaylistVisibilityType.swift │ ├── PlaylsitEditComand.swift │ ├── Preroll.swift │ ├── Tag.swift │ └── TagResult.swift ├── Podcast │ └── Podcast.swift ├── PromoCodeStatus.swift ├── Queue │ ├── Queue.swift │ ├── QueueContext.swift │ ├── QueueItem.swift │ └── QueuesList.swift ├── Rotor │ ├── AdParams.swift │ ├── DiscreteScale.swift │ ├── Enum.swift │ ├── KeyValueObj.swift │ ├── RadioDashboard.swift │ ├── RadioId.swift │ ├── RadioRestrictions.swift │ ├── RadioSequence.swift │ ├── RotorSettings.swift │ ├── Station.swift │ ├── StationData.swift │ ├── StationDiversityType.swift │ ├── StationMoodType.swift │ ├── StationPreferredLanguageType.swift │ ├── StationResult.swift │ ├── StationTracksResult.swift │ └── StationType.swift ├── Search │ ├── Best.swift │ ├── Search.swift │ ├── SearchFeedback.swift │ ├── SearchHistoryItem.swift │ ├── SearchResult │ │ ├── SearchResultAlbums.swift │ │ ├── SearchResultArtists.swift │ │ ├── SearchResultPlaylists.swift │ │ ├── SearchResultPodcasts.swift │ │ ├── SearchResultTracks.swift │ │ ├── SearchResultUsers.swift │ │ └── SearchResultVideos.swift │ ├── SearchType.swift │ └── Suggestion.swift ├── Shot │ ├── Shot.swift │ ├── ShotData.swift │ ├── ShotEvent.swift │ └── ShotType.swift ├── Supplement │ ├── Lyrics.swift │ ├── LyricsDownloadInfo.swift │ ├── Supplement.swift │ └── VideoSupplement.swift ├── Track │ ├── DownloadInfo.swift │ ├── LicenseTextPart.swift │ ├── Major.swift │ ├── MetaData.swift │ ├── Normalization.swift │ ├── NormalizationR128.swift │ ├── PoetryLovelMatch.swift │ ├── Track.swift │ ├── TrackBitrate.swift │ ├── TrackCodec.swift │ ├── TrackId.swift │ ├── TrackList.swift │ ├── TrackShort.swift │ ├── TrackShortOld.swift │ └── TracksSimilar.swift ├── Util │ ├── CaptchaResponse.swift │ ├── CryptoUtil.swift │ ├── DateUtil.swift │ ├── JsonUtil.swift │ └── XmlUtil.swift ├── Video.swift ├── YMBaseObject.swift ├── YMConstants.swift ├── ios-Info.plist └── osx-Info.plist ├── Contributing.md ├── Contributing_RU.md ├── LICENSE ├── Project ├── YM-Tests │ ├── .gitignore │ ├── TestConstants.swift │ ├── TestCredentials.swift │ ├── iOSInfo.plist │ ├── macInfo.plist │ ├── unit_AccountApiTests.swift │ ├── unit_AlbumApiTests.swift │ ├── unit_AlbumLikeApiTests.swift │ ├── unit_ApiProviderTests.swift │ ├── unit_ArtistApiTests.swift │ ├── unit_ArtistLikeApiTests.swift │ ├── unit_DateUtilTests.swift │ ├── unit_DownloaderTests.swift │ ├── unit_FeedApiTests.swift │ ├── unit_JsonUtilTests.swift │ ├── unit_LabelApiTests.swift │ ├── unit_LandingApiTests.swift │ ├── unit_PlaylistApiTests.swift │ ├── unit_PlaylistLikeApiTests.swift │ ├── unit_QueueApiTests.swift │ ├── unit_RadioStationsApiTests.swift │ ├── unit_RecentListenApiTests.swift │ ├── unit_SearchApiTests.swift │ ├── unit_TrackApiTests.swift │ └── unit_TrackLikeApiTests.swift └── ios │ ├── Images │ └── appIcon.png │ ├── Rave │ ├── AppDelegate.swift │ ├── Application │ │ ├── AppService.swift │ │ ├── Constants.swift │ │ ├── Extension │ │ │ └── NSObject.swift │ │ └── Helper │ │ │ ├── FeedbackInfoCarver.swift │ │ │ ├── Locale │ │ │ ├── Localisator.swift │ │ │ ├── en_GB.strings │ │ │ └── ru_RU.strings │ │ │ ├── Math.swift │ │ │ ├── PlistWrapper.swift │ │ │ └── SecureStorage.swift │ ├── Assets.xcassets │ │ ├── AccentColor.colorset │ │ │ └── Contents.json │ │ ├── AppIcon.appiconset │ │ │ ├── Contents.json │ │ │ ├── icon-1024.png │ │ │ ├── icon-120.png │ │ │ ├── icon-121.png │ │ │ ├── icon-180.png │ │ │ ├── icon-40.png │ │ │ ├── icon-58.png │ │ │ ├── icon-60.png │ │ │ ├── icon-80.png │ │ │ └── icon-87.png │ │ ├── AppIconRounded.imageset │ │ │ ├── AppIconRounded.png │ │ │ └── Contents.json │ │ ├── Bar Icons │ │ │ ├── Contents.json │ │ │ ├── bar_ic_logout.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── image@1x.png │ │ │ │ ├── image@2x.png │ │ │ │ └── image@3x.png │ │ │ ├── bar_ic_settings.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── image@1x.png │ │ │ │ ├── image@2x.png │ │ │ │ └── image@3x.png │ │ │ ├── tab_ic_fav_not_selected.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── image@1x.png │ │ │ │ ├── image@2x.png │ │ │ │ └── image@3x.png │ │ │ ├── tab_ic_fav_selected.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── image@1x.png │ │ │ │ ├── image@2x.png │ │ │ │ └── image@3x.png │ │ │ ├── tab_ic_main.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── image@1x.png │ │ │ │ ├── image@2x.png │ │ │ │ └── image@3x.png │ │ │ ├── tab_ic_radio.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── image@1x.png │ │ │ │ ├── image@2x.png │ │ │ │ └── image@3x.png │ │ │ └── tab_ic_search.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── image@1x.png │ │ │ │ ├── image@2x.png │ │ │ │ └── image@3x.png │ │ ├── Contents.json │ │ ├── System Icons │ │ │ ├── Contents.json │ │ │ ├── sys_ic_chevron_down.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── image@1x.png │ │ │ │ ├── image@2x.png │ │ │ │ └── image@3x.png │ │ │ ├── sys_ic_share.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── image@1x.png │ │ │ │ ├── image@2x.png │ │ │ │ └── image@3x.png │ │ │ └── sys_ic_xmark.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── sys_ic_xmark.png │ │ │ │ ├── sys_ic_xmark@2x.png │ │ │ │ └── sys_ic_xmark@3x.png │ │ ├── Templates │ │ │ ├── Contents.json │ │ │ ├── ic_track_template.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── image@1x.png │ │ │ │ ├── image@2x.png │ │ │ │ └── image@3x.png │ │ │ ├── playlist_liked_template.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── image@1x.png │ │ │ │ ├── image@2x.png │ │ │ │ └── image@3x.png │ │ │ ├── playlist_template.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── image@1x.png │ │ │ │ ├── image@2x.png │ │ │ │ └── image@3x.png │ │ │ ├── profile_template.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── image@1x.png │ │ │ │ ├── image@2x.png │ │ │ │ └── image@3x.png │ │ │ └── radio_template.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── image@1x.png │ │ │ │ ├── image@2x.png │ │ │ │ └── image@3x.png │ │ ├── ic_chevron_down.imageset │ │ │ ├── Contents.json │ │ │ ├── image@1x.png │ │ │ ├── image@2x.png │ │ │ └── image@3x.png │ │ ├── ic_download.imageset │ │ │ ├── Contents.json │ │ │ ├── image@1x.png │ │ │ ├── image@2x.png │ │ │ └── image@3x.png │ │ ├── ic_like.imageset │ │ │ ├── Contents.json │ │ │ ├── image@1x.png │ │ │ ├── image@2x.png │ │ │ └── image@3x.png │ │ ├── ic_liked.imageset │ │ │ ├── Contents.json │ │ │ ├── image@1x.png │ │ │ ├── image@2x.png │ │ │ └── image@3x.png │ │ ├── ic_line.imageset │ │ │ ├── Contents.json │ │ │ ├── image@1x.png │ │ │ ├── image@2x.png │ │ │ └── image@3x.png │ │ ├── ic_list.imageset │ │ │ ├── Contents.json │ │ │ ├── image@1x.png │ │ │ ├── image@2x.png │ │ │ └── image@3x.png │ │ ├── ic_menu.imageset │ │ │ ├── Contents.json │ │ │ ├── image@1x.png │ │ │ ├── image@2x.png │ │ │ └── image@3x.png │ │ ├── ic_menu2.imageset │ │ │ ├── Contents.json │ │ │ ├── image@1x.png │ │ │ ├── image@2x.png │ │ │ └── image@3x.png │ │ ├── ic_next.imageset │ │ │ ├── Contents.json │ │ │ ├── image@1x.png │ │ │ ├── image@2x.png │ │ │ └── image@3x.png │ │ ├── ic_pause.imageset │ │ │ ├── Contents.json │ │ │ ├── image@1x.png │ │ │ ├── image@2x.png │ │ │ └── image@3x.png │ │ ├── ic_play.imageset │ │ │ ├── Contents.json │ │ │ ├── image@1x.png │ │ │ ├── image@2x.png │ │ │ └── image@3x.png │ │ ├── ic_previous.imageset │ │ │ ├── Contents.json │ │ │ ├── image@1x.png │ │ │ ├── image@2x.png │ │ │ └── image@3x.png │ │ ├── ic_queue_add.imageset │ │ │ ├── Contents.json │ │ │ ├── image@1x.png │ │ │ ├── image@2x.png │ │ │ └── image@3x.png │ │ ├── ic_repeat_off.imageset │ │ │ ├── Contents.json │ │ │ ├── image@1x.png │ │ │ ├── image@2x.png │ │ │ └── image@3x.png │ │ ├── ic_repeat_on.imageset │ │ │ ├── Contents.json │ │ │ ├── image@1x.png │ │ │ ├── image@2x.png │ │ │ └── image@3x.png │ │ ├── ic_repeat_on_single.imageset │ │ │ ├── Contents.json │ │ │ ├── image@1x.png │ │ │ ├── image@2x.png │ │ │ └── image@3x.png │ │ ├── ic_search.imageset │ │ │ ├── Contents.json │ │ │ ├── image@1x.png │ │ │ ├── image@2x.png │ │ │ └── image@3x.png │ │ ├── ic_shuffle_off.imageset │ │ │ ├── Contents.json │ │ │ ├── image@1x.png │ │ │ ├── image@2x.png │ │ │ └── image@3x.png │ │ ├── ic_shuffle_on.imageset │ │ │ ├── Contents.json │ │ │ ├── image@1x.png │ │ │ ├── image@2x.png │ │ │ └── image@3x.png │ │ ├── ic_stop.imageset │ │ │ ├── Contents.json │ │ │ ├── image@1x.png │ │ │ ├── image@2x.png │ │ │ └── image@3x.png │ │ └── ic_stopped.imageset │ │ │ ├── Contents.json │ │ │ ├── image@1x.png │ │ │ ├── image@2x.png │ │ │ └── image@3x.png │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ ├── Delegate │ │ ├── PlayerQueueDelegate.swift │ │ └── SelectorDelegate.swift │ ├── Info.plist │ ├── MainMenuTBC.swift │ ├── Model │ │ ├── BitBool8.swift │ │ ├── PlayerQueue.swift │ │ └── Properties.swift │ ├── Podfile │ ├── Rave.xcodeproj │ │ ├── project.pbxproj │ │ ├── project.xcworkspace │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata │ │ │ │ └── IDEWorkspaceChecks.plist │ │ └── xcuserdata │ │ │ └── admin.xcuserdatad │ │ │ └── xcschemes │ │ │ └── xcschememanagement.plist │ ├── Ui │ │ ├── Auth │ │ │ ├── Base.lproj │ │ │ │ └── Auth.storyboard │ │ │ └── LoginWebVC.swift │ │ ├── Content │ │ │ ├── AudioPlayerVC.swift │ │ │ ├── Base.lproj │ │ │ │ └── Content.storyboard │ │ │ ├── Cell │ │ │ │ ├── FavouriteIntroTVCell.swift │ │ │ │ ├── FavouriteIntroTVCell.xib │ │ │ │ ├── LoadingTVCell.swift │ │ │ │ ├── LoadingTVCell.xib │ │ │ │ ├── PlaylistIntroTVCell.swift │ │ │ │ ├── PlaylistIntroTVCell.xib │ │ │ │ ├── TrackTVCell.swift │ │ │ │ └── TrackTVCell.xib │ │ │ ├── FavouriteVC.swift │ │ │ ├── PlaylistVC.swift │ │ │ ├── PlaylistsVC.swift │ │ │ └── ru.lproj │ │ │ │ └── Content.strings │ │ ├── Dialog │ │ │ ├── Dialog.storyboard │ │ │ ├── PopupContextMenuVC.swift │ │ │ └── PopupTrackMenuVC.swift │ │ ├── Landing │ │ │ ├── Cell │ │ │ │ ├── PersonalPlaylistCVCell.swift │ │ │ │ ├── PersonalPlaylistCVCell.xib │ │ │ │ ├── PersonalPlaylistsTVCell.swift │ │ │ │ └── PersonalPlaylistsTVCell.xib │ │ │ └── LandingVC.swift │ │ ├── Player │ │ │ ├── PlayerWidgetView.swift │ │ │ └── PlayerWidgetView.xib │ │ ├── Profile │ │ │ └── ProfileVC.swift │ │ ├── Radio │ │ │ ├── Cell │ │ │ │ ├── RadioCVCell.swift │ │ │ │ ├── RadioCVCell.xib │ │ │ │ ├── RadioDashboardTVCell.swift │ │ │ │ └── RadioDashboardTVCell.xib │ │ │ └── RadioVC.swift │ │ └── Search │ │ │ └── SearchVC.swift │ └── ru.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ ├── Screenshots │ ├── favourite.png │ ├── feed.png │ ├── nowPlaying.png │ ├── nowPlayingQueue.png │ ├── playlistOfDay.png │ ├── searchResults.png │ └── searchSuggestions.png │ └── devNotes.txt ├── README.md ├── README_RU.md ├── YM-API.podspec └── YM-API.xcodeproj ├── project.pbxproj ├── project.xcworkspace ├── contents.xcworkspacedata ├── xcshareddata │ ├── IDEWorkspaceChecks.plist │ └── WorkspaceSettings.xcsettings └── xcuserdata │ └── admin.xcuserdatad │ ├── IDEFindNavigatorScopes.plist │ └── WorkspaceSettings.xcsettings ├── xcshareddata └── xcschemes │ ├── YM-iOS.xcscheme │ └── YM-mac.xcscheme └── xcuserdata └── admin.xcuserdatad ├── xcdebugger └── Breakpoints_v2.xcbkptlist └── xcschemes └── xcschememanagement.plist /Classes/API/ApiAuthKeys.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ApiAuthKeys.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 15.07.2021. 6 | // 7 | 8 | ///Represents authorization response json keys 9 | public enum ApiAuthKeys: Int 10 | { 11 | case access_token 12 | case expires_in 13 | case token_type 14 | case uid 15 | case x_token 16 | case track_id 17 | } 18 | -------------------------------------------------------------------------------- /Classes/API/ApiLanguage.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ApiLanguage.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 11.06.2021. 6 | // 7 | ///Represents enum with available languages for API 8 | public enum ApiLanguage: String { 9 | case en 10 | case uz 11 | case uk 12 | case us 13 | case ru 14 | case kk 15 | case hy 16 | } 17 | -------------------------------------------------------------------------------- /Classes/API/Downloader.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Downloader.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 11.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Downloads any resource 11 | func download(fullPath: String, completion: @escaping (_ result: Result) -> Void) { 12 | guard let req: URLRequest = buildRequest(for: .download(fullPath: fullPath)) else {completion(.failure(.badRequest(errCode: -1, description: "Unable to build downloader request"))); return} 13 | requestData(req, completion: completion) 14 | } 15 | 16 | func downloadAccountAvatarByApi(xToken: String, size: Int, completion: @escaping (_ result: Result) -> Void) { 17 | guard let req: URLRequest = buildRequest(for: .account_avatar(size: size, secret: xToken)) else {completion(.failure(.badRequest(errCode: -1, description: "Unable to build ava downloader request"))); return} 18 | requestJson(req) { 19 | result in 20 | do { 21 | let json = try result.get() 22 | let data = try JSONSerialization.data(withJSONObject: json) 23 | let xAuth: XPassportObj = try JSONDecoder().decode(XPassportObj.self, from: data) 24 | completion(.success(xAuth)) 25 | } catch { 26 | let parsed: YMError = error as? YMError ?? YMError.general(errCode: -1, data: ["description": error]) 27 | completion(.failure(parsed)) 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Classes/API/Target/ApiBaseUrl.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ApiBaseUrl.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 11.06.2021. 6 | // 7 | extension ApiFunction { 8 | 9 | var baseURL: String { 10 | switch self { 11 | case .download(let path): return path 12 | case .auth_init_session: return "https://passport.yandex.ru/" 13 | case .auth_generate_x_token: return "https://mobileproxy.passport.yandex.net/" 14 | case .auth_generate_ym_token: return "https://mobileproxy.passport.yandex.net/" 15 | case .account_avatar: return "https://mobileproxy.passport.yandex.net/" 16 | default: return YMConstants.apiBasePath 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Classes/API/YMInvocationInfo.swift: -------------------------------------------------------------------------------- 1 | // 2 | // InvocationInfo.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 04.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents back-end response info 11 | public class YMInvocationInfo: Decodable { 12 | 13 | enum CodingKeys: String, CodingKey { 14 | case hostname 15 | case reqId = "req-id" 16 | case execDurationMillis = "exec-duration-millis" 17 | } 18 | 19 | ///Back-end server name 20 | public let hostname: String 21 | ///Reqeust number (ID) 22 | public let reqId: String 23 | ///Execution duration in miliseconds 24 | public let execDurationMillis: String? 25 | 26 | public init(hostname: String, reqId: String, execDurationMillis: String?) { 27 | self.hostname = hostname 28 | self.reqId = reqId 29 | 30 | self.execDurationMillis = execDurationMillis 31 | } 32 | 33 | public required init(from decoder: Decoder) throws { 34 | let container = try decoder.container(keyedBy: CodingKeys.self) 35 | self.hostname = try container.decode(String.self, forKey: .hostname) 36 | self.reqId = try container.decode(String.self, forKey: .reqId) 37 | var duration: String = "" 38 | do { 39 | duration = try container.decode(String.self, forKey: .execDurationMillis) 40 | self.execDurationMillis = duration 41 | } catch { 42 | let durationInt = try? container.decodeIfPresent(Int.self, forKey: .execDurationMillis) 43 | if let g_duration = durationInt { 44 | self.execDurationMillis = String(g_duration) 45 | } else { 46 | self.execDurationMillis = nil 47 | } 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /Classes/Account/Alert.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Alert.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 11.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Presents alert block 11 | public class Alert: Decodable { 12 | 13 | //Note: Данные предупреждения, скорее всего, только обкатываются. У них нет ID, вместо этого `xxx`, а еще присутствуют слова "тест" в тексте. Используют как предупреждение о конце подписки, так и о раздаче подарков. 14 | 15 | ///Alert UID 16 | public let alertId: String 17 | ///Alert text 18 | public let text: String 19 | ///Alert backgroudn color 20 | public let bgColor: String 21 | ///Alert text color 22 | public let textColor: String 23 | ///Alert type 24 | public let alertType: String 25 | ///Button with url 26 | public let button: AlertButton 27 | ///Close button marker 28 | public let closeButton: Bool 29 | 30 | public init(alertId: String, text: String, bgColor: String, textColor: String, alertType: String, button: AlertButton, closeButton: Bool) { 31 | self.alertId = alertId 32 | self.text = text 33 | self.bgColor = bgColor 34 | self.textColor = textColor 35 | self.alertType = alertType 36 | self.button = button 37 | self.closeButton = closeButton 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Classes/Account/AlertButton.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AlertButton.swift 3 | // yandexMusic-iOS 4 | // 5 | // Created by Developer on 11.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents alert button (subscription state) 11 | public class AlertButton: Decodable { 12 | 13 | ///Button label 14 | public let text: String 15 | ///Button background 16 | public let bgColor: String 17 | ///Button label color 18 | public let textColor: String 19 | ///Button url 20 | public let uri: String 21 | 22 | public init(text: String, bgColor: String, textColor: String, uri: String) { 23 | self.text = text 24 | self.bgColor = bgColor 25 | self.textColor = textColor 26 | self.uri = uri 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Classes/Account/Autorenewable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Autorenewable.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 11.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Renewable subscription information 11 | public class Autorenewable: Decodable { 12 | 13 | ///Subscription expires date 14 | public let expires: String 15 | ///Subscription seller 16 | public let vendor: String 17 | ///Seller help url 18 | public let vendor_help_url: String 19 | ///Subscription product 20 | public let product: Product? 21 | ///Renewable diabled state marker 22 | public let finished: Bool 23 | ///Multy user subscription master account 24 | public let master_info: User? 25 | ///Product UID 26 | public let product_id: String? 27 | ///Order UID 28 | public let order_id: Int? 29 | 30 | public init(expires: String, vendor: String, vendor_help_url: String, product: Product?, finished: Bool, master_info: User?, product_id: String?, order_id: Int?) { 31 | self.expires = expires 32 | self.vendor = vendor 33 | self.vendor_help_url = vendor_help_url 34 | self.product = product 35 | self.finished = finished 36 | 37 | self.master_info = master_info 38 | self.product_id = product_id 39 | self.order_id = order_id 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Classes/Account/Deactivation.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Deactivation.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 11.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents service deactivation methods 11 | public class Deactivation: Decodable { 12 | //Note:Известные значения поля `method`: `ussd`. 13 | 14 | ///Service deactivation method 15 | public let method: String 16 | ///Service deactivation manual 17 | public let instructions: String? 18 | 19 | public init(method: String, instructions: String?) { 20 | self.method = method 21 | self.instructions = instructions 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Classes/Account/NonRenewable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NonRenewable.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 11.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents non renewable state of subscription 11 | public class NonRenewable: Decodable { 12 | 13 | ///Subscription begin date 14 | public let start: String 15 | ///Subscription end date 16 | public let end: String 17 | 18 | public init(start: String, end: String) { 19 | self.start = start 20 | self.end = end 21 | 22 | 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Classes/Account/Operator.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Operator.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 11.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents cell provider service 11 | public class Operator: Decodable { 12 | 13 | ///Yandex Music service UID 14 | public let product_id: String 15 | ///Mobile phone number for service link 16 | public let phone: String 17 | ///Service payment regularity 18 | public let payment_regularity: String 19 | ///Service deactivation methods 20 | public let deactivation: [Deactivation] 21 | ///Service title 22 | public let title: String 23 | ///Service suspended marker 24 | public let suspended: Bool 25 | 26 | 27 | 28 | public init(product_id: String, phone: String, payment_regularity: String, deactivation: [Deactivation], title: String, suspended: Bool) { 29 | self.product_id = product_id 30 | self.phone = phone 31 | self.payment_regularity = payment_regularity 32 | self.deactivation = deactivation 33 | self.title = title 34 | self.suspended = suspended 35 | 36 | 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Classes/Account/PassportPhone.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PassportPhone.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 11.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represent user phone number 11 | public class PassportPhone: Decodable { 12 | 13 | ///Phone number 14 | public let phone: String 15 | 16 | public init(phone: String) { 17 | self.phone = phone 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Classes/Account/Permissions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Permissions.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 11.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents user permissions, its values and end dates 11 | public class Permissions: Decodable { 12 | 13 | ///Permissions end date 14 | public let until: String 15 | ///Permissions list 16 | public let values: [String] 17 | ///Permissions default values 18 | public let `default`: [String] 19 | 20 | public init(until: String, values: [String], defaultValues: [String]) { 21 | self.until = until 22 | self.values = values 23 | self.default = defaultValues 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Classes/Account/PlusSubscription.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PlusSubscription.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 11.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents Yandex Plus subscription 11 | public class PlusSubscription: Decodable { 12 | 13 | ///Plus subscription active marker 14 | public let hasPlus: Bool 15 | ///Tutorial completed marker 16 | public let isTutorialCompleted: Bool 17 | 18 | public init(hasPlus: Bool, isTutorialCompleted: Bool) { 19 | self.hasPlus = hasPlus 20 | self.isTutorialCompleted = isTutorialCompleted 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Classes/Account/Price.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Price.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 11.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents service price 11 | public class Price: Decodable { 12 | 13 | ///Service price amoum 14 | public let amount: Int 15 | ///Price currency 16 | public let currency: String 17 | 18 | public init(amount: Int, currency: String) { 19 | self.amount = amount 20 | self.currency = currency 21 | 22 | 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Classes/Account/PurchaseSuggestions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Settings.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 03.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///In-app buy suggestions 11 | public class PurchaseSuggestions: Decodable { 12 | 13 | ///Selling in-app products 14 | public let inAppProducts: [Product] 15 | ///Selling products (show by banners) 16 | public let nativeProducts: [Product] 17 | ///Payment url 18 | public let webPaymentUrl: String 19 | ///Product cost for a month 20 | public let webPaymentMonthProductPrice: Price? 21 | ///Promo codes available marker 22 | public let promoCodesEnabled: Bool 23 | 24 | public init(inAppProducts: [Product], nativeProducts: [Product], webPaymentUrl: String, promoCodesEnabled: Bool, webPaymentMonthProductPrice: Price?) { 25 | self.inAppProducts = inAppProducts 26 | self.nativeProducts = nativeProducts 27 | self.webPaymentUrl = webPaymentUrl 28 | self.webPaymentMonthProductPrice = webPaymentMonthProductPrice 29 | self.promoCodesEnabled = promoCodesEnabled 30 | 31 | 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /Classes/Account/RenewableReminder.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RenewableReminder.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 11.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Subscription renew reminder 11 | public class RenewableReminder: Decodable { 12 | 13 | ///Subscription days left before end 14 | public let days: Int 15 | 16 | public init(days: Int) { 17 | self.days = days 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Classes/Account/SocialProfile.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SocialProfile.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 12.05.2022. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents user social profiles info 11 | public class SocialProfile: Decodable { 12 | 13 | public let provider: String 14 | public let addresses: [String] 15 | 16 | public init(provider: String, addresses: [String]) { 17 | self.provider = provider 18 | self.addresses = addresses 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Classes/Account/Subscription.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Subscription.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 11.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///User account subscriptions info 11 | public class Subscription: Decodable { 12 | 13 | ///Subscription existance marker 14 | public let hadAnySubscription: Bool? 15 | ///Renew reminder 16 | public let nonAutoRenewableRemainder: RenewableReminder? 17 | ///Subscription auto renew 18 | public let autoRenewable: [Autorenewable]? 19 | ///Family subscription auto renew 20 | public let familyAutoRenewable: [Autorenewable]? 21 | ///Cell provider services 22 | public let `operator`: [Operator]? 23 | ///Subscriptions with disabled auto renew 24 | public let nonAutoRenewable: [NonRenewable]? 25 | ///Trial period available marker 26 | public let canStartTrial: Bool? 27 | ///Mcdonalds TODO 28 | public let mcdonalds: Bool? 29 | ///End date 30 | public let end: String? 31 | 32 | public init(hadAnySubscription: Bool?, 33 | non_auto_renewable_remainder: RenewableReminder?, 34 | auto_renewable: [Autorenewable], 35 | family_auto_renewable: [Autorenewable], 36 | oper: [Operator], 37 | nonAutoRenewable: [NonRenewable], 38 | canStartTrial: Bool?, 39 | mcdonalds: Bool?, end: String?) { 40 | self.hadAnySubscription = hadAnySubscription 41 | self.nonAutoRenewableRemainder = non_auto_renewable_remainder 42 | self.autoRenewable = auto_renewable 43 | self.familyAutoRenewable = family_auto_renewable 44 | 45 | self.operator = oper 46 | self.nonAutoRenewable = nonAutoRenewable 47 | self.canStartTrial = canStartTrial 48 | self.mcdonalds = mcdonalds 49 | self.end = end 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /Classes/Album/Deprecation.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Deprecation.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 11.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents TODO 11 | public class Deprecation: Decodable { 12 | 13 | ///Album target UID TODO 14 | public let targetAlbumId: Int? 15 | ///Depreaction state TODO 16 | public let status: String? 17 | ///Deprecatrion process done marker TODO 18 | public let done: Bool? 19 | 20 | public init(targetAlbumId: Int?, status: String?, done: Bool?) { 21 | self.targetAlbumId = targetAlbumId 22 | self.status = status 23 | self.done = done 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Classes/Album/Label.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Label.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 11.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents album label 11 | public class Label: Decodable { 12 | 13 | ///Album UID 14 | public let id: Int 15 | ///Album name 16 | public let name: String 17 | 18 | public init(id: Int, name: String) { 19 | self.id = id 20 | self.name = name 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Classes/Album/TrackPosition.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TrackPosition.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 11.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents track position number at parent album 11 | public class TrackPosition: Decodable { 12 | //Note: Позиция трека в альбоме, который возвращается при получении самого трека. Volume на фронте именуется как "Диск". 13 | 14 | ///Album volume number 15 | public let volume: Int 16 | ///Track index 17 | public let index: Int 18 | 19 | public init(volume: Int, index: Int) { 20 | self.volume = volume 21 | self.index = index 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Classes/Artist/ArtistAlbums.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ArtistAlbums.swift 3 | // yandexMusic-iOS 4 | // 5 | // Created by Developer on 10.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Artist's albums list 11 | public class ArtistAlbums: Decodable { 12 | 13 | ///Artist's albums list 14 | public let albums: [Album] 15 | ///Albums paginator 16 | public let pager: Pager? 17 | 18 | public init(albums: [Album], pager: Pager?) { 19 | self.albums = albums 20 | self.pager = pager 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Classes/Artist/ArtistAlbumsSortBy.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ArtistAlbumsSortBy.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 01.09.2021. 6 | // 7 | 8 | public enum ArtistAlbumsSortBy: String { 9 | case year 10 | case rating 11 | } 12 | -------------------------------------------------------------------------------- /Classes/Artist/ArtistTracks.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ArtistTracks.swift 3 | // yandexMusic-iOS 4 | // 5 | // Created by Developer on 10.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents artist's tracks list 11 | public class ArtistTracks: Decodable { 12 | 13 | ///Artist's tracks list 14 | public let tracks: [Track] 15 | ///Tracks paginator 16 | public let pager: Pager? 17 | 18 | public init(tracks: [Track], pager: Pager?) { 19 | self.tracks = tracks 20 | self.pager = pager 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Classes/Artist/Counts.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Counts.swift 3 | // yandexMusic-iOS 4 | // 5 | // Created by Developer on 11.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Artist properties counts 11 | public class Counts: Decodable { 12 | 13 | ///Tracks count 14 | public let tracks: Int 15 | ///Direct albums count 16 | public let directAlbums: Int 17 | ///Additional albums count 18 | public let alsoAlbums: Int 19 | ///Additional tracks count 20 | public let alsoTracks: Int 21 | 22 | public init(tracks: Int, directAlbums: Int, alsoAlbums: Int, alsoTracks: Int) { 23 | self.tracks = tracks 24 | self.directAlbums = directAlbums 25 | self.alsoAlbums = alsoAlbums 26 | self.alsoTracks = alsoTracks 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Classes/Artist/Description.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Description.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 11.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Artist description from other source 11 | public class Description: Decodable { 12 | //Note: Очень редкий объект, у минимального количества исполнителей. Обычно берётся информация из википедии. 13 | 14 | ///Artist description 15 | public let text: String 16 | ///Artist description url 17 | public let uri: String 18 | 19 | public init(text: String, uri: String) { 20 | self.text = text 21 | self.uri = uri 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Classes/Artist/Link.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Link.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 11.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Artist official link 11 | public class Link: Decodable { 12 | 13 | //Note: Известные типы страниц: `official` - официальный сайт и `social` - социальная сеть. 14 | 15 | ///Page title 16 | public let title: String 17 | ///Page url 18 | public let href: String 19 | ///Link type 20 | public let type: String 21 | ///Social network name 22 | public let socialNetwork: String? 23 | 24 | public init(title: String, href: String, type: String, socialNetwork: String?) { 25 | self.title = title 26 | self.href = href 27 | self.type = type 28 | 29 | self.socialNetwork = socialNetwork 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /Classes/Artist/Ratings.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Rating.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 11.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents artist rating 11 | public class Ratings: Decodable { 12 | 13 | ///Montly rating value 14 | public let month: Int 15 | ///Weekly rating value 16 | public let week: Int? 17 | ///Daily rating value 18 | public let day: Int? 19 | 20 | public init(month: Int, week: Int?, day: Int?) { 21 | self.week = week 22 | self.month = month 23 | 24 | self.day = day 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Classes/Artist/Vinyl.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Vinyl.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 11.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents artist vinyl 11 | public class Vinyl: Decodable { 12 | 13 | ///Vinyl store purchase url 14 | public let url: String 15 | ///Vinyl title 16 | public let title: String 17 | ///Vinyl release year 18 | public let year: Int 19 | ///Vinyl price 20 | public let price: Int 21 | ///Media source 22 | public let media: String 23 | ///Vinyl buy offer UID 24 | public let offerId: Int 25 | ///Artists UIDs 26 | public let artistIds: [Int]? 27 | ///Vinyl cover image url 28 | public let picture: String? 29 | 30 | public init(url: String, title: String, year: Int, price: Int, media: String, offerId: Int, artistIds: [Int]?, picture: String?) { 31 | self.url = url 32 | self.picture = picture 33 | self.title = title 34 | self.year = year 35 | self.price = price 36 | self.media = media 37 | self.offerId = offerId 38 | self.artistIds = artistIds 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Classes/Auth/AuthChallenge.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Auth2FaChallenge.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 04.06.2023. 6 | // 7 | 8 | import Foundation 9 | 10 | public class AuthChallenge: Decodable { 11 | public let challengeType: String 12 | public var challenge: ChallengeType? { 13 | get { 14 | let parsed = ChallengeType(rawValue: challengeType) 15 | return parsed 16 | } 17 | } 18 | public let hint: String 19 | public let fieldValue: String 20 | public let errorText: String 21 | public let isSms2faChallenge: Bool? 22 | public let phoneId: UInt32? 23 | 24 | init(challengeType: String, hint: String, fieldValue: String, errorText: String, isSms2faChallenge: Bool?, phoneId: UInt32?) { 25 | self.challengeType = challengeType 26 | self.hint = hint 27 | self.fieldValue = fieldValue 28 | self.errorText = errorText 29 | self.isSms2faChallenge = isSms2faChallenge 30 | self.phoneId = phoneId 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Classes/Auth/AuthMethod.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AuthMetod.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 04.06.2023. 6 | // 7 | 8 | public enum AuthMethod: String { 9 | case password = "password" 10 | case magicXToken = "magic_x_token" 11 | } 12 | -------------------------------------------------------------------------------- /Classes/Auth/AuthSentPasswordResponse.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AuthSentPasswordResponse.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 04.06.2023. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents response for commited account password 11 | public class AuthSentPasswordResponse: Decodable { 12 | enum CodingKeys: CodingKey { 13 | case state 14 | case avatarId 15 | case redirect_url 16 | } 17 | 18 | ///Current authorization session state 19 | public let state: String//Tested with 'auth_challenge' 20 | ///Account ava ID 21 | public let avatarId: String 22 | ///TODO 23 | public let redirectUrl: String 24 | 25 | init(state: String, avatarId: String, redirectUrl: String) { 26 | self.state = state 27 | self.avatarId = avatarId 28 | self.redirectUrl = redirectUrl 29 | } 30 | 31 | public required init(from decoder: Decoder) throws { 32 | let container = try decoder.container(keyedBy: CodingKeys.self) 33 | self.state = try container.decode(String.self, forKey: .state) 34 | self.avatarId = (try? container.decodeIfPresent(String.self, forKey: .avatarId)) ?? "" 35 | self.redirectUrl = (try? container.decodeIfPresent(String.self, forKey: .redirect_url)) ?? "" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Classes/Auth/ChallengeType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ChallengeType.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 04.06.2023. 6 | // 7 | 8 | import Foundation 9 | 10 | public enum ChallengeType: String { 11 | case phoneConfirmation = "phone_confirmation" 12 | } 13 | -------------------------------------------------------------------------------- /Classes/Error/ResponseError.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ResponseError.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 02.09.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents response error object from back-end 11 | public class ResponseError: NSObject, Decodable { 12 | ///Response error name 13 | public let name: String 14 | ///Response error description 15 | public let message: String 16 | 17 | public init(name: String, message: String) { 18 | self.name = name 19 | self.message = message 20 | } 21 | 22 | public override var description: String { 23 | get { 24 | return name + ": " + message 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Classes/Error/YMError.swift: -------------------------------------------------------------------------------- 1 | // 2 | // YMBaseException.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 04.06.2021. 6 | // 7 | 8 | ///Represents general exceptions of API work 9 | public enum YMError: Error 10 | { 11 | case general(errCode: Int, data: [String: Any]) 12 | case badRequest(errCode: Int, description: String) 13 | case badResponseData(errCode: Int, data: [String: Any]) 14 | case userNotExists(errCode: Int, description: String) 15 | case invalidResponseStatusCode(errCode: Int, description: String) 16 | case captchaRequired(errCode: Int, data: [String: Any]) 17 | case wrongCaptcha(errCode: Int, description: String) 18 | case invalidInputParameter(name: String, description: String) 19 | case invalidObject(objType: String, description: String) 20 | case unfinishedAuthorization(trackId: String?, xToken: String?, innerErr: Error?) 21 | case invalidToken(description: String) 22 | case invalidBitrate(description: String) 23 | case trackDownloadInfoNotExists(description: String) 24 | case trackDownloadLinkDead(description: String) 25 | } 26 | -------------------------------------------------------------------------------- /Classes/Exclude/apiNotes.txt: -------------------------------------------------------------------------------- 1 | Новое API: 2 | - Раздел "Детям" (GET /children-landing/catalogue). Можно использовать без авторизации 3 | Осталось протестировать API + сделать необходимые правки по результатам тестов: 4 | - Вход в аккаунт, если необходима проверка капчой 5 | - Операции над треками: 6 | -- Отправка событий (проигрывание и событие завершения [Для шотов Алисы или рекламы]; не путать с событиями радио) 7 | -------------------------------------------------------------------------------- /Classes/Feed/AlbumEvent.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AlbumEvent.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 04.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Feed event - album 11 | public class AlbumEvent: Decodable { 12 | 13 | ///Album info of event 14 | public let album: Album? 15 | ///Tracks info of events 16 | public let tracks: [Track] 17 | 18 | public init(album: Album?, tracks: [Track]) { 19 | self.album = album 20 | self.tracks = tracks 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Classes/Feed/ArtistEvent.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ArtistEvent.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 04.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Feed event - artist 11 | public class ArtistEvent: Decodable { 12 | 13 | ///Artist info of event 14 | public let artist: Artist? 15 | ///Tracks of event 16 | public let tracks: [Track] 17 | ///Similar artists to current from history 18 | public let similarToArtistsFromHistory: [Artist]? 19 | ///Event subscription marker 20 | public let subscribed: Bool? 21 | 22 | public init(artist: Artist?, tracks: [Track], similarToArtistsFromHistory: [Artist]?, subscribed: Bool?) { 23 | self.artist = artist 24 | self.tracks = tracks 25 | self.similarToArtistsFromHistory = similarToArtistsFromHistory 26 | 27 | self.subscribed = subscribed 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Classes/Feed/Feed.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Feed.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 04.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents feed 11 | public class Feed: Decodable { 12 | 13 | ///More events marker 14 | public let canGetMoreEvents: Bool 15 | ///Haloween 16 | public let pumpkin: Bool 17 | ///TODO 18 | public let isWizardPassed: Bool 19 | ///Generated playlists for feed 20 | public let generatedPlaylists: [GeneratedPlaylist] 21 | ///Feed headlines 22 | public let headlines: [Headline] 23 | ///Today date ('YYYY-MM-DD' format) 24 | public let today: String 25 | ///Feed days 26 | public let days: [FeedDay] 27 | ///Date of next feed revision ('YYYY-MM-DD' format) 28 | public let nextRevision: String? 29 | 30 | public init(canGetMoreEvents: Bool, 31 | pumpkin: Bool, 32 | isWizardPassed: Bool, 33 | generatedPlaylists: [GeneratedPlaylist], 34 | headlines: [Headline], 35 | today: String, 36 | days: [FeedDay], 37 | nextRevision: String?) { 38 | self.canGetMoreEvents = canGetMoreEvents 39 | self.pumpkin = pumpkin 40 | self.isWizardPassed = isWizardPassed 41 | self.generatedPlaylists = generatedPlaylists 42 | self.headlines = headlines 43 | self.today = today 44 | self.days = days 45 | 46 | self.nextRevision = nextRevision 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /Classes/Feed/FeedDay.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FeedDay.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 04.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Feed for a day 11 | public class FeedDay: Decodable { 12 | 13 | ///Date ('YYYY-MM-DD' format) 14 | public let day: String 15 | ///Events TODO 16 | public let events: [FeedEvent] 17 | ///Tracks to play with ads 18 | public let tracksToPlayWithAds: [TrackWithAds] 19 | ///Playable tracks 20 | public let tracksToPlay: [Track] 21 | 22 | public init(day: String, events: [FeedEvent], tracksToPlayWithAds: [TrackWithAds], tracksToPlay: [Track]) { 23 | self.day = day 24 | self.events = events 25 | self.tracksToPlayWithAds = tracksToPlayWithAds 26 | self.tracksToPlay = tracksToPlay 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Classes/Feed/GeneratedPlaylist.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GeneratedPlaylist.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 04.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Back-end generated playlist 11 | public class GeneratedPlaylist: YMBaseObject, Decodable { 12 | 13 | ///Playlist type 14 | public let type: String 15 | ///Ready for playing playlist marker 16 | public let ready: Bool 17 | ///User notified about updates marker 18 | public let notify: Bool 19 | ///Generated playlist 20 | public let data: Playlist? 21 | ///Palylist description TODO 22 | public let description: [String]? 23 | 24 | public init(type: String, ready: Bool, notify: Bool, data: Playlist?, description: [String]?) { 25 | self.type = type 26 | self.ready = ready 27 | self.notify = notify 28 | self.data = data 29 | 30 | self.description = description 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Classes/Feed/Headline.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Headline.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 30.07.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents feed headline object 11 | public class Headline: Decodable { 12 | ///Headline ID 13 | public let id: String 14 | ///Headline object type 15 | public let type: String 16 | ///Headline message 17 | public let message: String 18 | 19 | public init(id: String, type: String, message: String) { 20 | self.id = id 21 | self.type = type 22 | self.message = message 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Classes/Feed/TrackWithAds.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TrackWithAds.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 04.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | public class TrackWithAds: Decodable { 11 | //Note:Поле `type` встречалось только с значением `track`. 12 | 13 | ///Type TODO 14 | public let type: String 15 | ///Track 16 | public let track: Track? 17 | 18 | public init(type: String, track: Track?) { 19 | self.type = type 20 | self.track = track 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Classes/Genre/GenreImage.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Images.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 04.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents genre image 11 | public class GenreImage: Decodable { 12 | 13 | enum CodingKeys: String, CodingKey { 14 | case img_208x208 = "208x208" 15 | case img_300x300 = "300x300" 16 | } 17 | 18 | ///Image 208x208 px url 19 | public let img_208x208: String? 20 | ///Image 300x300 px url 21 | public let img_300x300: String? 22 | 23 | public init(img_208: String?, img_300: String?) { 24 | self.img_208x208 = img_208 25 | self.img_300x300 = img_300 26 | } 27 | 28 | public func download_208(completion: @escaping (Result) -> Void) { 29 | if let g_img = img_208x208 { 30 | download(fullPath: g_img, completion: completion) 31 | } 32 | } 33 | 34 | public func download_300(completion: @escaping (Result) -> Void) { 35 | if let g_img = img_300x300 { 36 | download(fullPath: g_img, completion: completion) 37 | } 38 | } 39 | 40 | public required init(from decoder: Decoder) throws { 41 | let container = try decoder.container(keyedBy: CodingKeys.self) 42 | self.img_208x208 = try? container.decodeIfPresent(String.self, forKey: .img_208x208) 43 | self.img_300x300 = try? container.decodeIfPresent(String.self, forKey: .img_300x300) 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /Classes/Genre/GenreTitle.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GenreTitle.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 04.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents genre title info 11 | public class GenreTitle: Decodable { 12 | 13 | ///Head title 14 | public let title: String 15 | ///Full head title 16 | public let fullTitle: String? 17 | 18 | public init(title: String, fullTitle: String?) { 19 | self.title = title 20 | self.fullTitle = fullTitle 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Classes/Icon.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Icon.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 04.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents icon 11 | public class Icon: Decodable { 12 | 13 | ///background color in HEX 14 | public let backgroundColor: String 15 | ///Image url 16 | public let imageUrl: String 17 | 18 | public init(backgroundColor: String, imageUrl: String) { 19 | self.backgroundColor = backgroundColor 20 | self.imageUrl = imageUrl 21 | } 22 | 23 | ///Downloads image 24 | ///- Parameter width: Width of the image 25 | ///- Parameter height: Height of the image 26 | ///- Parameter completion: image data response handler 27 | public func downloadIcon(width: Int = 200, height: Int = 200, completion: @escaping (Result) -> Void) { 28 | let size = String(width) + "x" + String(height) 29 | let urlStr = "https://" + imageUrl.replacingOccurrences(of: "%%", with: size) 30 | download(fullPath: urlStr, completion: completion) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Classes/Label/MusicLabel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Label.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 15.10.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents music label 11 | public class MusicLabel: Decodable { 12 | public let pager: Pager 13 | public let artists: [Artist]? 14 | public let albums: [Album]? 15 | 16 | public init(pager: Pager, artists: [Artist]?, albums: [Album]?) { 17 | self.pager = pager 18 | self.albums = albums 19 | self.artists = artists 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Classes/Landing/Chart.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Chart.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 04.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents chart element object 11 | public class Chart: Decodable { 12 | //Note:Смещение - это количество позиций, на которые трек поднялся или опустился в чарте. 13 | 14 | ///Item position in the chart 15 | public let position: Int 16 | ///TODO 17 | public let progress: String 18 | ///Listeners count 19 | public let listeners: Int 20 | ///Item position shift count 21 | public let shift: Int 22 | ///Background color 23 | public let bgColor: String? 24 | ///Track UID 25 | public let trackId: TrackId? 26 | 27 | public init(position: Int, progress: String, listeners: Int, shift: Int, bgColor: String?, trackId: TrackId?) { 28 | self.position = position 29 | self.progress = progress 30 | self.listeners = listeners 31 | self.shift = shift 32 | 33 | self.bgColor = bgColor 34 | self.trackId = trackId 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Classes/Landing/ChartInfoMenu.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ChartInfoMenu.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 04.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents chart menu 11 | public class ChartInfoMenu: Decodable { 12 | 13 | ///Menu elements list 14 | public let items: [ChartInfoMenuItem] 15 | 16 | public init(items: [ChartInfoMenuItem]) { 17 | self.items = items 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Classes/Landing/ChartInfoMenuItem.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ChartInfoMenuItem.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 04.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents chart menu item 11 | public class ChartInfoMenuItem: Decodable { 12 | 13 | ///Item title 14 | public let title: String 15 | ///Chart reqeust postfix 16 | public let url: String 17 | ///'Current element' marker 18 | public let selected: Bool? 19 | 20 | public init(title: String, url: String, selected: Bool?) { 21 | self.title = title 22 | self.url = url 23 | self.selected = selected 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Classes/Landing/ChartItem.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ChartItem.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 04.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represent track in the chart 11 | public class ChartItem: YMBaseObject, Decodable { 12 | 13 | ///Chart track info 14 | public let track: Track? 15 | ///Chart element 16 | public let chart: Chart? 17 | 18 | public init(track: Track?, chart: Chart?) { 19 | self.track = track 20 | self.chart = chart 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Classes/Landing/ChartList.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ChartInfo.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 04.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents chart info 11 | public class ChartList: Decodable { 12 | 13 | ///Chart UID 14 | public let id: String 15 | ///Chart type 16 | public let type: String 17 | ///Chart source 18 | public let typeForFrom: String 19 | ///Chart title 20 | public let title: String 21 | ///Chart items list 22 | public let menu: ChartInfoMenu? 23 | ///Playlist data in chart 24 | public let chart: Playlist? 25 | ///Chart description 26 | public let chartDescription: String? 27 | 28 | public init(id: String, type: String, typeForFrom: String, title: String, menu: ChartInfoMenu?, chart: Playlist?, chartDescription: String?) { 29 | self.id = id 30 | self.type = type 31 | self.typeForFrom = typeForFrom 32 | self.title = title 33 | 34 | self.menu = menu 35 | self.chart = chart 36 | self.chartDescription = chartDescription 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Classes/Landing/Landing.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Landing.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 04.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents landing 11 | public class Landing: Decodable { 12 | 13 | ///Haloween marker 14 | public let pumpkin: Bool 15 | ///Content UID 16 | public let contentId: String 17 | ///Landing blocks 18 | public let blocks: [Block] 19 | 20 | public init(pumpkin: Bool, contentId: String, blocks: [Block]) { 21 | self.pumpkin = pumpkin 22 | self.contentId = contentId 23 | self.blocks = blocks 24 | } 25 | 26 | public func getItem(index: Int) -> Block { 27 | return blocks[index] 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Classes/Landing/LandingBlock.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LandingBlock.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 01.09.2021. 6 | // 7 | 8 | ///Represents landing blocks available types 9 | public enum LandingBlock: String, CaseIterable { 10 | case personal_playlists = "personal-playlists" 11 | case promotions 12 | case new_releases = "new-releases" 13 | case new_playlists = "new-playlists" 14 | case mixes 15 | case chart 16 | case artists 17 | case albums 18 | case playlists 19 | case play_contexts 20 | } 21 | -------------------------------------------------------------------------------- /Classes/Landing/LandingList.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LandingList.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 04.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Landing objects 11 | public class LandingList: Decodable { 12 | //Note: Известные значения поля `type`: `new-playlists`, `new-releases`, `podcasts`. В зависимости от типа будет заполнено то, или иное поле. 13 | 14 | ///Result type 15 | public let type: String 16 | ///Event source 17 | public let typeForFrom: String 18 | ///Page title 19 | public let title: String 20 | ///List UID 21 | public let id: String? 22 | ///New albums 23 | public let newReleases: [Int]? 24 | ///New playlists 25 | public let newPlaylists: [PlaylistId]? 26 | ///Podcasts 27 | public let podcasts: [Int]? 28 | 29 | public init(type: String, typeForFrom: String, title: String, id: String?, newReleases: [Int]?, newPlaylists: [PlaylistId]?, podcasts: [Int]?) { 30 | self.type = type 31 | self.typeForFrom = typeForFrom 32 | self.title = title 33 | 34 | self.id = id 35 | self.newReleases = newReleases 36 | self.newPlaylists = newPlaylists 37 | self.podcasts = podcasts 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Classes/Landing/PersonalPlaylistsData.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PersonalPlaylistsData.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 04.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Personal playlist additional info provider 11 | public class PersonalPlaylistsData: YMBaseObject, Decodable { 12 | 13 | ///TODO 14 | public let isWizardPassed: Bool 15 | 16 | public init(isWizardPassed: Bool) { 17 | self.isWizardPassed = isWizardPassed 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Classes/Landing/PlayContextData.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PlayContextData.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 04.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represent playable data of context 11 | public class PlayContextData: YMBaseObject, Decodable { 12 | 13 | ///other tracks of context 14 | public let otherTracks: [TrackShortOld] 15 | 16 | public init(otherTracks: [TrackShortOld]) { 17 | self.otherTracks = otherTracks 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Classes/Landing/Promotion/PromotionItem.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PromotionItem.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 15.10.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | public class PromotionPlaylist: Decodable { 11 | public let playlist: Playlist? 12 | 13 | public init(playlist: Playlist?) { 14 | self.playlist = playlist 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Classes/Like/Like.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Like.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 03.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents object with marker 'I like this' 11 | public class Like: Decodable { 12 | 13 | //Note: В поле `type` содержится одно из трёх значений: `artist`, `playlist`, `album`. Обозначает поле, в котором содержится информация. 14 | 15 | ///Object type 16 | public let type: String? 17 | ///'Like' marker' UID 18 | public let id: String 19 | ///Date and time of adding marker 20 | public let timestamp: String? 21 | ///Liked album 22 | public let album: Album? 23 | ///Liked artist 24 | public let artist: Artist? 25 | ///Liked playlist 26 | public let playlist: Playlist? 27 | ///Short description 28 | public let shortDescription: String? 29 | ///Full description 30 | public let description: String? 31 | ///'Premier' marker 32 | public let isPremiere: Bool? 33 | ///'Banner appearance' marker 34 | public let isBanner: Bool? 35 | 36 | public init(type: String?, id: String, timestamp: String?, album: Album?, artist: Artist?, playlist: Playlist?, shortDescription: String?, description: String?, isPremiere: Bool?, isBanner: Bool?) { 37 | self.id = id 38 | self.type = type 39 | 40 | self.album = album 41 | self.artist = artist 42 | self.playlist = playlist 43 | self.timestamp = timestamp 44 | self.shortDescription = shortDescription 45 | self.description = description 46 | self.isPremiere = isPremiere 47 | self.isBanner = isBanner 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /Classes/Like/LikeObject.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LikeObjectId.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 26.07.2021. 6 | // 7 | ///Represents universal like object ID info 8 | public class LikeObject: Decodable { 9 | ///Object ID 10 | public let id: String? 11 | ///Album ID (for track object) 12 | public let albumId: String? 13 | ///Liked artist 14 | public let artist: Artist? 15 | ///Liked playlist 16 | public let playlist: Playlist? 17 | ///Like timestamp 18 | public let timestamp: String? 19 | 20 | 21 | enum CodingKeys: CodingKey { 22 | case id 23 | case albumId 24 | case artist 25 | case playlist 26 | case timestamp 27 | } 28 | 29 | public init(id: String?, albumId: String?, artist: Artist?, playlist: Playlist?, timestamp: String?) { 30 | self.id = id 31 | self.albumId = albumId 32 | self.artist = artist 33 | self.playlist = playlist 34 | self.timestamp = timestamp 35 | } 36 | 37 | public required init(from decoder: Decoder) throws { 38 | let container = try decoder.container(keyedBy: CodingKeys.self) 39 | var id: String? = nil 40 | do { 41 | id = try container.decode(String.self, forKey: .id) 42 | } catch { 43 | let idInt = try? container.decodeIfPresent(Int.self, forKey: .id) 44 | if let g_id = idInt { 45 | id = String(g_id) 46 | } 47 | } 48 | self.id = id 49 | self.albumId = try? container.decodeIfPresent(String.self, forKey: .albumId) 50 | self.artist = try? container.decodeIfPresent(Artist.self, forKey: .artist) 51 | self.playlist = try? container.decodeIfPresent(Playlist.self, forKey: .playlist) 52 | self.timestamp = try? container.decodeIfPresent(String.self, forKey: .timestamp) 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /Classes/ListenHistory/ListenHistory.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ListenHistory.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 14.10.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents history of listened tracks for account 11 | public class ListenHistory: Decodable { 12 | 13 | ///Object types (artists, playlists, albums etc) with tracks data 14 | public let contexts: [ListenHistoryItem] 15 | //public let otherTracks: [TrackShortOld]? 16 | 17 | public init(contexts: [ListenHistoryItem]) { 18 | self.contexts = contexts 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Classes/ListenHistory/ListenHistoryContextType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ListenHistoryContextType.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 14.10.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | public enum ListenHistoryContextType: String { 11 | case album 12 | case artist 13 | case playlist 14 | } 15 | -------------------------------------------------------------------------------- /Classes/ListenHistory/ListenHistoryItem.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ListenHistory.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 14.10.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents recent listen history object 11 | public class ListenHistoryItem: Decodable { 12 | 13 | ///Yandex Music app type 14 | public let client: String 15 | ///Object type 16 | public let context: String 17 | ///Object ID 18 | public let contextItem: Int 19 | ///Object children tracks data 20 | public let tracks: [TrackShortOld] 21 | 22 | public init(client: String, context: String, contextItem: Int, tracks: [TrackShortOld]) { 23 | self.client = client 24 | self.context = context 25 | self.contextItem = contextItem 26 | self.tracks = tracks 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Classes/Pager.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Pager.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 03.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents objects set paginator 11 | public class Pager: Decodable { 12 | 13 | ///Total objects count 14 | public let total: Int 15 | ///Page number 16 | public let page: Int 17 | ///Objects count on page 18 | public let perPage: Int 19 | 20 | public init(total: Int, page: Int, perPage: Int) { 21 | self.total = total 22 | self.page = page 23 | self.perPage = perPage 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Classes/PermissionAlert.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PermissionAlert.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 03.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents notifications 11 | public class PermissionAlert: Decodable { 12 | 13 | ///Notifications list 14 | public let alerts: [String] 15 | 16 | public init(alerts: [String]) { 17 | self.alerts = alerts 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Classes/Playlist/CaseForms.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CasesForm.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 03.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Cases of name 11 | public class CaseForms: Decodable { 12 | 13 | ///Именительный падеж 14 | public let nominative: String 15 | ///Родительный падеж 16 | public let genitive: String 17 | ///Дательный падеж 18 | public let dative: String 19 | ///Винительный падеж 20 | public let accusative: String 21 | ///Творительный падеж 22 | public let instrumental: String 23 | ///Предложный падеж 24 | public let prepositional: String 25 | 26 | public init(nominative: String, genitive: String, dative: String, accusative: String, instrumental: String, prepositional: String) { 27 | self.nominative = nominative 28 | self.genitive = genitive 29 | self.dative = dative 30 | self.accusative = accusative 31 | self.instrumental = instrumental 32 | self.prepositional = prepositional 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Classes/Playlist/Contest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Contest.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 03.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Contest TODO 11 | public class Contest: Decodable { 12 | 13 | ///Contest UID 14 | public let contestId: String 15 | ///Contest status 16 | public let status: String 17 | ///Edit allowed marker 18 | public let canEdit: Bool 19 | ///Sent date 20 | public let sent: String? 21 | ///output date (ending date) 22 | public let withdrawn: String? 23 | 24 | public init(contestId: String, status: String, canEdit: Bool, sent: String?, withdrawn: String?) { 25 | self.contestId = contestId 26 | self.status = status 27 | self.canEdit = canEdit 28 | self.sent = sent 29 | self.withdrawn = withdrawn 30 | 31 | 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /Classes/Playlist/CustomWave.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CustomWave.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 09.06.2023. 6 | // 7 | 8 | ///Represents playlist additional description 9 | public class CustomWave: Decodable { 10 | 11 | ///Playlist title 12 | public let title: String 13 | ///Lottie JSON animation url 14 | public let animationUrl: String? 15 | ///TODO 16 | public let position: String? 17 | 18 | init(title: String, animationUrl: String?, position: String?) { 19 | self.title = title 20 | self.animationUrl = animationUrl 21 | self.position = position 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Classes/Playlist/OpenGraphData.swift: -------------------------------------------------------------------------------- 1 | // 2 | // OpenGraphData.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 03.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Data provider for Open Graph 11 | public class OpenGraphData: Decodable { 12 | 13 | ///Head title 14 | public let title: String 15 | ///Data description 16 | public let description: String 17 | public let image: Cover 18 | 19 | public init(title: String, description: String, image: Cover) { 20 | self.title = title 21 | self.description = description 22 | self.image = image 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Classes/Playlist/PlayCounter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PlayCounter.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 03.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Days counter (for playliists) 11 | public class PlayCounter: Decodable { 12 | 13 | ///Counter value (count of days) 14 | public let value: Int 15 | ///Counter description 16 | public let description: String 17 | ///'Is there the update for today?' marker 18 | public let updated: Bool 19 | 20 | public init(value: Int, description: String, updated: Bool) { 21 | self.value = value 22 | self.description = description 23 | self.updated = updated 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Classes/Playlist/PlaylistAbsence.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PlaylistAbsence.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 03.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Playlist absence info 11 | public class PlaylistAbsence: Decodable { 12 | 13 | ///Playlist type UID 14 | public let kind: Int 15 | ///Playlist absence reason description 16 | public let reason: String 17 | 18 | public init(kind: Int, reason: String) { 19 | self.kind = kind 20 | self.reason = reason 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Classes/Playlist/PlaylistBrand.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PlaylistBrand.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 03.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Playlist brand 11 | public class PlaylistBrand: Decodable { 12 | //Note: Отслеживание просмотров на сторонник сервисах бренда, рекомендация следующего контента. 13 | 14 | ///Playlist image url 15 | public let image: String 16 | ///Background color 17 | public let background: String 18 | ///Playlist content url 19 | public let reference: String 20 | ///Shows tracker url (gif image [web beacon]) 21 | public let pixels: [String] 22 | ///Interface theme 23 | public let theme: String 24 | ///Playlist theme TODO 25 | public let playlistTheme: String 26 | ///Button title 27 | public let button: String 28 | 29 | public init(image: String, background: String, reference: String, pixels: [String], theme: String, playlistTheme: String, button: String) { 30 | self.image = image 31 | self.background = background 32 | self.reference = reference 33 | self.pixels = pixels 34 | self.theme = theme 35 | self.playlistTheme = playlistTheme 36 | self.button = button 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Classes/Playlist/PlaylistFor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MadeFor.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 03.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Back-end generated playlist for user 11 | public class PlaylistFor: Decodable { 12 | 13 | ///Information about user 14 | public let userInfo: User? 15 | ///User name cases 16 | public let caseForms: CaseForms? 17 | 18 | public init (userInfo: User?, caseForms: CaseForms?) { 19 | self.userInfo = userInfo 20 | self.caseForms = caseForms 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Classes/Playlist/PlaylistId.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PlaylistId.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 03.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Playlist ID info 11 | public class PlaylistId: Decodable { 12 | 13 | ///Playlist owner user Id 14 | public let uid: Int 15 | ///Playlist type UID 16 | public let kind: Int 17 | 18 | public init(uid: Int, kind: Int) { 19 | self.uid = uid 20 | self.kind = kind 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Classes/Playlist/PlaylistImportStatus.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PlaylistImportStatus.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 12.05.2022. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents playlist import check status 11 | public class PlaylistImportStatus: Decodable { 12 | 13 | ///Import status 14 | public let status: String 15 | ///Playlist import complete trigger 16 | public var done: Bool { 17 | get {return status == "done"} 18 | } 19 | ///Imported playlist info 20 | public let playlists: [Playlist]? 21 | 22 | public init(status: String, playlists: [Playlist]?) { 23 | self.status = status 24 | self.playlists = playlists 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Classes/Playlist/PlaylistRecomendation.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PlaylistRecommendation.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 03.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Recomedations for playlist 11 | public class PlaylistRecommendation: Decodable { 12 | 13 | ///Recommended tracks list 14 | public let tracks: [Track] 15 | ///Tracks set UID 16 | public let batchId: String? 17 | 18 | public init(tracks: [Track], batchId: String?) { 19 | self.batchId = batchId 20 | self.tracks = tracks 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Classes/Playlist/PlaylistVisibilityType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PlaylistVisibilityType.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 01.09.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents playlist availability 11 | public enum PlaylistVisibilityType: String { 12 | case `public` 13 | case `private` 14 | } 15 | -------------------------------------------------------------------------------- /Classes/Playlist/PlaylsitEditComand.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PlaylsitEditComand.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 02.09.2021. 6 | // 7 | 8 | //Represents playlist content change operation item 9 | public class PlaylistEditCommand: Encodable { 10 | 11 | ///Edit command type (insert or delete) 12 | public let op: String 13 | 14 | ///Begin index for removing 15 | public let from: Int? 16 | ///End index for removing 17 | public let to: Int? 18 | 19 | ///Insert position 20 | public let at: Int? 21 | ///Tracks' IDs for insert 22 | public let tracks: [[String: Int]]? 23 | 24 | ///Initializes delete command 25 | public init(from: Int, to: Int) { 26 | self.op = "delete" 27 | self.from = from 28 | self.to = to 29 | at = nil 30 | tracks = nil 31 | } 32 | 33 | ///Initializes insert command 34 | public init(position: Int, tracksData:[TrackId]) { 35 | self.op = "insert" 36 | from = nil 37 | to = nil 38 | self.at = position 39 | var trackIds: [[String: Int]] = [] 40 | for track in tracksData { 41 | if let g_albumdId = track.albumId { 42 | let trackId = track.id ?? track.trackId 43 | if let g_trackId = trackId { 44 | trackIds.append([ 45 | "id": g_trackId, 46 | "albumId": g_albumdId 47 | ]) 48 | } 49 | } 50 | } 51 | self.tracks = trackIds 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /Classes/Playlist/Preroll.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Preroll.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 26.07.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Playable content before main payload 11 | public class Preroll: Decodable { 12 | ///Pre-roll ID 13 | public let id: String? 14 | ///Pre-roll source link 15 | public let link: String? 16 | 17 | public init(id: String?, link: String?) { 18 | self.id = id 19 | self.link = link 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Classes/Playlist/Tag.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Tag.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 03.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents tag (set) 11 | public class Tag: Decodable { 12 | 13 | ///Tag UID 14 | public let id: String 15 | ///Tag value (name in lower case) 16 | public let value: String 17 | ///Tag name (display name) 18 | public let name: String? 19 | ///Tag description for Open Graph 20 | public let ogDescription: String? 21 | ///Open Graph image url 22 | public let ogImage: String? 23 | 24 | public init(id: String, value: String, name: String, ogDescription: String, ogImage: String?) { 25 | self.id = id 26 | self.value = value 27 | self.name = name 28 | self.ogDescription = ogDescription 29 | 30 | self.ogImage = ogImage 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Classes/Playlist/TagResult.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TagResult.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 03.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Tag and related for it playlists 11 | public class TagResult: Decodable { 12 | ///Tag 13 | public let tag: Tag 14 | ///Related for current tag playlists IDs 15 | public let ids: [PlaylistId] 16 | 17 | public init(tag: Tag, ids: [PlaylistId]) { 18 | self.tag = tag 19 | self.ids = ids 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Classes/PromoCodeStatus.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PromoCodeStatus.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 03.06.2021. 6 | // 7 | 8 | ///Promo code activation status 9 | public class PromoCodeStatus: Decodable { 10 | 11 | ///Operation status 12 | public let status: String 13 | ///Operation status description 14 | public let statusDesc: String 15 | ///user account info 16 | public let accountStatus: Status? 17 | 18 | public init(status: String, statusDesc: String, accountStatus: Status?) { 19 | self.status = status 20 | self.statusDesc = statusDesc 21 | self.accountStatus = accountStatus 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Classes/Queue/QueueContext.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Context.swift 3 | // yandexMusic-iOS 4 | // 5 | // Created by Developer on 26.05.2021. 6 | // 7 | 8 | ///Queue description 9 | public class QueueContext: Codable { 10 | 11 | ///Content type UID (of album, playlist...) 12 | public let id: String? 13 | ///Content type ('album', 'playlist'...) 14 | public let type: String 15 | ///Content description 16 | public let description: String? 17 | 18 | public init(type: String, id: String?, description: String?) { 19 | self.type = type 20 | self.id = id 21 | self.description = description 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Classes/Queue/QueueItem.swift: -------------------------------------------------------------------------------- 1 | // 2 | // QueueItem.swift 3 | // YM-API 4 | // 5 | // Created by Admin on 03.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Tracks queue in devices' queue list 11 | public class QueueItem: Decodable { 12 | 13 | ///Queue UID 14 | public let id: String 15 | ///Queue object descriptor 16 | public let context: QueueContext? 17 | ///Date of last modification 18 | public let modified: String 19 | 20 | public var modifyDate: Date? { 21 | get {return DateUtil.fromIsoFormat(dateStr: modified)} 22 | } 23 | 24 | public init(id: String, context: QueueContext?, modified: String) { 25 | self.id = id 26 | self.context = context 27 | self.modified = modified 28 | } 29 | 30 | ///Gets queue info from API 31 | public func fetchQueue(completion: @escaping (_ result: Result) -> Void) { 32 | getQueueDataByApi(token: accountSecret, queueId: id, completion: completion) 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Classes/Queue/QueuesList.swift: -------------------------------------------------------------------------------- 1 | // 2 | // QueuesList.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 02.09.2021. 6 | // 7 | 8 | ///Represents active queses array for device 9 | public class QueueList: Decodable { 10 | 11 | ///Active queues for device 12 | public let queues: [QueueItem] 13 | 14 | public init(queues: [QueueItem]) { 15 | self.queues = queues 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Classes/Rotor/DiscreteScale.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DiscreteScale.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 26.05.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Rerpesenets Discrete value 11 | public class DiscreteScale: Decodable { 12 | 13 | ///Type of discrete value 14 | public let type: String 15 | ///Name of discrete value 16 | public let name: String 17 | ///Minimum value 18 | public let min: KeyValueObj? 19 | ///Maximum value 20 | public let max: KeyValueObj? 21 | 22 | public init(type: String, name: String, min: KeyValueObj?, max: KeyValueObj?) { 23 | self.type = type 24 | self.name = name 25 | self.min = min 26 | self.max = max 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Classes/Rotor/Enum.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Enum.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 26.05.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents enums 11 | public class Enum: Decodable { 12 | 13 | ///Enum type 14 | public let type: String 15 | ///Enum name 16 | public let name: String 17 | ///Available values 18 | public let possibleValues: [KeyValueObj] 19 | 20 | public init(type: String, name: String, possibleValues: [KeyValueObj]) { 21 | self.type = type 22 | self.name = name 23 | self.possibleValues = possibleValues 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Classes/Rotor/KeyValueObj.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Value.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 26.05.2021. 6 | // 7 | 8 | ///Represents some value or variable with key-name 9 | public class KeyValueObj: Decodable { 10 | 11 | enum CodingKeys: CodingKey { 12 | case name 13 | case value 14 | } 15 | 16 | public let name: String 17 | public let value: String 18 | 19 | public init(name: String, value: String) { 20 | self.value = value 21 | self.name = name 22 | } 23 | 24 | public required init(from decoder: Decoder) throws { 25 | let container = try decoder.container(keyedBy: CodingKeys.self) 26 | var value: String = "" 27 | do { 28 | value = try container.decode(String.self, forKey: .value) 29 | } catch { 30 | let valueInt = (try? container.decodeIfPresent(Int.self, forKey: .value)) ?? 0 31 | value = String(valueInt) 32 | } 33 | self.value = value 34 | self.name = try container.decode(String.self, forKey: .name) 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Classes/Rotor/RadioDashboard.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RadioDashboard.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 26.05.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Recommended for user radio stations 11 | public class RadioDashboard: Decodable { 12 | 13 | ///Dashboard UID 14 | public let dashboardId: String 15 | ///List of radio station with settings and preferences 16 | public let stations: [StationResult] 17 | ///Haloween 18 | public let pumpkin: Bool 19 | 20 | public init(dashboardId: String, stations: [StationResult], pumpkin: Bool) { 21 | self.dashboardId = dashboardId 22 | self.stations = stations 23 | self.pumpkin = pumpkin 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Classes/Rotor/RadioId.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Id.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 26.05.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Radio station identificator 11 | public class RadioId: Decodable { 12 | ///Radio station type 13 | public let type: String 14 | ///Radio station tag 15 | public let tag: String 16 | 17 | ///Combined data - radio station ID 18 | public var stationId: String { 19 | get {return type + ":" + tag} 20 | } 21 | 22 | public init(type: String, tag: String) { 23 | self.type = type 24 | self.tag = tag 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Classes/Rotor/RadioRestrictions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Restrictions.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 26.05.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Radio station restrictions settings 11 | public class RadioRestrictions: Decodable { 12 | 13 | ///Available languages enum 14 | public let language: Enum? 15 | ///Available diversity values (for tracks) 16 | public let diversity: Enum? 17 | ///Track mood measure restrictions 18 | public let mood: DiscreteScale? 19 | ///Track energy measure restrictions 20 | public let energy: DiscreteScale? 21 | ///Available mood values 22 | public let moodEnergy: Enum? 23 | 24 | public init(language: Enum?, diversity: Enum?, mood: DiscreteScale?, energy: DiscreteScale?, moodEnergy: Enum?) { 25 | self.language = language 26 | self.diversity = diversity 27 | self.mood = mood 28 | self.energy = energy 29 | self.moodEnergy = moodEnergy 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /Classes/Rotor/RadioSequence.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RadioSequence.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 26.05.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Radio track sequence item 11 | public class RadioSequence: Decodable { 12 | 13 | //Note: Известные значения поля `type_`: `track`. Возможно, есть `ad`. 14 | 15 | ///Seqeunce type 16 | public let type: String 17 | ///Sequence track info 18 | public let track: Track? 19 | ///Track linked marker 20 | public let liked: Bool 21 | 22 | public init(type: String, track: Track?, liked: Bool) { 23 | self.type = type 24 | self.track = track 25 | self.liked = liked 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Classes/Rotor/RotorSettings.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RotorSettings.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 26.05.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | public class RotorSettings: Decodable { 11 | // Note: Поля `energy`, `mood` используются в старых настройках (`settings1`). Значения `mood_energy`: `fun`, `active`, `calm`, `sad`, `all`. Значения `diversity`: `favorite`, `popular`, `discover`, `default`. Значения `language`: `not-russian`, `russian`, `any`. 12 | 13 | public let language: String 14 | ///Diversity of possible tracks 15 | public let diversity: String 16 | ///Legacy option of tracks' 'mood' 17 | public let mood: Int? 18 | ///Option of tracks' energy 19 | public let energy: Int? 20 | ///Option of tracks mood 21 | public let moodEnergy: String? 22 | 23 | public init(language: String, diversity: String, mood: Int?, energy: Int?, moodEnergy: String?) { 24 | self.language = language 25 | self.diversity = diversity 26 | 27 | self.mood = mood 28 | self.energy = energy 29 | self.moodEnergy = moodEnergy 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /Classes/Rotor/StationData.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StationData.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 26.05.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents personal radio station info 11 | public class StationData: Decodable { 12 | 13 | ///Name of the personal radio station 14 | public let name: String 15 | 16 | public init(name: String) { 17 | self.name = name 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Classes/Rotor/StationDiversityType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StationDiversityType.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 26.08.2021. 6 | // 7 | 8 | public enum StationDiversityType: String { 9 | case favorite 10 | case popular 11 | case discover 12 | case defaultDiversity = "default" 13 | } 14 | -------------------------------------------------------------------------------- /Classes/Rotor/StationMoodType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RotorMoodType.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 26.08.2021. 6 | // 7 | 8 | public enum StationMoodType: String { 9 | case fun 10 | case active 11 | case calm 12 | case sad 13 | case all 14 | } 15 | -------------------------------------------------------------------------------- /Classes/Rotor/StationPreferredLanguageType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StationPreferredLanguageType.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 26.08.2021. 6 | // 7 | 8 | public enum StationPreferredLanguageType: String { 9 | case any 10 | case russian 11 | case not_russian = "not-russian" 12 | } 13 | -------------------------------------------------------------------------------- /Classes/Rotor/StationResult.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StationResult.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 26.05.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents radio station object with settings 11 | public class StationResult: Decodable { 12 | 13 | ///Radio station info 14 | public let station: Station? 15 | ///Radio station title (russian) 16 | public let rupTitle: String? 17 | ///Radio station description (russian) 18 | public let rupDescription: String? 19 | ///Radio station another name 20 | public let customName: String? 21 | ///Radio station settings set 22 | public let settings: RotorSettings? 23 | ///Radio station settings set 24 | public let settings2: RotorSettings? 25 | ///Advertisement settings 26 | public let adParams: AdParams? 27 | ///TODO 28 | public let explanation: String? 29 | ///Prerolls TODO 30 | public let prerolls: [String]? 31 | 32 | public init(station: Station?, rupTitle: String?, rupDescription: String?, customName: String?, settings: RotorSettings?, settings2: RotorSettings?, adParams: AdParams?, explanation: String?, prerolls: [String]?) { 33 | self.station = station 34 | self.rupTitle = rupTitle 35 | self.rupDescription = rupDescription 36 | self.customName = customName 37 | self.settings = settings 38 | self.settings2 = settings2 39 | self.adParams = adParams 40 | self.explanation = explanation 41 | self.prerolls = prerolls 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /Classes/Rotor/StationTracksResult.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StationTracksResult.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 26.05.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Radio station tracks sequence 11 | public class StationTracksResult: Decodable { 12 | 13 | ///Radio station ID 14 | public let id: RadioId? 15 | ///Radio station tracks sequence 16 | public let sequence: [RadioSequence] 17 | ///Tracks sequence ID 18 | public let batchId: String 19 | ///Haloween 20 | public let pumpkin: Bool 21 | 22 | public init(id: RadioId?, sequence: [RadioSequence], batchId: String, pumpkin: Bool) { 23 | self.id = id 24 | self.sequence = sequence 25 | self.batchId = batchId 26 | self.pumpkin = pumpkin 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Classes/Rotor/StationType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StationType.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 26.08.2021. 6 | // 7 | 8 | public enum StationType: String { 9 | case rotor 10 | case generative 11 | } 12 | -------------------------------------------------------------------------------- /Classes/Search/SearchHistoryItem.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SearchHistoryItem.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 14.10.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents search history object 11 | public class SearchHistoryItem: Decodable { 12 | 13 | ///Type of the object 14 | public let type: String 15 | ///Optional search history item content - playlist 16 | public let playlist: Playlist? 17 | ///Optional search history item content - album 18 | public let album: Album? 19 | ///Optional search history item content - track 20 | public let track: Track? 21 | ///Optional search history item content - artist 22 | public let artist: Artist? 23 | 24 | public init(type: String, playlist: Playlist?, album: Album?, track: Track?, artist: Artist?) { 25 | self.type = type 26 | self.playlist = playlist 27 | self.album = album 28 | self.track = track 29 | self.artist = artist 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /Classes/Search/SearchResult/SearchResultAlbums.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SearchResultAlbums.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 15.07.2021. 6 | // 7 | 8 | ///Search results (albums)) 9 | public class SearchResultAlbums: Decodable { 10 | ///Type of item 11 | public let type: String? 12 | ///Result items total count 13 | public let total: Int 14 | ///Count of results at one page 15 | public let perPage: Int 16 | ///Block position 17 | public let order: Int 18 | ///Best result data object 19 | public let results: [Album] 20 | 21 | public init(type: String, total: Int, perPage: Int, order: Int, results: [Album]) { 22 | self.type = type 23 | self.total = total 24 | self.perPage = perPage 25 | self.order = order 26 | self.results = results 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Classes/Search/SearchResult/SearchResultArtists.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SearchResultArtists.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 15.07.2021. 6 | // 7 | 8 | ///Search results (artists) 9 | public class SearchResultArtists: Decodable { 10 | ///Type of item 11 | public let type: String? 12 | ///Result items total count 13 | public let total: Int 14 | ///Count of results at one page 15 | public let perPage: Int 16 | ///Block position 17 | public let order: Int 18 | ///Best result data object 19 | public let results: [Artist] 20 | 21 | public init(type: String, total: Int, perPage: Int, order: Int, results: [Artist]) { 22 | self.type = type 23 | self.total = total 24 | self.perPage = perPage 25 | self.order = order 26 | self.results = results 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Classes/Search/SearchResult/SearchResultPlaylists.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SearchResultPlaylists.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 15.07.2021. 6 | // 7 | 8 | ///Search results (playlists) 9 | public class SearchResultPlaylists: Decodable { 10 | ///Type of item 11 | public let type: String? 12 | ///Result items total count 13 | public let total: Int 14 | ///Count of results at one page 15 | public let perPage: Int 16 | ///Block position 17 | public let order: Int 18 | ///Best result data object 19 | public let results: [Playlist] 20 | 21 | public init(type: String, total: Int, perPage: Int, order: Int, results: [Playlist]) { 22 | self.type = type 23 | self.total = total 24 | self.perPage = perPage 25 | self.order = order 26 | self.results = results 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Classes/Search/SearchResult/SearchResultPodcasts.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SearchResultPodcasts.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 15.07.2021. 6 | // 7 | 8 | ///Search results (podcasts) 9 | public class SearchResultPodcasts: Decodable { 10 | ///Type of item 11 | public let type: String? 12 | ///Result items total count 13 | public let total: Int 14 | ///Count of results at one page 15 | public let perPage: Int 16 | ///Block position 17 | public let order: Int 18 | ///Best result data object 19 | public let results: [Podcast] 20 | 21 | public init(type: String, total: Int, perPage: Int, order: Int, results: [Podcast]) { 22 | self.type = type 23 | self.total = total 24 | self.perPage = perPage 25 | self.order = order 26 | self.results = results 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Classes/Search/SearchResult/SearchResultTracks.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SearchResultTracks.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 15.07.2021. 6 | // 7 | 8 | ///Search results (tracks) 9 | public class SearchResultTracks: Decodable { 10 | ///Type of item 11 | public let type: String? 12 | ///Result items total count 13 | public let total: Int 14 | ///Count of results at one page 15 | public let perPage: Int 16 | ///Block position 17 | public let order: Int 18 | ///Best result data object 19 | public let results: [Track] 20 | 21 | public init(type: String?, total: Int, perPage: Int, order: Int, results: [Track]) { 22 | self.type = type 23 | self.total = total 24 | self.perPage = perPage 25 | self.order = order 26 | self.results = results 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Classes/Search/SearchResult/SearchResultUsers.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SearchResultUsers.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 15.07.2021. 6 | // 7 | 8 | ///Search results (users) 9 | public class SearchResultUsers: Decodable { 10 | ///Type of item 11 | public let type: String? 12 | ///Result items total count 13 | public let total: Int 14 | ///Count of results at one page 15 | public let perPage: Int 16 | ///Block position 17 | public let order: Int 18 | ///Best result data object 19 | public let results: [User] 20 | 21 | public init(type: String?, total: Int, perPage: Int, order: Int, results: [User]) { 22 | self.type = type 23 | self.total = total 24 | self.perPage = perPage 25 | self.order = order 26 | self.results = results 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Classes/Search/SearchResult/SearchResultVideos.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SearchResultVideos.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 15.07.2021. 6 | // 7 | 8 | ///Search results (videos) 9 | public class SearchResultVideos: Decodable { 10 | ///Type of item 11 | public let type: String? 12 | ///Result items total count 13 | public let total: Int 14 | ///Count of results at one page 15 | public let perPage: Int 16 | ///Block position 17 | public let order: Int 18 | ///Best result data object 19 | public let results: [Video] 20 | 21 | public init(type: String, total: Int, perPage: Int, order: Int, results: [Video]) { 22 | self.type = type 23 | self.total = total 24 | self.perPage = perPage 25 | self.order = order 26 | self.results = results 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Classes/Search/SearchType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SearchType.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 25.08.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | public enum SearchType: UInt8 { 11 | case all 12 | case artist 13 | case user 14 | case playlist 15 | case track 16 | case podcast 17 | case podcast_episode 18 | } 19 | 20 | extension SearchType { 21 | public var stringType: String { 22 | switch self { 23 | case .all: return "all" 24 | case .artist: return "artist" 25 | case .user: return "user" 26 | case .playlist: return "playlist" 27 | case .track: return "track" 28 | case .podcast: return "podcast" 29 | case .podcast_episode: return "podcast_episode" 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Classes/Search/Suggestion.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Suggestion.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 26.05.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Suggestions during searching 11 | public class Suggestion: Decodable { 12 | 13 | ///Best suggestion for search 14 | public let best: Best? 15 | ///Possible advices for search reqeust 16 | public let suggestions: [String] 17 | 18 | public init(best: Best?, suggestions: [String]) { 19 | self.best = best 20 | self.suggestions = suggestions 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Classes/Shot/Shot.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Shot.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 25.05.2021. 6 | // 7 | 8 | ///Alisa's shot 9 | public class Shot: Decodable { 10 | 11 | ///Order number during playing 12 | public let order: Int 13 | ///Played shot marker 14 | public let played: Bool 15 | ///General information about shot 16 | public let shotData: ShotData 17 | ///Alisa's shot UID 18 | public let shotId: String 19 | ///Shot status 20 | public let status: String 21 | 22 | public init(order: Int, played: Bool, shotData: ShotData, shotId: String, status: String) { 23 | self.order = order 24 | self.played = played 25 | self.shotData = shotData 26 | self.shotId = shotId 27 | self.status = status 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Classes/Shot/ShotData.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ShotData.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 25.05.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///General info about Alisa's shot 11 | public class ShotData: Decodable { 12 | 13 | ///Shot cover url (Alisa icon) 14 | public let coverUri: String 15 | ///Alisa shot audio url 16 | public let mdsUrl: String 17 | ///Shot lyrics 18 | public let shotText: String 19 | ///Shot type 20 | public let shotType: ShotType 21 | 22 | public init( coverUri: String, mdsUrl: String, shotTxt: String, shotType: ShotType) { 23 | self.coverUri = coverUri 24 | self.mdsUrl = mdsUrl 25 | self.shotText = shotTxt 26 | self.shotType = shotType 27 | } 28 | 29 | ///Download Alisa shot cover 30 | func downloadCover(width: Int = 200, height: Int = 200, completion: @escaping (Result) -> Void) { 31 | let size = String(width) + "x" + String(height) 32 | let urlStr = "https://" + coverUri.replacingOccurrences(of: "%%", with: size) 33 | download(fullPath: urlStr, completion: completion) 34 | } 35 | 36 | ///Download Alisa's audio shot 37 | func downloadMds(completion: @escaping (Result) -> Void) { 38 | download(fullPath: mdsUrl, completion: completion) 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Classes/Shot/ShotEvent.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ShotEvent.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 25.05.2021. 6 | // 7 | 8 | ///Shot-event before starting new track 9 | public class ShotEvent: Decodable { 10 | 11 | ///Shot event UID 12 | public let eventId: String 13 | ///Shots from Alisa 14 | public let shots: [Shot] 15 | 16 | public init(eventId: String, shots: [Shot]) { 17 | self.eventId = eventId 18 | self.shots = shots 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Classes/Shot/ShotType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ShotType.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 25.05.2021. 6 | // 7 | 8 | public class ShotType: Decodable { 9 | 10 | ///Shot type UID 11 | public let id: String 12 | ///Shot headline 13 | public let title: String 14 | 15 | public init(id: String, title: String) { 16 | self.id = id 17 | self.title = title 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Classes/Supplement/Lyrics.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Lyrics.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 25.05.2021. 6 | // 7 | 8 | ///Track lyrics 9 | public class Lyrics: Decodable { 10 | 11 | ///Track lyrics UID 12 | public let id: Int 13 | ///Short track lyrics (first lines) 14 | public let lyrics: String 15 | ///Track full lyrics 16 | public let fullLyrics: String 17 | ///Rights accessibility marker 18 | public let hasRights: Bool 19 | ///Lyrics translation accessibility marker 20 | public let showTranslation: Bool 21 | ///Track lyrics language 22 | public let textLanguage: String? 23 | ///Track lyrics translation source url 24 | public let url: String? 25 | 26 | public init(id: Int, lyrics: String, fullLyrics: String, hasRights: Bool, showTranslation: Bool, textLanguage: String?, url: String?) { 27 | self.id = id 28 | self.lyrics = lyrics 29 | self.fullLyrics = fullLyrics 30 | self.hasRights = hasRights 31 | self.showTranslation = showTranslation 32 | 33 | self.textLanguage = textLanguage 34 | self.url = url 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Classes/Supplement/LyricsDownloadInfo.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LyricsDownloadInfo.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 02.03.2023. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Represents track lyrics download info 11 | public class LyricsDownloadInfo: Decodable { 12 | 13 | ///Formatted text file url, which contains track lyrics. Without subscription contains nothing 14 | public let downloadUrl: String 15 | public let lyricId: Int 16 | public let externalLyricId: String 17 | public let writers: [String]? 18 | public let major: Major 19 | 20 | public init(downloadUrl: String, lyricId: Int, externalLyricId: String, writers: [String]?, major: Major) { 21 | self.downloadUrl = downloadUrl 22 | self.lyricId = lyricId 23 | self.externalLyricId = externalLyricId 24 | self.writers = writers 25 | self.major = major 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Classes/Supplement/Supplement.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Supplement.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 25.05.2021. 6 | // 7 | 8 | ///Additional info about the track 9 | public class Supplement: Decodable { 10 | 11 | ///Track additional info UID 12 | public let id: String 13 | ///Track lyrics 14 | public let lyrics: Lyrics? 15 | ///Track videos 16 | public let videos: [VideoSupplement]? 17 | ///Radio availability marker 18 | public let radioIsAvailable: Bool? 19 | ///Podcast episode full description 20 | public let description: String? 21 | 22 | public init(id: String, lyrics: Lyrics?, videos: [VideoSupplement]?, radioAvailable: Bool?, description: String?) { 23 | self.id = id 24 | self.lyrics = lyrics 25 | self.videos = videos 26 | 27 | self.radioIsAvailable = radioAvailable 28 | self.description = description 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Classes/Supplement/VideoSupplement.swift: -------------------------------------------------------------------------------- 1 | // 2 | // VideoSupplement.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 25.05.2021. 6 | // 7 | 8 | ///Track videoclips 9 | public class VideoSupplement: Decodable { 10 | 11 | ///Video cover image url 12 | public let cover: String 13 | ///Video service provider 14 | public let provider: String 15 | ///Video name 16 | public let title: String? 17 | ///Video UID 18 | public let providerVideoId: String? 19 | ///Video url 20 | public let url: String? 21 | ///Video url on Yandex 22 | public let embedUrl: String? 23 | ///Video embedding HTML tag 24 | public let embed: String? 25 | 26 | public init(cover: String, provider: String, title: String?, providerID: String?, url: String?, embedUrl: String?, embed: String?) { 27 | self.cover = cover 28 | self.provider = provider 29 | 30 | self.title = title 31 | self.providerVideoId = providerID 32 | self.url = url 33 | self.embedUrl = embedUrl 34 | self.embed = embed 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Classes/Track/LicenseTextPart.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LicenseTextPart.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 25.05.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Part of text with license agreement url 11 | public class LicenceTextPart: Decodable { 12 | 13 | ///Part of the text (line) 14 | public let text: String 15 | ///License agreement url 16 | public let url: String 17 | 18 | public init(text: String, url: String) { 19 | self.text = text 20 | self.url = url 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Classes/Track/Major.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Major.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 25.05.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Major-label track 11 | public class Major: Decodable { 12 | public let id: Int 13 | public let name: String 14 | public let prettyName: String? 15 | 16 | public init(id: Int, name: String, prettyName: String?) 17 | { 18 | self.id = id 19 | self.name = name 20 | self.prettyName = prettyName 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Classes/Track/MetaData.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MetaData.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 25.05.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Track meta data 11 | public class MetaData: Decodable { 12 | 13 | ///Ablum name 14 | public let album: String? 15 | ///Number of the album's disk (volume) 16 | public let volume: Int? 17 | ///Release year 18 | public let year: Int? 19 | ///Track position on the album 20 | public let number: Int? 21 | ///Track genre 22 | public let genre: String? 23 | ///Track lyrics. NOTICE: There are only on user-uploaded tracks 24 | public let lyricist: String? 25 | ///Version TODO 26 | public let version:String? 27 | ///Track compositor TODO 28 | public let composer: String? 29 | 30 | public init(album: String?, volume: Int?, year: Int?, number: Int?, genre: String?, lyricist: String?, version:String?, composer: String?) { 31 | self.album = album 32 | self.volume = volume 33 | self.year = year 34 | self.number = number 35 | self.genre = genre 36 | self.lyricist = lyricist 37 | self.version = version 38 | self.composer = composer 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Classes/Track/Normalization.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Normalization.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 25.05.2021. 6 | // 7 | ///Track normalization data 8 | public class Normalization: Decodable { 9 | 10 | //Gain value for audio signal applying 11 | public let gain: Float 12 | ///Peak audio signal wave point 13 | public let peak: Int 14 | 15 | public init(gain: Float, peak: Int) { 16 | self.gain = gain 17 | self.peak = peak 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Classes/Track/NormalizationR128.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NormalizationR128.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 20.07.2021. 6 | // 7 | ///Represents track normalization data (R128 standard) 8 | public class NormalizationR128: Decodable { 9 | 10 | //Volume integrated value 11 | public let i: Float 12 | ///True Peak Level 13 | public let tp: Float 14 | 15 | public init(i: Float, tp: Float) { 16 | self.i = i 17 | self.tp = tp 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Classes/Track/PoetryLovelMatch.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PoetryLovelMatch.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 25.05.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Track lyrics TODO 11 | public class PoetryLoverMatch: Decodable { 12 | //Некая разметка для обучения чего-нибудь для написания романтических стихотворений. 13 | 14 | ///Begin index 15 | public let begin: Int 16 | ///End index 17 | public let end: Int 18 | ///Line index 19 | public let line: Int 20 | 21 | public init(begin: Int, end: Int, line: Int) { 22 | self.begin = begin 23 | self.end = end 24 | self.line = line 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Classes/Track/TrackBitrate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TrackBitrate.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 25.08.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | public enum TrackBitrate: UInt16 { 11 | case kbps_64 = 64 12 | case kbps_128 = 128 13 | case kbps_192 = 192 14 | case kbps_256 = 256 15 | case kbps_320 = 320 16 | } 17 | 18 | extension TrackBitrate { 19 | 20 | public var valueString: String { 21 | get {return String(self.rawValue)} 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Classes/Track/TrackCodec.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TrackCodecs.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 25.08.2021. 6 | // 7 | 8 | public enum TrackCodec: String { 9 | case mp3 10 | case aac 11 | } 12 | -------------------------------------------------------------------------------- /Classes/Track/TrackList.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TrackList.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 25.05.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Tracks list 11 | public class TrackList: Decodable { 12 | 13 | ///User UID 14 | public let uid: Int 15 | ///Data revision TODO 16 | public let revision: Int 17 | ///Short tracks info array 18 | public let tracks: [TrackShort] 19 | ///Array with only tracks' ids 20 | public var tracksIds: [String] { 21 | get { 22 | return tracks.map { (trackShort) -> String in 23 | return String(trackShort.id) 24 | } 25 | } 26 | } 27 | 28 | public init(uid: Int, revision: Int, tracks: [TrackShort]) { 29 | self.uid = uid 30 | self.revision = revision 31 | self.tracks = tracks 32 | } 33 | 34 | public func fetchTracks(completion: @escaping (_ result: Result<[Track], YMError>) -> Void) { 35 | getTracksByApi(token: accountSecret, trackIds: tracksIds, positions: false, completion: completion) 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Classes/Track/TrackShortOld.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TrackShortOld.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 04.06.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Short track version (contains in recent listen blocks) 11 | public class TrackShortOld: Decodable { 12 | 13 | ///Track UID 14 | public let trackId: TrackId? 15 | ///Recent listen date 16 | public let timestamp: String 17 | 18 | public init(trackId: TrackId?, timestamp: String) { 19 | self.trackId = trackId 20 | self.timestamp = timestamp 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Classes/Track/TracksSimilar.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TrackSimilar.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 25.05.2021. 6 | // 7 | ///Similar compositions of the defined track 8 | public class TracksSimilar: Decodable { 9 | 10 | ///The defined track 11 | public let track: Track? 12 | /// Similar to the defined track compositions 13 | public let similarTracks: [Track] 14 | 15 | public init(track: Track?, similarTracks: [Track]) { 16 | self.track = track 17 | self.similarTracks = similarTracks 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Classes/Util/CaptchaResponse.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CaptchaResponse.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 25.05.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | ///Server response type with inputting captcha 11 | public class CaptchaResponse: Decodable { 12 | 13 | ///Captcha image url 14 | public let x_captcha_url: String 15 | ///Captcha UID 16 | public let x_captcha_key: String 17 | ///Error description 18 | public let error_description: String 19 | ///Error code 20 | public let error: String 21 | 22 | public init(x_captcha_url: String, x_captcha_key: String, errDesc: String, errCode: String) { 23 | self.x_captcha_url = x_captcha_url 24 | self.x_captcha_key = x_captcha_key 25 | self.error_description = errDesc 26 | self.error = errCode 27 | } 28 | 29 | ///Download captcha image 30 | public func downloadCaptchaImg(completion: @escaping (Result) -> Void) { 31 | download(fullPath: x_captcha_url, completion: completion) 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /Classes/Util/DateUtil.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DateUtil.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 14.07.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | public class DateUtil 11 | { 12 | fileprivate init() {} 13 | 14 | ///Returns yyyy-MM-ddTHH:mm:ssZ string representation of defined date 15 | public static func isoFormat(date: Date) -> String 16 | { 17 | let formatter = ISO8601DateFormatter() 18 | formatter.formatOptions = .withInternetDateTime 19 | return formatter.string(from: date) 20 | } 21 | 22 | ///Returns yyyy-MM-ddTHH:mm:ssZ string representation of 'now' date 23 | public static func isoFormat() -> String 24 | { 25 | return isoFormat(date: Date()) 26 | } 27 | 28 | ///Returns yyyy-MM-ddTHH:mm:ssZ string representation of defined date 29 | public static func fromIsoFormat(dateStr: String) -> Date? 30 | { 31 | let formatter = ISO8601DateFormatter() 32 | formatter.formatOptions = .withInternetDateTime 33 | return formatter.date(from: dateStr) 34 | } 35 | 36 | ///Converts the time interval (hours, minutes, seconds) to formats: H:mm:ss if hours > 0 or m:ss if hours = 0 37 | public static func formattedTrackTime(_ timeInS: TimeInterval) -> String { 38 | var intVal = Int(timeInS.rounded()) 39 | var res = "" 40 | if (intVal >= 3600) { 41 | res += String(intVal / 60) + ":" 42 | } 43 | intVal = intVal % 3600 44 | 45 | if (intVal >= 60) { 46 | res += String(intVal / 60) + ":" 47 | } else { 48 | if (res.isEmpty) 49 | { 50 | res += "0:" 51 | } else { 52 | res += "00:" 53 | } 54 | } 55 | intVal = intVal % 60 56 | 57 | if (intVal >= 10) { 58 | res += String(intVal) 59 | } else { 60 | res += "0" + String(intVal) 61 | } 62 | return res 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /Classes/YMBaseObject.swift: -------------------------------------------------------------------------------- 1 | // 2 | // source.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 25.05.2021. 6 | // 7 | 8 | public class YMBaseObject { 9 | 10 | ///Object type name 11 | public var objType: String 12 | { 13 | get {return String(describing: type(of: self.self))} 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Classes/YMConstants.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Constants.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 02.03.2023. 6 | // 7 | 8 | public class YMConstants { 9 | fileprivate init() {} 10 | 11 | public static let appBundleId = "ru.yandex.music" 12 | public static let amPassportVersionName = "7.33.2(733022870)"// YM app from 03.2023 13 | public static let xYmClient = "YandexMusicAndroid/24023131"//Second part after '/' is app version code from AndroidManifest.xml 14 | //"YandexMusicAndroid/24023131"// YM app from 03.2023 15 | public static let xTokenClientId = "c0ebe342af7d48fbbbfcf2d2eedb8f9e" 16 | public static let xTokenClientSecret = "ad0a908f0aa341a182a37ecd75bc319e" 17 | public static let clientId = "23cabbbdc6cd418abb4b39c32c41195d" 18 | public static let clientSecret = "53bc75238f0c4d08a118e51fe9203300" 19 | public static let apiBasePath = "https://api.music.yandex.net/" 20 | 21 | static let userAgent = "Yandex-Music-API" 22 | static let signSecret = "p93jhgh689SBReK6ghtw62" 23 | } 24 | -------------------------------------------------------------------------------- /Classes/ios-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | $(MARKETING_VERSION) 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | 22 | 23 | -------------------------------------------------------------------------------- /Classes/osx-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | $(MARKETING_VERSION) 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | 22 | 23 | -------------------------------------------------------------------------------- /Project/YM-Tests/.gitignore: -------------------------------------------------------------------------------- 1 | TestCredentials.swift 2 | -------------------------------------------------------------------------------- /Project/YM-Tests/TestConstants.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TestConstants.swift 3 | // YM-macTests 4 | // 5 | // Created by Developer on 16.07.2021. 6 | // 7 | 8 | #if canImport(YmuzApiMac) 9 | @testable import YmuzApiMac 10 | #endif 11 | #if canImport(YmuzApi) 12 | @testable import YmuzApi 13 | #endif 14 | 15 | class TestConstants 16 | { 17 | public static let device: YMDevice = YMDevice(os: "Android", osVer: "7.0", manufacturer: "Samsung", name: "myPhone", platform: "android", model: "GT-I9500", clid: "google-play", deviceId: "b4cd324ad1ec4da18b5d216aab8e93ac", uuid: "cd3288ff24756a6075c1c6ae5de4416a") 18 | public static let apiLang: ApiLanguage = .ru 19 | } 20 | -------------------------------------------------------------------------------- /Project/YM-Tests/TestCredentials.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TestCredentials.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 01.03.2023. 6 | // 7 | 8 | import Foundation 9 | 10 | class TestCredentials { 11 | 12 | public static let xToken: String = "YOUR_XTOKEN"//after success pasword auth you can paste x_token here 13 | public static let token: String = "YM_TOKEN"//after login you can paste got token here 14 | public static let uid: Int = -1//your account uid 15 | } 16 | -------------------------------------------------------------------------------- /Project/YM-Tests/iOSInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /Project/YM-Tests/macInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /Project/YM-Tests/unit_DateUtilTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DateUtil-tests.swift 3 | // yandexMusic-macTests 4 | // 5 | // Created by Developer on 14.07.2021. 6 | // 7 | 8 | import XCTest 9 | #if canImport(YmuzApiMac) 10 | @testable import YmuzApiMac 11 | #endif 12 | #if canImport(YmuzApi) 13 | @testable import YmuzApi 14 | #endif 15 | 16 | class unit_DateUtilTests: XCTestCase { 17 | 18 | func testDateIsoFormat() 19 | { 20 | let calendar = Calendar.current 21 | var dateComponents = DateComponents() 22 | dateComponents.calendar = calendar 23 | dateComponents.year = 2020 24 | dateComponents.month = 10 25 | dateComponents.day = 10 26 | dateComponents.hour = 10 27 | dateComponents.minute = 10 28 | dateComponents.second = 50 29 | dateComponents.timeZone = TimeZone(secondsFromGMT: 0) 30 | guard let date = calendar.date(from: dateComponents) else {XCTAssert(false, "Unable to build date from components"); return} 31 | 32 | let expected = "2020-10-10T10:10:50Z" 33 | 34 | let actual = DateUtil.isoFormat(date: date) 35 | XCTAssertTrue(actual.compare(expected) == .orderedSame, "expected:" + expected + "|actual:" + actual) 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Project/YM-Tests/unit_FeedApiTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // unit_FeedApiTests.swift 3 | // YM-macTests 4 | // 5 | // Created by Developer on 20.07.2021. 6 | // 7 | 8 | import XCTest 9 | #if canImport(YmuzApiMac) 10 | @testable import YmuzApiMac 11 | #endif 12 | #if canImport(YmuzApi) 13 | @testable import YmuzApi 14 | #endif 15 | 16 | class unit_FeedApiTests: XCTestCase { 17 | 18 | var client: YMClient! 19 | var device: YMDevice {get {return TestConstants.device}} 20 | var apiLang: ApiLanguage {get {return TestConstants.apiLang}} 21 | var token: String {get {return TestCredentials.token}} 22 | var xToken: String {get {return TestCredentials.xToken}} 23 | var uid: Int {get {return TestCredentials.uid}} 24 | 25 | override func setUp() { 26 | client = YMClient.initialize(device: device, lang: apiLang, uid: uid, token: token, xToken: xToken) 27 | } 28 | 29 | override func tearDown() { 30 | client = nil 31 | } 32 | 33 | func testFeedResponse() { 34 | let exp = self.expectation(description: "Request time-out expectation") 35 | client.getFeed { result in 36 | do { 37 | let feed = try result.get() 38 | XCTAssertNotNil(feed.generatedPlaylists, "Feed generated playlists is null") 39 | XCTAssert(feed.generatedPlaylists.count > 0, "Feed generated playlists is empty") 40 | } catch { 41 | print(error) 42 | XCTAssert(false, "Empty feed object: " + error.localizedDescription) 43 | } 44 | exp.fulfill() 45 | } 46 | waitForExpectations(timeout: 5) { error in 47 | if let g_error = error 48 | { 49 | print(g_error) 50 | XCTAssert(false, "Timeout error: " + g_error.localizedDescription) 51 | } 52 | } 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /Project/YM-Tests/unit_RecentListenApiTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // unit_RecentListenApiTests.swift 3 | // YM-API 4 | // 5 | // Created by Developer on 14.10.2021. 6 | // 7 | 8 | import XCTest 9 | #if canImport(YmuzApiMac) 10 | @testable import YmuzApiMac 11 | #endif 12 | #if canImport(YmuzApi) 13 | @testable import YmuzApi 14 | #endif 15 | 16 | class unit_RecentListenApiTests: XCTestCase { 17 | 18 | var client: YMClient! 19 | var device: YMDevice {get {return TestConstants.device}} 20 | var apiLang: ApiLanguage {get {return TestConstants.apiLang}} 21 | var token: String {get {return TestCredentials.token}} 22 | var xToken: String {get {return TestCredentials.xToken}} 23 | var uid: Int {get {return TestCredentials.uid}} 24 | 25 | override func setUp() { 26 | client = YMClient.initialize(device: device, lang: apiLang, uid: uid, token: token, xToken: xToken) 27 | } 28 | 29 | override func tearDown() { 30 | client = nil 31 | } 32 | 33 | func testRecentListenHistoryResponse() { 34 | let exp = self.expectation(description: "Request time-out expectation") 35 | client.getRecentListenHistory(tracksCount: 2, contextTypes: [.album, .artist]) { result in 36 | do { 37 | let listenHistory = try result.get() 38 | XCTAssertTrue(listenHistory.contexts.count > 0, "Listen history empty array") 39 | } catch { 40 | print(error) 41 | XCTAssert(false, "Empty Listen history object: " + error.localizedDescription) 42 | } 43 | exp.fulfill() 44 | } 45 | waitForExpectations(timeout: 5) { error in 46 | if let g_error = error 47 | { 48 | print(g_error) 49 | XCTAssert(false, "Timeout error: " + g_error.localizedDescription) 50 | } 51 | } 52 | } 53 | 54 | } 55 | -------------------------------------------------------------------------------- /Project/ios/Images/appIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Images/appIcon.png -------------------------------------------------------------------------------- /Project/ios/Rave/Application/Constants.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | class Constants 4 | { 5 | public static let APP_STORE_ID = "1234567890" 6 | public static let PSEUDO_BUNDLE_ID = Bundle.main.bundleIdentifier ?? "Unknown identifier" 7 | public static let PSEUDO_BUNDLE_NAME = Bundle.main.infoDictionary?["CFBundleName"] as? String ?? "Unknown name" 8 | public static let PSEUDO_BUNDLE_VERSION = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "0.0.0" 9 | public static let PSEUDO_BUNDLE_BUILD_NUMBER = Bundle.main.infoDictionary?["CFBundleVersion"] as? String ?? "0" 10 | } 11 | -------------------------------------------------------------------------------- /Project/ios/Rave/Application/Extension/NSObject.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | extension NSObject { 4 | class var className: String { 5 | return String(describing: self.self) 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /Project/ios/Rave/Application/Helper/Math.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | extension Double 4 | { 5 | func rounded(signes_after: Int) -> Double 6 | { 7 | let mul = pow(10, Double(signes_after)) 8 | let rounded = (self * mul).rounded() 9 | return rounded / mul 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Project/ios/Rave/Application/Helper/PlistWrapper.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | class PlistWrapper 4 | { 5 | class func parsePropertyList(filename plist_name: String) -> T? 6 | { 7 | let type = "plist" 8 | do 9 | { 10 | let url = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent(plist_name).appendingPathExtension(type) 11 | let plistData: Data = try Data(contentsOf: url) 12 | let decoder = PropertyListDecoder() 13 | let decoded = try decoder.decode(T.self, from: plistData) 14 | return decoded 15 | } 16 | catch 17 | { 18 | print("Error reading plist: \(error)") 19 | return nil 20 | } 21 | } 22 | 23 | class func savePropertyList(_ value: T, filename plist_name: String) -> Bool 24 | { 25 | let type = "plist" 26 | do 27 | { 28 | let encoder = PropertyListEncoder() 29 | let plistData: Data = try encoder.encode(value) 30 | let url = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true).appendingPathComponent(plist_name).appendingPathExtension(type) 31 | try plistData.write(to: url, options: .atomicWrite) 32 | return true 33 | } 34 | catch 35 | { 36 | print("Error saving plist: \(error)") 37 | return false 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "icon-40.png", 5 | "idiom" : "iphone", 6 | "scale" : "2x", 7 | "size" : "20x20" 8 | }, 9 | { 10 | "filename" : "icon-60.png", 11 | "idiom" : "iphone", 12 | "scale" : "3x", 13 | "size" : "20x20" 14 | }, 15 | { 16 | "filename" : "icon-58.png", 17 | "idiom" : "iphone", 18 | "scale" : "2x", 19 | "size" : "29x29" 20 | }, 21 | { 22 | "filename" : "icon-87.png", 23 | "idiom" : "iphone", 24 | "scale" : "3x", 25 | "size" : "29x29" 26 | }, 27 | { 28 | "filename" : "icon-80.png", 29 | "idiom" : "iphone", 30 | "scale" : "2x", 31 | "size" : "40x40" 32 | }, 33 | { 34 | "filename" : "icon-121.png", 35 | "idiom" : "iphone", 36 | "scale" : "3x", 37 | "size" : "40x40" 38 | }, 39 | { 40 | "filename" : "icon-120.png", 41 | "idiom" : "iphone", 42 | "scale" : "2x", 43 | "size" : "60x60" 44 | }, 45 | { 46 | "filename" : "icon-180.png", 47 | "idiom" : "iphone", 48 | "scale" : "3x", 49 | "size" : "60x60" 50 | }, 51 | { 52 | "filename" : "icon-1024.png", 53 | "idiom" : "ios-marketing", 54 | "scale" : "1x", 55 | "size" : "1024x1024" 56 | } 57 | ], 58 | "info" : { 59 | "author" : "xcode", 60 | "version" : 1 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/AppIcon.appiconset/icon-1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/AppIcon.appiconset/icon-1024.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/AppIcon.appiconset/icon-120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/AppIcon.appiconset/icon-120.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/AppIcon.appiconset/icon-121.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/AppIcon.appiconset/icon-121.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/AppIcon.appiconset/icon-180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/AppIcon.appiconset/icon-180.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/AppIcon.appiconset/icon-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/AppIcon.appiconset/icon-40.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/AppIcon.appiconset/icon-58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/AppIcon.appiconset/icon-58.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/AppIcon.appiconset/icon-60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/AppIcon.appiconset/icon-60.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/AppIcon.appiconset/icon-80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/AppIcon.appiconset/icon-80.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/AppIcon.appiconset/icon-87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/AppIcon.appiconset/icon-87.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/AppIconRounded.imageset/AppIconRounded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/AppIconRounded.imageset/AppIconRounded.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/AppIconRounded.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "AppIconRounded.png", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Bar Icons/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Bar Icons/bar_ic_logout.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "image@1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "image@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "image@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Bar Icons/bar_ic_logout.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Bar Icons/bar_ic_logout.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Bar Icons/bar_ic_logout.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Bar Icons/bar_ic_logout.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Bar Icons/bar_ic_logout.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Bar Icons/bar_ic_logout.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Bar Icons/bar_ic_settings.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "image@1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "image@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "image@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Bar Icons/bar_ic_settings.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Bar Icons/bar_ic_settings.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Bar Icons/bar_ic_settings.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Bar Icons/bar_ic_settings.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Bar Icons/bar_ic_settings.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Bar Icons/bar_ic_settings.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_fav_not_selected.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "image@1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "image@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "image@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_fav_not_selected.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_fav_not_selected.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_fav_not_selected.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_fav_not_selected.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_fav_not_selected.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_fav_not_selected.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_fav_selected.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "image@1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "image@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "image@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_fav_selected.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_fav_selected.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_fav_selected.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_fav_selected.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_fav_selected.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_fav_selected.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_main.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "image@1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "image@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "image@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_main.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_main.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_main.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_main.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_main.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_main.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_radio.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "image@1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "image@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "image@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_radio.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_radio.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_radio.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_radio.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_radio.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_radio.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_search.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "image@1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "image@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "image@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_search.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_search.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_search.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_search.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_search.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Bar Icons/tab_ic_search.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/System Icons/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/System Icons/sys_ic_chevron_down.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "image@1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "image@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "image@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/System Icons/sys_ic_chevron_down.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/System Icons/sys_ic_chevron_down.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/System Icons/sys_ic_chevron_down.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/System Icons/sys_ic_chevron_down.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/System Icons/sys_ic_chevron_down.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/System Icons/sys_ic_chevron_down.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/System Icons/sys_ic_share.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "image@1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "image@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "image@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/System Icons/sys_ic_share.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/System Icons/sys_ic_share.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/System Icons/sys_ic_share.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/System Icons/sys_ic_share.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/System Icons/sys_ic_share.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/System Icons/sys_ic_share.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/System Icons/sys_ic_xmark.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "sys_ic_xmark.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "sys_ic_xmark@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "sys_ic_xmark@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/System Icons/sys_ic_xmark.imageset/sys_ic_xmark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/System Icons/sys_ic_xmark.imageset/sys_ic_xmark.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/System Icons/sys_ic_xmark.imageset/sys_ic_xmark@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/System Icons/sys_ic_xmark.imageset/sys_ic_xmark@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/System Icons/sys_ic_xmark.imageset/sys_ic_xmark@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/System Icons/sys_ic_xmark.imageset/sys_ic_xmark@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Templates/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Templates/ic_track_template.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "image@1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "image@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "image@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Templates/ic_track_template.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Templates/ic_track_template.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Templates/ic_track_template.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Templates/ic_track_template.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Templates/ic_track_template.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Templates/ic_track_template.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Templates/playlist_liked_template.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "image@1x.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "image@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x", 16 | "filename" : "image@3x.png" 17 | } 18 | ], 19 | "author" : "Iconizer", 20 | "version" : "2020.11.0" 21 | } -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Templates/playlist_liked_template.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Templates/playlist_liked_template.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Templates/playlist_liked_template.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Templates/playlist_liked_template.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Templates/playlist_liked_template.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Templates/playlist_liked_template.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Templates/playlist_template.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "image@1x.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "image@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x", 16 | "filename" : "image@3x.png" 17 | } 18 | ], 19 | "author" : "Iconizer", 20 | "version" : "2020.11.0" 21 | } -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Templates/playlist_template.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Templates/playlist_template.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Templates/playlist_template.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Templates/playlist_template.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Templates/playlist_template.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Templates/playlist_template.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Templates/profile_template.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "image@1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "image@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "image@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Templates/profile_template.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Templates/profile_template.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Templates/profile_template.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Templates/profile_template.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Templates/profile_template.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Templates/profile_template.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Templates/radio_template.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "image@1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "image@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "image@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Templates/radio_template.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Templates/radio_template.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Templates/radio_template.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Templates/radio_template.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/Templates/radio_template.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/Templates/radio_template.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_chevron_down.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "image@1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "image@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "image@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_chevron_down.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_chevron_down.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_chevron_down.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_chevron_down.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_chevron_down.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_chevron_down.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_download.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "image@1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "image@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "image@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_download.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_download.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_download.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_download.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_download.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_download.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_like.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "image@1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "image@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "image@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_like.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_like.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_like.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_like.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_like.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_like.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_liked.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "image@1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "image@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "image@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_liked.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_liked.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_liked.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_liked.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_liked.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_liked.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_line.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "image@1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "image@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "image@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_line.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_line.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_line.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_line.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_line.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_line.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_list.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "image@1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "image@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "image@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_list.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_list.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_list.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_list.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_list.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_list.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_menu.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "image@1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "image@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "image@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_menu.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_menu.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_menu.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_menu.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_menu.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_menu.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_menu2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "image@1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "image@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "image@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_menu2.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_menu2.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_menu2.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_menu2.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_menu2.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_menu2.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_next.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "image@1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "image@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "image@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_next.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_next.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_next.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_next.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_next.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_next.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_pause.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "image@1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "image@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "image@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_pause.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_pause.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_pause.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_pause.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_pause.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_pause.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_play.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "image@1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "image@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "image@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_play.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_play.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_play.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_play.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_play.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_play.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_previous.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "image@1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "image@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "image@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_previous.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_previous.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_previous.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_previous.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_previous.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_previous.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_queue_add.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "image@1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "image@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "image@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_queue_add.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_queue_add.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_queue_add.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_queue_add.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_queue_add.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_queue_add.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_repeat_off.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "image@1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "image@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "image@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_repeat_off.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_repeat_off.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_repeat_off.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_repeat_off.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_repeat_off.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_repeat_off.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_repeat_on.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "image@1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "image@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "image@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_repeat_on.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_repeat_on.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_repeat_on.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_repeat_on.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_repeat_on.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_repeat_on.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_repeat_on_single.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "image@1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "image@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "image@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_repeat_on_single.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_repeat_on_single.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_repeat_on_single.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_repeat_on_single.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_repeat_on_single.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_repeat_on_single.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_search.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "image@1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "image@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "image@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_search.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_search.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_search.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_search.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_search.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_search.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_shuffle_off.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "image@1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "image@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "image@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_shuffle_off.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_shuffle_off.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_shuffle_off.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_shuffle_off.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_shuffle_off.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_shuffle_off.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_shuffle_on.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "image@1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "image@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "image@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_shuffle_on.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_shuffle_on.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_shuffle_on.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_shuffle_on.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_shuffle_on.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_shuffle_on.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_stop.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "image@1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "image@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "image@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_stop.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_stop.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_stop.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_stop.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_stop.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_stop.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_stopped.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "image@1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "image@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "image@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | }, 23 | "properties" : { 24 | "template-rendering-intent" : "template" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_stopped.imageset/image@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_stopped.imageset/image@1x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_stopped.imageset/image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_stopped.imageset/image@2x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Assets.xcassets/ic_stopped.imageset/image@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Rave/Assets.xcassets/ic_stopped.imageset/image@3x.png -------------------------------------------------------------------------------- /Project/ios/Rave/Delegate/PlayerQueueDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // QueuePlayerDelegate.swift 3 | // Rave 4 | // 5 | // Created by Developer on 23.08.2021. 6 | // 7 | 8 | import Foundation 9 | import YmuzApi 10 | 11 | protocol PlayerQueueDelegate { 12 | func radioStreamTracksUpdated(_ allTracks: [Track]) 13 | func trackChanged(_ track: Track, queueIndex: Int) 14 | func playStateChanged(playing: Bool) 15 | func playbackPositionChanged(_ position: TimeInterval) 16 | } 17 | -------------------------------------------------------------------------------- /Project/ios/Rave/Delegate/SelectorDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SelectorDelegate.swift 3 | // Rave 4 | // 5 | // Created by Developer on 10.08.2021. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol SelectorDelegate { 11 | func select(index: Int, object: Any?) 12 | } 13 | -------------------------------------------------------------------------------- /Project/ios/Rave/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | $(MARKETING_VERSION) 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | LSRequiresIPhoneOS 22 | 23 | UIApplicationSupportsIndirectInputEvents 24 | 25 | UIBackgroundModes 26 | 27 | audio 28 | 29 | UILaunchStoryboardName 30 | LaunchScreen 31 | UIMainStoryboardFile 32 | Main 33 | UIRequiredDeviceCapabilities 34 | 35 | armv7 36 | 37 | UISupportedInterfaceOrientations 38 | 39 | UIInterfaceOrientationPortrait 40 | 41 | UISupportedInterfaceOrientations~ipad 42 | 43 | UIInterfaceOrientationPortrait 44 | UIInterfaceOrientationPortraitUpsideDown 45 | UIInterfaceOrientationLandscapeLeft 46 | UIInterfaceOrientationLandscapeRight 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /Project/ios/Rave/Model/BitBool8.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BitBool8.swift 3 | // 1VPN 4 | // 5 | // Created by Admin on 15.05.2020. 6 | // Copyright © 2020 Zeit. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | class BitBool8: Codable 12 | { 13 | fileprivate var _bits: UInt8 = 0 14 | 15 | func setFlagPropertyValue(for index: Int, value: Bool) 16 | { 17 | var bit: UInt8 = 1 18 | if (index > 0) 19 | { 20 | for _ in 1 ... index 21 | { 22 | bit *= 2 23 | } 24 | } 25 | if (value == true) 26 | { 27 | _bits |= bit 28 | } 29 | else 30 | { 31 | bit = ~bit 32 | _bits &= bit 33 | } 34 | } 35 | 36 | func getFlagPropertyValue(for index: Int) -> Bool 37 | { 38 | let val = _bits >> index 39 | return val % 2 == 1 40 | } 41 | 42 | init(initVal: UInt8) 43 | { 44 | _bits = initVal 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /Project/ios/Rave/Podfile: -------------------------------------------------------------------------------- 1 | platform :ios,'10.0' 2 | 3 | target 'Rave' do 4 | use_frameworks! 5 | pod 'YM-API' 6 | end 7 | -------------------------------------------------------------------------------- /Project/ios/Rave/Rave.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Project/ios/Rave/Rave.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Project/ios/Rave/Rave.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Rave.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 2 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /Project/ios/Rave/Ui/Content/Cell/FavouriteIntroTVCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FavouriteIntroTVCell.swift 3 | // Rave 4 | // 5 | // Created by Developer on 17.08.2021. 6 | // 7 | 8 | import UIKit 9 | 10 | class FavouriteIntroTVCell: UITableViewCell { 11 | 12 | @IBOutlet weak var lbl_playlistTitle: UILabel! 13 | @IBOutlet weak var lbl_playlistTracksCount: UILabel! 14 | @IBOutlet weak var imgView_playlistCover: UIImageView! 15 | 16 | override func awakeFromNib() { 17 | super.awakeFromNib() 18 | self.selectionStyle = .none 19 | imgView_playlistCover.layer.cornerRadius = 16 20 | } 21 | 22 | func initializeCell(tracksCount: Int) { 23 | lbl_playlistTitle.text = AppService.localizedString(.playlist_favourite_title) 24 | lbl_playlistTracksCount.text = AppService.localizedString(.playlist_tracks_count) + " - " + String(tracksCount) 25 | imgView_playlistCover.image = UIImage(named: "playlist_liked_template") 26 | } 27 | 28 | override func setSelected(_ selected: Bool, animated: Bool) { 29 | super.setSelected(selected, animated: animated) 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /Project/ios/Rave/Ui/Content/Cell/LoadingTVCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LoadingTVCell.swift 3 | // Rave 4 | // 5 | // Created by Developer on 17.08.2021. 6 | // 7 | 8 | import UIKit 9 | 10 | class LoadingTVCell: UITableViewCell { 11 | 12 | @IBOutlet weak var loadingIndicator: UIActivityIndicatorView! 13 | 14 | override func awakeFromNib() { 15 | super.awakeFromNib() 16 | self.selectionStyle = .none 17 | if #available(iOS 13.0, *) { 18 | loadingIndicator.style = .large 19 | } 20 | } 21 | 22 | override func setSelected(_ selected: Bool, animated: Bool) { 23 | super.setSelected(selected, animated: animated) 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Project/ios/Rave/Ui/Content/Cell/PlaylistIntroTVCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PlaylistIntroTVCell.swift 3 | // Rave 4 | // 5 | // Created by Developer on 17.08.2021. 6 | // 7 | 8 | import UIKit 9 | 10 | class PlaylistIntroTVCell: UITableViewCell { 11 | 12 | @IBOutlet weak var imgView_playlistLogo: UIImageView! 13 | @IBOutlet weak var lbl_title: UILabel! 14 | @IBOutlet weak var lbl_tracksCount: UILabel! 15 | 16 | fileprivate var _selector: (() -> Void)? 17 | 18 | 19 | override func awakeFromNib() { 20 | super.awakeFromNib() 21 | selectionStyle = .none 22 | imgView_playlistLogo.layer.cornerRadius = 16 23 | } 24 | 25 | func initalizeCell(title: String, count: Int, img: UIImage?) { 26 | lbl_title.text = title 27 | lbl_tracksCount.text = AppService.localizedString(.playlist_tracks_count) + " - " + String(count) 28 | if let g_img = img { 29 | imgView_playlistLogo.image = g_img 30 | } else { 31 | imgView_playlistLogo.image = UIImage(named: "playlist_template") 32 | } 33 | } 34 | 35 | override func setSelected(_ selected: Bool, animated: Bool) { 36 | super.setSelected(selected, animated: animated) 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Project/ios/Rave/Ui/Content/ru.lproj/Content.strings: -------------------------------------------------------------------------------- 1 | 2 | /* Class = "UILabel"; text = "3:05"; ObjectID = "7P6-uW-UJ3"; */ 3 | "7P6-uW-UJ3.text" = "3:05"; 4 | 5 | /* Class = "UILabel"; text = "0:10"; ObjectID = "Ao2-Kg-LhN"; */ 6 | "Ao2-Kg-LhN.text" = "0:10"; 7 | 8 | /* Class = "UILabel"; text = "TRACK_ARTISTS"; ObjectID = "MMn-p5-dhe"; */ 9 | "MMn-p5-dhe.text" = "TRACK_ARTISTS"; 10 | 11 | /* Class = "UILabel"; text = "TRACK_TITLE"; ObjectID = "ahQ-bj-KGn"; */ 12 | "ahQ-bj-KGn.text" = "TRACK_TITLE"; 13 | -------------------------------------------------------------------------------- /Project/ios/Rave/Ui/Landing/Cell/PersonalPlaylistCVCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PersonalPlaylistCVC.swift 3 | // Rave 4 | // 5 | // Created by Developer on 10.08.2021. 6 | // 7 | 8 | import UIKit 9 | 10 | class PersonalPlaylistCVCell: UICollectionViewCell { 11 | 12 | @IBOutlet weak var innerView: UIView! 13 | @IBOutlet weak var lbl_centerTitle: UILabel! 14 | @IBOutlet weak var lbl_bottomTitle: UILabel! 15 | @IBOutlet weak var lbl_updateInfo: UILabel! 16 | 17 | override func awakeFromNib() { 18 | super.awakeFromNib() 19 | innerView.layer.cornerRadius = 8 20 | } 21 | 22 | func initializeCell(innerViewBgColor: UIColor, title: String, updateInfo: String) 23 | { 24 | innerView.backgroundColor = innerViewBgColor 25 | lbl_centerTitle.text = title 26 | lbl_bottomTitle.text = title 27 | lbl_updateInfo.text = updateInfo 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Project/ios/Rave/Ui/Radio/Cell/RadioCVCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RadioCVCell.swift 3 | // Rave 4 | // 5 | // Created by Developer on 27.08.2021. 6 | // 7 | 8 | import UIKit 9 | 10 | class RadioCVCell: UICollectionViewCell { 11 | 12 | @IBOutlet weak var innerView: UIView! 13 | @IBOutlet weak var imgView_stationIcon: UIImageView! 14 | @IBOutlet weak var lbl_title: UILabel! 15 | 16 | override func awakeFromNib() { 17 | super.awakeFromNib() 18 | innerView.layer.cornerRadius = innerView.frame.width / 2 19 | innerView.backgroundColor = UIColor.purple 20 | } 21 | 22 | func initializeCell(stationImg: UIImage?, title: String) 23 | { 24 | if let g_img = stationImg { 25 | imgView_stationIcon.image = g_img 26 | } else { 27 | imgView_stationIcon.image = UIImage(named: "radio_template") 28 | } 29 | lbl_title.text = title 30 | } 31 | 32 | func initializeCell(innerViewBgColor: UIColor, stationImg: UIImage?, title: String) 33 | { 34 | innerView.backgroundColor = innerViewBgColor 35 | initializeCell(stationImg: stationImg, title: title) 36 | } 37 | 38 | override var isSelected: Bool { 39 | didSet { 40 | innerView.backgroundColor = isSelected ? UIColor.blue : UIColor.purple 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /Project/ios/Screenshots/favourite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Screenshots/favourite.png -------------------------------------------------------------------------------- /Project/ios/Screenshots/feed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Screenshots/feed.png -------------------------------------------------------------------------------- /Project/ios/Screenshots/nowPlaying.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Screenshots/nowPlaying.png -------------------------------------------------------------------------------- /Project/ios/Screenshots/nowPlayingQueue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Screenshots/nowPlayingQueue.png -------------------------------------------------------------------------------- /Project/ios/Screenshots/playlistOfDay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Screenshots/playlistOfDay.png -------------------------------------------------------------------------------- /Project/ios/Screenshots/searchResults.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Screenshots/searchResults.png -------------------------------------------------------------------------------- /Project/ios/Screenshots/searchSuggestions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p0rterB/YM-API/b46a367f7c9a02ed36fee20ad7fe15abb98011b9/Project/ios/Screenshots/searchSuggestions.png -------------------------------------------------------------------------------- /YM-API.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |spec| 2 | spec.name = "YM-API" 3 | spec.version = "0.7.0" 4 | spec.summary = "Unofficial Yandex Music API" 5 | spec.homepage = "https://github.com/p0rterB/YM-API" 6 | spec.license = { :type => "GNU LGPL v3.0", :file => "LICENSE" } 7 | spec.author = { "Chris" => "chris.nik.70@protonmail.com" } 8 | spec.ios.deployment_target = "10.0" 9 | spec.osx.deployment_target = "10.14" 10 | spec.swift_version = "5.0" 11 | spec.source = { :git => "https://github.com/p0rterB/YM-API.git", :tag => "#{spec.version}" } 12 | spec.source_files = "Classes/*.swift", "Classes/**/*.swift" 13 | spec.exclude_files = "Classes/Exclude", "Classes/Exclude/*.*" 14 | spec.framework = "Foundation" 15 | end 16 | -------------------------------------------------------------------------------- /YM-API.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /YM-API.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /YM-API.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /YM-API.xcodeproj/project.xcworkspace/xcuserdata/admin.xcuserdatad/IDEFindNavigatorScopes.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /YM-API.xcodeproj/project.xcworkspace/xcuserdata/admin.xcuserdatad/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildLocationStyle 6 | UseAppPreferences 7 | CustomBuildLocationType 8 | RelativeToDerivedData 9 | DerivedDataLocationStyle 10 | Default 11 | IssueFilterStyle 12 | ShowActiveSchemeOnly 13 | LiveSourceIssuesEnabled 14 | 15 | ShowSharedSchemesAutomaticallyEnabled 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /YM-API.xcodeproj/xcuserdata/admin.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | Rave.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 2 11 | 12 | YM-iOS.xcscheme_^#shared#^_ 13 | 14 | orderHint 15 | 0 16 | 17 | YM-mac.xcscheme_^#shared#^_ 18 | 19 | orderHint 20 | 1 21 | 22 | rave-cli.xcscheme_^#shared#^_ 23 | 24 | orderHint 25 | 3 26 | 27 | 28 | SuppressBuildableAutocreation 29 | 30 | 84C5BBD2265D16BD006E41AE 31 | 32 | primary 33 | 34 | 35 | 84C5BBDB265D16BD006E41AE 36 | 37 | primary 38 | 39 | 40 | 84C5BBF3265D1775006E41AE 41 | 42 | primary 43 | 44 | 45 | 84C5BBFB265D1775006E41AE 46 | 47 | primary 48 | 49 | 50 | 84F6AC5926A0120B0051FD92 51 | 52 | primary 53 | 54 | 55 | 56 | 57 | 58 | --------------------------------------------------------------------------------