├── .gitignore ├── NoMoreiTunes ├── Assets.xcassets │ ├── Contents.json │ └── AppIcon.appiconset │ │ └── Contents.json ├── NoMoreiTunes.entitlements ├── ViewController.swift ├── AppDelegate.swift ├── Info.plist └── Base.lproj │ └── Main.storyboard ├── NoMoreiTunes.safariextension ├── Icon-100.png ├── Icon-32.png ├── Icon-48.png ├── Settings.plist ├── global.html ├── Info.plist ├── NoMoreiTunes.css └── startScript.js ├── NoMoreiTunes.xcodeproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── xcuserdata │ └── pichfl.xcuserdatad │ │ └── xcschemes │ │ └── xcschememanagement.plist └── project.pbxproj ├── LICENSE └── README.markdown /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store -------------------------------------------------------------------------------- /NoMoreiTunes/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /NoMoreiTunes.safariextension/Icon-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pichfl/NoMoreiTunes/HEAD/NoMoreiTunes.safariextension/Icon-100.png -------------------------------------------------------------------------------- /NoMoreiTunes.safariextension/Icon-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pichfl/NoMoreiTunes/HEAD/NoMoreiTunes.safariextension/Icon-32.png -------------------------------------------------------------------------------- /NoMoreiTunes.safariextension/Icon-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pichfl/NoMoreiTunes/HEAD/NoMoreiTunes.safariextension/Icon-48.png -------------------------------------------------------------------------------- /NoMoreiTunes.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /NoMoreiTunes.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /NoMoreiTunes/NoMoreiTunes.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.files.user-selected.read-only 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /NoMoreiTunes.xcodeproj/xcuserdata/pichfl.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | NoMoreiTunes.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /NoMoreiTunes/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // NoMoreiTunes 4 | // 5 | // Created by Florian Pichler on 18.08.18. 6 | // Copyright © 2018 YLKGD. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | class ViewController: NSViewController { 12 | 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | 16 | // Do any additional setup after loading the view. 17 | } 18 | 19 | override var representedObject: Any? { 20 | didSet { 21 | // Update the view, if already loaded. 22 | } 23 | } 24 | 25 | 26 | } 27 | 28 | -------------------------------------------------------------------------------- /NoMoreiTunes/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // NoMoreiTunes 4 | // 5 | // Created by Florian Pichler on 18.08.18. 6 | // Copyright © 2018 YLKGD. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | @NSApplicationMain 12 | class AppDelegate: NSObject, NSApplicationDelegate { 13 | 14 | 15 | 16 | func applicationDidFinishLaunching(_ aNotification: Notification) { 17 | // Insert code here to initialize your application 18 | } 19 | 20 | func applicationWillTerminate(_ aNotification: Notification) { 21 | // Insert code here to tear down your application 22 | } 23 | 24 | 25 | } 26 | 27 | -------------------------------------------------------------------------------- /NoMoreiTunes.safariextension/Settings.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | DefaultValue 7 | 8 | Key 9 | closeOnLaunch 10 | Title 11 | Close window when using the launch button (if possible) 12 | Type 13 | CheckBox 14 | 15 | 16 | DefaultValue 17 | 18 | Key 19 | hideToolbar 20 | Title 21 | Hide toolbar after 5 seconds 22 | Type 23 | CheckBox 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /NoMoreiTunes.safariextension/global.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2010-2018 Florian Pichler 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /NoMoreiTunes/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleVersion 22 | 1 23 | LSMinimumSystemVersion 24 | $(MACOSX_DEPLOYMENT_TARGET) 25 | NSHumanReadableCopyright 26 | Copyright © 2018 YLKGD. All rights reserved. 27 | NSMainStoryboardFile 28 | Main 29 | NSPrincipalClass 30 | NSApplication 31 | 32 | 33 | -------------------------------------------------------------------------------- /NoMoreiTunes/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "mac", 5 | "size" : "16x16", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "mac", 10 | "size" : "16x16", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "mac", 15 | "size" : "32x32", 16 | "scale" : "1x" 17 | }, 18 | { 19 | "idiom" : "mac", 20 | "size" : "32x32", 21 | "scale" : "2x" 22 | }, 23 | { 24 | "idiom" : "mac", 25 | "size" : "128x128", 26 | "scale" : "1x" 27 | }, 28 | { 29 | "idiom" : "mac", 30 | "size" : "128x128", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "idiom" : "mac", 35 | "size" : "256x256", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "mac", 40 | "size" : "256x256", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "mac", 45 | "size" : "512x512", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "mac", 50 | "size" : "512x512", 51 | "scale" : "2x" 52 | } 53 | ], 54 | "info" : { 55 | "version" : 1, 56 | "author" : "xcode" 57 | } 58 | } -------------------------------------------------------------------------------- /NoMoreiTunes.safariextension/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Author 6 | Florian Pichler 7 | Builder Version 8 | 8536.26.14 9 | CFBundleDisplayName 10 | NoMoreiTunes 11 | CFBundleIdentifier 12 | de.einserver.nomoreitunes 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleShortVersionString 16 | 2.3.1 17 | CFBundleVersion 18 | 231 19 | Chrome 20 | 21 | Global Page 22 | global.html 23 | 24 | Content 25 | 26 | Blacklist 27 | 28 | http://buy.itunes.apple.com/* 29 | https://buy.itunes.apple.com/* 30 | 31 | Scripts 32 | 33 | Start 34 | 35 | startScript.js 36 | 37 | 38 | Stylesheets 39 | 40 | NoMoreiTunes.css 41 | 42 | Whitelist 43 | 44 | http://itunes.apple.com/* 45 | http://phobos.apple.com/* 46 | http://*.itunes.apple.com/* 47 | http://*.phobos.apple.com/* 48 | https://itunes.apple.com/* 49 | https://phobos.apple.com/* 50 | https://*.itunes.apple.com/* 51 | https://*.phobos.apple.com/* 52 | 53 | 54 | Description 55 | Prevents iTunes Preview and App Store pages from launching iTunes. 56 | ExtensionInfoDictionaryVersion 57 | 1.0 58 | Permissions 59 | 60 | Website Access 61 | 62 | Allowed Domains 63 | 64 | itunes.apple.com 65 | phobos.apple.com 66 | *.itunes.apple.com 67 | *.phobos.apple.com 68 | 69 | Include Secure Pages 70 | 71 | Level 72 | Some 73 | 74 | 75 | Update Manifest URL 76 | http://nomoreitunes.einserver.de/manifest.plist 77 | Website 78 | http://nomoreitunes.einserver.de/ 79 | 80 | 81 | -------------------------------------------------------------------------------- /README.markdown: -------------------------------------------------------------------------------- 1 | # NoMoreiTunes 2 | 3 | **Safari Extensions require a signed macOS app now, which makes it too much effort to continue this extension. It was nice while it lasted. Thanks for droping by.** 4 | 5 | 6 | Prevented iTunes Preview and App Store pages in Safari from launching iTunes from 2010 to 2018. 7 | 8 | ## Changelog 9 | 10 | - 2.3.1 Added support for https-based urls 11 | - 2.3 Removed dependency on MooTools, fixed issue #1 & issue #2 on the way 12 | - 2.2.1 New preference: You can now tell NoMoreiTunes to hide the toolbar after 5 seconds 13 | - 2.2 Started rewrite, removing dependencies on MooTools 14 | - 2.1.5 Fixed mistake in Dutch language file, moved project to GitHub 15 | - 2.1.1 Updated design again. The bar is now an overlay and doesn’t push down the page anymore. If you enable the feature in the Extension Settings, NoMoreiTunes will try to close the window for you when you click on the launch button. This will not work for all links as Safari is very restrictive on this behavior and is turned off by default. 16 | - 2.0 New Design, improved AppStore support: Now with a launch button! 17 | - 1.8 Limited support for links from the AppStore (no launch button in the black bar for now) 18 | - 1.71 Fixed a bug introduced in 1.7 which made the button for launching iTunes fail 19 | - 1.7 Bugfixes and more translations 20 | - 1.6 Translations 21 | - 1.5.1 Small glimpse of the next version: A new action bar informs you that the extension did something to the current page and gives you another simple option to launch iTunes 22 | - 1.1.2 Fixes Certificate Problem 23 | - 1.1 URLs responsible for creating new accounts on iTunes will now launch iTunes and no longer be blocked (I think there is some kind of use in launching iTunes in this special case) 24 | - 1.0 Code cleaned up (only one script now), improved display for TV-Shows 25 | - 0.5 Autoupdate fixed, additional URLs added 26 | - 0.4 Icon added 27 | - 0.3 Better video preview (more similar to iTunes Preview pages), corrected access URLs 28 | - 0.2 Fixed scripts, added video preview 29 | - 0.1 Initial release 30 | 31 | ## Thanks 32 | 33 | - [Wolfgang Klatt](http://twitter.com/woIIe) for the initial idea. 34 | - [Pepi](http://maclemon.at/) for an excellent bug report which lead to v1.1 35 | - [Alfred Brose](mailto:alfred.brose@bcmsolutions.de) for Russian 36 | - [Giancarlo Nicolof](http://web.me.com/giancarlon/) for Italian 37 | - [Amine Benboubker](http://aminebenboubker.com/) for French 38 | - Christoph Theel for Spanish & Portuguese 39 | - [Oscar Palmér](http://oscarismy.name/) for Swedish 40 | - Łukasz Handke for Polish 41 | - Zhusee Zhang for Chinese 42 | - [Daniel Göstenmeier](http://goestenmeier.com/) for Dutch 43 | 44 | _Your name here?_ Help me find bugs or translate NoMoreiTunes, contact me for details. 45 | 46 | ## License 47 | 48 | NoMoreiTunes is licensed under the MIT License. See [LICENSE](./LICENSE) for details. 49 | -------------------------------------------------------------------------------- /NoMoreiTunes.safariextension/NoMoreiTunes.css: -------------------------------------------------------------------------------- 1 | .hide .subtitle+center,.hide .footer, .hideloading .title, .hideloading .subtitle{ 2 | display: none;} 3 | 4 | body.hide{ 5 | text-align: left; 6 | -webkit-font-smoothing: antialiased;} 7 | 8 | html body.remove-border{ 9 | margin:0; 10 | padding:0;} 11 | 12 | .hide div.loadingbox{ 13 | width: 980px !important; 14 | margin: 7px auto 50px; 15 | padding: 2em 0 1em; 16 | border: 1px solid #dae1e7; 17 | -webkit-border-radius: 7px; 18 | cursor: pointer; 19 | background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#eff5f9), to(#fff)); 20 | color: #474747; 21 | font: normal normal normal 12px/18px 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; 22 | -webkit-box-shadow: 0 1px 5px rgba(0,0,0,0.1); 23 | -webkit-transition: -webkit-box-shadow 0.1s;} 24 | 25 | .hide.hidetitle div.loadingbox{ 26 | margin-top: 72px;} 27 | 28 | .hide div.loadingbox:hover{ 29 | -webkit-box-shadow: 0 1px 10px rgba(0,0,0,0.1);} 30 | 31 | .hide div.loadingbox:active{ 32 | -webkit-box-shadow: 0 1px 5px rgba(0,0,0,0.1);} 33 | 34 | .hide div.loadingbox p.title{ 35 | font-size: 22px; 36 | line-height: 32px; 37 | color: inherit; 38 | font-weight: bold; 39 | -webkit-font-smoothing: antialiased;} 40 | 41 | .hide div.loadingbox p.title, 42 | .hide div.loadingbox p.subtitle{ 43 | padding: 0 40px;} 44 | 45 | .hide div.loadingbox p.subtitle{ 46 | margin-top: 0.5em;} 47 | 48 | .hide p.subtitle span{ 49 | text-decoration: underline;} 50 | 51 | .hide p{ 52 | margin: 0;} 53 | 54 | .hide .loadingbox table.info{ 55 | width: 400px !important; 56 | margin: 0 auto 1em;} 57 | 58 | .hide .loadingbox table.info td{ 59 | width: 1%; 60 | vertical-align: top;} 61 | 62 | .hide .loadingbox table.info td+td{ 63 | width: 99% !important;} 64 | 65 | .hide .loadingbox table.info p{ 66 | margin-left: 2em !important;} 67 | 68 | .hide .loadingbox table.info p:last-child{ 69 | font-weight: bold !important; 70 | color: #898989;} 71 | 72 | .hide .loadingbox table.info p:first-child{ 73 | margin-top: 3em !important;} 74 | 75 | .hide .loadingbox table.info img{ 76 | padding: 7px; 77 | background: #fff; 78 | -webkit-box-shadow: rgba(0,0,0,0.296875) 0px 3px 5px;} 79 | 80 | .hide #iTunesDetectorIE{ 81 | display: block; 82 | width: 980px !important; 83 | height: 32px !important; 84 | margin: 50px auto 0; 85 | background: #fff url(http://ax.itunes.apple.com/images/web/itunes_preview/itunespreview_en.png) 7px 0 no-repeat !important;} 86 | 87 | body.de-de #iTunesDetectorIE{ 88 | background-image: url(http://ax.itunes.apple.com/images/web/itunes_preview/itunespreview_de.png) !important; 89 | } 90 | 91 | body.it-it #iTunesDetectorIE{ 92 | background-image: url(http://ax.itunes.apple.com/images/web/itunes_preview/itunespreview_it.png) !important; 93 | } 94 | 95 | .hide.hidetitle #iTunesDetectorIE{ 96 | display: none;} 97 | 98 | p.clickhere{ 99 | padding-bottom: 1.3em !important; 100 | margin-bottom: 0 !important; 101 | text-align: center;} 102 | 103 | #itunes-detector}{ 104 | display: none !important;} 105 | 106 | .shownomoreitunesbar .hide{ 107 | margin: 0; 108 | padding: 0;} 109 | 110 | html body div#nomoreitunes.bar, 111 | html body div#nomoreitunes.bar>div, 112 | html body div#nomoreitunes.bar>#launch{ 113 | overflow: hidden !important; 114 | height: 22px !important; 115 | margin: 0 !important; 116 | padding: 0 !important; 117 | -webkit-user-select: none !important; 118 | cursor: default !important;} 119 | 120 | html body div#nomoreitunes.bar:active, 121 | html body div#nomoreitunes.bar>div:active, 122 | html body div#nomoreitunes.bar>#launch:active{ 123 | cursor: default !important;} 124 | 125 | html body div#nomoreitunes.bar{ 126 | position: fixed !important; 127 | top: -23px !important; 128 | right: 0 !important; 129 | left: 0 !important; 130 | padding: 0 202px 0 11px !important; 131 | line-height: 22px !important; 132 | background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ededed), to(#d9d9d9)) !important; 133 | border-top: 0; 134 | border-bottom: 1px solid #bfbfbf !important; 135 | color: #737373 !important; 136 | z-index: 999999; 137 | -webkit-transition: all linear 500ms; 138 | pointer-events:none !important; 139 | -webkit-box-shadow: 0 1px 15px rgba(0,0,0,0.3); 140 | opacity: 0} 141 | 142 | html body div#nomoreitunes.bar>div{ 143 | position: relative !important; 144 | width: 100% !important; 145 | font: bold 12px/23px Helvetica, sans-serif !important; 146 | text-overflow: ellipsis !important; 147 | -webkit-text-overflow: ellipsis !important; 148 | white-space: nowrap !important; 149 | text-align: left !important;} 150 | 151 | html body div#nomoreitunes.bar>#launch{ 152 | position: absolute !important; 153 | top: 0 !important; 154 | right: 11px !important; 155 | display: block !important; 156 | width: 180px !important; 157 | height: 16px !important; 158 | margin: 2px 0 0 0 !important; 159 | border-radius: 8px !important; 160 | border: 1px solid #a8a8a8 !important; 161 | -webkit-box-shadow: 0 1px 1px #ededed, inset 0 1px 1px #fafafa !important; 162 | background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#f6f6f6), to(#e3e3e3)) !important; 163 | color: #868686 !important; 164 | font: bold 11px/18px Helvetica, sans-serif !important; 165 | text-align: center !important; 166 | vertical-align: middle !important; 167 | text-decoration: none !important; 168 | padding: 0 !important; 169 | pointer-events: auto !important;} 170 | 171 | html body div#nomoreitunes.bar>#launch:active{ 172 | -webkit-box-shadow: 0 1px 1px #ededed, inset 0 1px 1px #a8a8a8 !important; 173 | background: #424242 -webkit-gradient(linear, 0% 0%, 0% 100%, from(#c5c5c5), to(#d2d2d2)) !important; 174 | border-color: #8c8c8c !important; 175 | color: #575757 !important;} 176 | 177 | body{ 178 | /* border-top: 22px solid #F5F6F7; */ 179 | border-top-width: 0;} 180 | 181 | /* 182 | body{ 183 | -webkit-transition: border-top-width linear 500ms;}*/ 184 | 185 | /* 186 | .shownomoreitunesbar body{ 187 | border-top-width: 23px;}*/ 188 | 189 | body.oldschool{ 190 | -webkit-transition: border-top-width linear 0 !important; 191 | border-top-width: 23px !important; 192 | border-color: #f7f8f9; 193 | background: #f7f8f9;} 194 | 195 | /* 196 | .hide div#nomoreitunes.bar{ 197 | -webkit-transition: top linear 0 !important; 198 | top: 0 !important;}*/ 199 | 200 | .shownomoreitunesbar div#nomoreitunes.bar{ 201 | top: 0 !important; 202 | opacity: 1 !important; } -------------------------------------------------------------------------------- /NoMoreiTunes.safariextension/startScript.js: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | NoMoreiTunes 4 | ------------ 5 | 6 | An extension by Florian Pichler to stop 7 | Apple's Preview websites from launching iTunes. 8 | Developed after an idea from Wolfgang Klatt. 9 | 10 | Online: http://nomoreitunes.einserver.de 11 | Contact: pichfl@einserver.de 12 | 13 | (c)2010-2011, Florian Pichler, All rights reserved 14 | This plugin is provided as is and at no cost. 15 | 16 | If you like the plugin, don't hesitate donate. 17 | 18 | */ 19 | 20 | ;(function(win,doc) { 21 | 22 | // Some helpers 23 | function $(sel) { 24 | var ret = doc.querySelectorAll(sel); 25 | return ret[0]; 26 | } 27 | 28 | function $$(sel) { 29 | return doc.querySelectorAll(sel); 30 | } 31 | 32 | function stringClean(str) { 33 | return str.replace(/\s+/g, ' ').replace(/^\s+|\s+$/g, ''); 34 | } 35 | 36 | function disposeElement(el) { 37 | return (el.parentNode) ? el.parentNode.removeChild(el) : el; 38 | } 39 | 40 | var forEach = Array.prototype.forEach; 41 | 42 | // Start extension code 43 | var NoMoreiTunes = NoMoreiTunes || {}; 44 | 45 | Cookie = { 46 | path: '/', 47 | domain: 'false', 48 | duration: false, 49 | secure: false, 50 | document: document, 51 | encode: true 52 | }; 53 | 54 | Cookie.write = function(key, value, options) { 55 | value = encodeURIComponent(value); 56 | var d = options.document || this.document; 57 | 58 | var domain = options.domain || this.domain; 59 | if (domain) { 60 | value += '; domain=' + domain; 61 | } 62 | 63 | var path = options.path || this.path; 64 | if (path) { 65 | value += '; path=' + path; 66 | } 67 | 68 | var duration = options.duration || this.duration; 69 | if (duration) { 70 | var date = new Date(); 71 | date.setTime(date.getTime() + duration * 24 * 60 * 60 * 1000); 72 | value += '; expires=' + date.toGMTString(); 73 | } 74 | 75 | if (options.secure || this.secure) { 76 | value += '; secure'; 77 | d.cookie = key + '=' + value; 78 | } 79 | }; 80 | 81 | Cookie.read = function(key) { 82 | var escapedKey = key.replace(/(\[-.*\+?^$\{\}()|[\]\/\\])/g, '\\$1'); 83 | var value = this.document.cookie.match('(?:^|;)\\s*' + escapedKey + '=([^;]*)'); 84 | return (value) ? decodeURIComponent(value[1]) : null; 85 | }; 86 | 87 | // language strings 88 | NoMoreiTunes.lang = { 89 | // Defaults 90 | 'en': { 91 | 'itunes': { 92 | 'info': 'NoMoreiTunes prevented this page from launching iTunes', 93 | 'launch': 'Open in iTunes', 94 | 'click': 'Click here to open iTunes.' 95 | }, 96 | 'appstore': { 97 | 'info': 'NoMoreiTunes prevented this page from launching the AppStore', 98 | 'launch': 'Open the AppStore', 99 | 'click': 'Click here to open the AppStore' 100 | } 101 | }, 102 | // By Florian Pichler, florianpichler.de 103 | 'de': { 104 | 'itunes': { 105 | 'info': 'NoMoreiTunes hat diese Seite am Öffnen von iTunes gehindert', 106 | 'launch': 'In iTunes öffnen', 107 | 'click': 'Hier klicken um iTunes zu öffnen.' 108 | }, 109 | 'appstore': { 110 | 'info': 'NoMoreiTunes hat diese Seite am Öffnen vom AppStore gehindert', 111 | 'launch': 'Im AppStore öffnen', 112 | 'click': 'Hier klicken um den AppStore zu öffnen' 113 | } 114 | }, 115 | // By Alfred Brose, alfred.brose@bcmsolutions.de 116 | 'ru': { 117 | 'itunes': { 118 | 'info': 'NoMoreiTunes предотвратило открытие этой страницы', 119 | 'launch': 'Открыть в iTunes', 120 | 'click': 'Нажмите здесь чтобы открыть iTunes' 121 | }, 122 | 'appstore': { 123 | 'info': 'NoMoreiTunes prevented this page from launching the AppStore', 124 | 'launch': 'Open the AppStore', 125 | 'click': 'Click here to open the AppStore' 126 | } 127 | }, 128 | // By Giancarlo Nicolof, http://web.me.com/giancarlon/ 129 | 'it': { 130 | 'itunes': { 131 | 'info': 'NoMoreiTunes ha impedito a questa pagina di aprire iTunes', 132 | 'launch': 'Apri in iTunes', 133 | 'click': 'Cliccare qui per aprire iTunes.' 134 | }, 135 | 'appstore': { 136 | 'info': 'NoMoreiTunes prevented this page from launching the AppStore', 137 | 'launch': 'Open the AppStore', 138 | 'click': 'Click here to open the AppStore' 139 | } 140 | }, 141 | // By Amine Benboubker, http://aminebenboubker.com/ 142 | 'fr': { 143 | 'itunes': { 144 | 'info': 'NoMoreiTunes a empêché cette page de lancer iTunes', 145 | 'launch': 'Ouvrir dans iTunes', 146 | 'click': 'Cliquez ici pour ouvrir iTunes.' 147 | }, 148 | 'appstore': { 149 | 'info': 'NoMoreiTunes prevented this page from launching the AppStore', 150 | 'launch': 'Open the AppStore', 151 | 'click': 'Click here to open the AppStore' 152 | } 153 | }, 154 | // By Christoph Theel 155 | 'es': { 156 | 'itunes': { 157 | 'info': 'NoMoreiTunes impidió a esta página de lanzar iTunes', 158 | 'launch': 'Abrir en iTunes', 159 | 'click': 'Haga clic aqui para abrir iTunes.' 160 | }, 161 | 'appstore': { 162 | 'info': 'NoMoreiTunes prevented this page from launching the AppStore', 163 | 'launch': 'Open the AppStore', 164 | 'click': 'Click here to open the AppStore' 165 | } 166 | }, 167 | 'pt' : { 168 | 'itunes': { 169 | 'info': 'NoMoreiTunes impediu esta página de lançar iTunes', 170 | 'launch': 'Abra o iTunes', 171 | 'click': 'Clique aqui para abrir o iTunes.' 172 | }, 173 | 'appstore': { 174 | 'info': 'NoMoreiTunes prevented this page from launching the AppStore', 175 | 'launch': 'Open the AppStore', 176 | 'click': 'Click here to open the AppStore' 177 | } 178 | }, 179 | //By Oscar Palmér, http://oscarismy.name/ 180 | 'sv': { 181 | 'itunes': { 182 | 'info': 'NoMoreiTunes hindrade denna sida från att öppna iTunes', 183 | 'launch': 'Öppna i iTunes', 184 | 'click': 'Klicka här för att öppna iTunes.' 185 | }, 186 | 'appstore': { 187 | 'info': 'NoMoreiTunes hindrade denna sida från att öppna App Store', 188 | 'launch': 'Öppna i App Store', 189 | 'click': 'Klicka här för att öppna App Store.' 190 | } 191 | }, 192 | // By Łukasz Handke, lukasz.handke@gmail.com 193 | 'pl': { 194 | 'itunes': { 195 | 'info': 'NoMoreiTunes uniemożliwił tej stronie automatyczne otwarcie iTunes', 196 | 'launch': 'Otwórz w iTunes', 197 | 'click': 'Kliknij tutaj by otworzyć iTunes.' 198 | }, 199 | 'appstore': { 200 | 'info': 'NoMoreiTunes prevented this page from launching the AppStore', 201 | 'launch': 'Open the AppStore', 202 | 'click': 'Click here to open the AppStore' 203 | } 204 | }, 205 | // By Zhusee Zhang 206 | 'zh': { 207 | 'itunes': { 208 | 'info': 'NoMoreiTunes 阻止了這個網頁自動打開 iTunes', 209 | 'launch': '在 iTunes 中開啟', 210 | 'click': '請點這裡來打開 iTunes。' 211 | }, 212 | 'appstore': { 213 | 'info': 'NoMoreiTunes prevented this page from launching the AppStore', 214 | 'launch': 'Open the AppStore', 215 | 'click': 'Click here to open the AppStore' 216 | } 217 | }, 218 | // By Daniel Göstenmeier, http://goestenmeier.com/ 219 | 'nl': { 220 | 'itunes': { 221 | 'info': 'NoMoreiTunes verhindert deze pagina om iTunes te openen', 222 | 'launch': 'Open in iTunes', 223 | 'click': 'Click hier om iTunes te openen.' 224 | }, 225 | 'appstore': { 226 | 'info': 'NoMoreiTunes prevented this page from launching the AppStore', 227 | 'launch': 'Open the AppStore', 228 | 'click': 'Click here to open the AppStore' 229 | } 230 | 231 | }, 232 | // By Johan K. Jensen, @Josso000 233 | 'da': { 234 | 'itunes': { 235 | 'info': 'NoMoreiTunes stoppede denne side i at åbne iTunes', 236 | 'launch': 'Åben i iTunes', 237 | 'click': 'Klik her for at åbne iTunes.' 238 | }, 239 | 'appstore': { 240 | 'info': 'NoMoreiTunes stoppede denne side i at åbne AppStoren', 241 | 'launch': 'Åben AppStoren', 242 | 'click': 'Klik her for at åbne AppStoren' 243 | } 244 | } 245 | }; 246 | 247 | /* , 248 | '': { 249 | 'itunes': { 250 | 'info': '', 251 | 'launch': '', 252 | 'click': '' 253 | } 254 | 'appstore': { 255 | 'info': '', 256 | 'launch': '', 257 | 'click': '' 258 | } 259 | } 260 | */ 261 | 262 | // Get extension settings 263 | NoMoreiTunes.tryClosingWindow = false; 264 | NoMoreiTunes.shouldHideToolbar = false; 265 | safari.self.addEventListener('message', function(event) { 266 | if (event.name === 'setNoMoreItunesCloseOnLaunch') { 267 | NoMoreiTunes.tryClosingWindow = event.message; 268 | } 269 | if (event.name === 'setNoMoreItunesHideToolbar') { 270 | NoMoreiTunes.shouldHideToolbar = event.message; 271 | hideBar(); 272 | } 273 | }, false); 274 | 275 | safari.self.tab.dispatchMessage('getNoMoreiTunesSettings'); 276 | 277 | if (Cookie.read('disableAutoLaunch') != 1) { 278 | var a = new Date(); 279 | a.setTime(a.getTime()+300000); 280 | Cookie.write('disableAutoLaunch', 1, { 281 | 'duration': 0.0034, 282 | 'domain': 'itunes.apple.com' 283 | }); 284 | } 285 | 286 | function closeWindow() { 287 | if (NoMoreiTunes.tryClosingWindow) { 288 | setTimeout(function() { 289 | close(); 290 | console.log('NoMoreiTunes tried to close this window.'); 291 | }, 100); 292 | } 293 | } 294 | 295 | function hideBar() { 296 | if (NoMoreiTunes.shouldHideToolbar) { 297 | setTimeout(function() { 298 | doc.documentElement.classList.remove('shownomoreitunesbar'); 299 | }, 5100); 300 | } 301 | } 302 | 303 | function openStore() { 304 | if (url && url !== ''){ 305 | doc.body.classList.remove('shownomoreitunesbar'); 306 | win.location.replace(url); 307 | closeWindow(); 308 | } 309 | } 310 | 311 | var bar, 312 | bodyOnload, 313 | url; 314 | 315 | win.addEventListener('DOMContentLoaded', function() { 316 | 317 | bodyOnload = doc.body.attributes.getNamedItem('onload'); 318 | 319 | url = stringClean(bodyOnload.value); 320 | 321 | var bl = navigator.language.substr(0,2), 322 | appStore = (url === 'detectAndOpenMacAppStore();'), 323 | itunesStore = (url === 'detectAndOpenItunes();'); 324 | 325 | doc.body.attributes.removeNamedItem('onload'); 326 | 327 | var matchedUrl, 328 | launchButton = false, 329 | newUrl; 330 | 331 | if (appStore || itunesStore) { 332 | launchButton = $('#left-stack a.action'); 333 | 334 | newUrl = launchButton.attributes.getNamedItem('onclick'); 335 | url = newUrl.value; 336 | 337 | matchedUrl = url.match(/(?:return .*\(')(?:http|itms)(.*)(?:'\);)/); 338 | } else { 339 | matchedUrl = url.match(/(?:openItunes\(')(?:http|itms)(.*)(?:'\);)/) || url.match(/(?:itmsOpen\(')(?:http|itms)(.*)(?:','http)/); 340 | } 341 | 342 | if (matchedUrl) { 343 | var prefix = (appStore)?'macappstore':"itms"; 344 | 345 | newUrl = prefix + matchedUrl[1]; 346 | 347 | var unhashedUrl = newUrl.split('#'); 348 | 349 | url = unhashedUrl[0]; 350 | } 351 | 352 | // set language 353 | var clientLanguage = 'en', 354 | currentLang; 355 | 356 | for (currentLang in NoMoreiTunes.lang) { 357 | if (currentLang == bl) { 358 | clientLanguage = currentLang; 359 | } 360 | } 361 | doc.body.classList.add(clientLanguage); 362 | var langStrings = NoMoreiTunes.lang[clientLanguage][(appStore)?'appstore':'itunes']; 363 | 364 | if ($('.loadingbox .roundtop')) { 365 | doc.body.classList.add('remove-border'); 366 | } 367 | 368 | bar = doc.createElement('div'); 369 | bar.id = 'nomoreitunes'; 370 | bar.className = 'bar'; 371 | bar.innerHTML = '
' + langStrings.info + '
' + '
' + langStrings.launch + '
'; 372 | 373 | doc.body.appendChild(bar); 374 | 375 | 376 | if (!launchButton) { 377 | doc.body.classList.add('oldschool'); 378 | } 379 | 380 | $('#nomoreitunes #launch').addEventListener('click', openStore, false); 381 | 382 | win.addEventListener('load', function() { 383 | setTimeout(function() { 384 | doc.documentElement.classList.add('shownomoreitunesbar'); 385 | }, 500); 386 | }, false); 387 | 388 | var userOverride = $('#userOverridePanel, .loadingbox .roundtop'); 389 | 390 | if (userOverride) { 391 | forEach.call($$('.roundtop, .roundbot, style, center, p.footer'), function(el){ 392 | el.parentNode.removeChild(el); 393 | }); 394 | 395 | doc.body.classList.add('hide'); 396 | if ($('table.info')) { 397 | doc.body.classList.add('hideloading'); 398 | } else { 399 | var sub = $('p.subtitle'); 400 | if (sub) { 401 | var subHtml = sub.innerHTML; 402 | sub.innerHTML = subHtml+' '+langStrings.click; 403 | doc.body.classList.add('hidetitle'); 404 | } 405 | } 406 | var lb = $('.loadingbox'); 407 | if (lb) { 408 | lb.addEventListener('click', openStore, false); 409 | } 410 | } else { 411 | var a = $('.intro p:last-child'); 412 | if (a) { 413 | disposeElement(a); 414 | } 415 | } 416 | }, false); 417 | 418 | }(window, document)); -------------------------------------------------------------------------------- /NoMoreiTunes.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | C3F4AA02212896750071E1DF /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3F4AA01212896750071E1DF /* AppDelegate.swift */; }; 11 | C3F4AA04212896750071E1DF /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3F4AA03212896750071E1DF /* ViewController.swift */; }; 12 | C3F4AA06212896770071E1DF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C3F4AA05212896770071E1DF /* Assets.xcassets */; }; 13 | C3F4AA09212896770071E1DF /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C3F4AA07212896770071E1DF /* Main.storyboard */; }; 14 | /* End PBXBuildFile section */ 15 | 16 | /* Begin PBXFileReference section */ 17 | C3F4A9FE212896750071E1DF /* NoMoreiTunes.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = NoMoreiTunes.app; sourceTree = BUILT_PRODUCTS_DIR; }; 18 | C3F4AA01212896750071E1DF /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 19 | C3F4AA03212896750071E1DF /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 20 | C3F4AA05212896770071E1DF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 21 | C3F4AA08212896770071E1DF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 22 | C3F4AA0A212896770071E1DF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 23 | C3F4AA0B212896770071E1DF /* NoMoreiTunes.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = NoMoreiTunes.entitlements; sourceTree = ""; }; 24 | /* End PBXFileReference section */ 25 | 26 | /* Begin PBXFrameworksBuildPhase section */ 27 | C3F4A9FB212896750071E1DF /* Frameworks */ = { 28 | isa = PBXFrameworksBuildPhase; 29 | buildActionMask = 2147483647; 30 | files = ( 31 | ); 32 | runOnlyForDeploymentPostprocessing = 0; 33 | }; 34 | /* End PBXFrameworksBuildPhase section */ 35 | 36 | /* Begin PBXGroup section */ 37 | C3F4A9F5212896750071E1DF = { 38 | isa = PBXGroup; 39 | children = ( 40 | C3F4AA00212896750071E1DF /* NoMoreiTunes */, 41 | C3F4A9FF212896750071E1DF /* Products */, 42 | ); 43 | sourceTree = ""; 44 | }; 45 | C3F4A9FF212896750071E1DF /* Products */ = { 46 | isa = PBXGroup; 47 | children = ( 48 | C3F4A9FE212896750071E1DF /* NoMoreiTunes.app */, 49 | ); 50 | name = Products; 51 | sourceTree = ""; 52 | }; 53 | C3F4AA00212896750071E1DF /* NoMoreiTunes */ = { 54 | isa = PBXGroup; 55 | children = ( 56 | C3F4AA01212896750071E1DF /* AppDelegate.swift */, 57 | C3F4AA03212896750071E1DF /* ViewController.swift */, 58 | C3F4AA05212896770071E1DF /* Assets.xcassets */, 59 | C3F4AA07212896770071E1DF /* Main.storyboard */, 60 | C3F4AA0A212896770071E1DF /* Info.plist */, 61 | C3F4AA0B212896770071E1DF /* NoMoreiTunes.entitlements */, 62 | ); 63 | path = NoMoreiTunes; 64 | sourceTree = ""; 65 | }; 66 | /* End PBXGroup section */ 67 | 68 | /* Begin PBXNativeTarget section */ 69 | C3F4A9FD212896750071E1DF /* NoMoreiTunes */ = { 70 | isa = PBXNativeTarget; 71 | buildConfigurationList = C3F4AA0E212896770071E1DF /* Build configuration list for PBXNativeTarget "NoMoreiTunes" */; 72 | buildPhases = ( 73 | C3F4A9FA212896750071E1DF /* Sources */, 74 | C3F4A9FB212896750071E1DF /* Frameworks */, 75 | C3F4A9FC212896750071E1DF /* Resources */, 76 | ); 77 | buildRules = ( 78 | ); 79 | dependencies = ( 80 | ); 81 | name = NoMoreiTunes; 82 | productName = NoMoreiTunes; 83 | productReference = C3F4A9FE212896750071E1DF /* NoMoreiTunes.app */; 84 | productType = "com.apple.product-type.application"; 85 | }; 86 | /* End PBXNativeTarget section */ 87 | 88 | /* Begin PBXProject section */ 89 | C3F4A9F6212896750071E1DF /* Project object */ = { 90 | isa = PBXProject; 91 | attributes = { 92 | LastSwiftUpdateCheck = 0940; 93 | LastUpgradeCheck = 0940; 94 | ORGANIZATIONNAME = YLKGD; 95 | TargetAttributes = { 96 | C3F4A9FD212896750071E1DF = { 97 | CreatedOnToolsVersion = 9.4.1; 98 | }; 99 | }; 100 | }; 101 | buildConfigurationList = C3F4A9F9212896750071E1DF /* Build configuration list for PBXProject "NoMoreiTunes" */; 102 | compatibilityVersion = "Xcode 9.3"; 103 | developmentRegion = en; 104 | hasScannedForEncodings = 0; 105 | knownRegions = ( 106 | en, 107 | Base, 108 | ); 109 | mainGroup = C3F4A9F5212896750071E1DF; 110 | productRefGroup = C3F4A9FF212896750071E1DF /* Products */; 111 | projectDirPath = ""; 112 | projectRoot = ""; 113 | targets = ( 114 | C3F4A9FD212896750071E1DF /* NoMoreiTunes */, 115 | ); 116 | }; 117 | /* End PBXProject section */ 118 | 119 | /* Begin PBXResourcesBuildPhase section */ 120 | C3F4A9FC212896750071E1DF /* Resources */ = { 121 | isa = PBXResourcesBuildPhase; 122 | buildActionMask = 2147483647; 123 | files = ( 124 | C3F4AA06212896770071E1DF /* Assets.xcassets in Resources */, 125 | C3F4AA09212896770071E1DF /* Main.storyboard in Resources */, 126 | ); 127 | runOnlyForDeploymentPostprocessing = 0; 128 | }; 129 | /* End PBXResourcesBuildPhase section */ 130 | 131 | /* Begin PBXSourcesBuildPhase section */ 132 | C3F4A9FA212896750071E1DF /* Sources */ = { 133 | isa = PBXSourcesBuildPhase; 134 | buildActionMask = 2147483647; 135 | files = ( 136 | C3F4AA04212896750071E1DF /* ViewController.swift in Sources */, 137 | C3F4AA02212896750071E1DF /* AppDelegate.swift in Sources */, 138 | ); 139 | runOnlyForDeploymentPostprocessing = 0; 140 | }; 141 | /* End PBXSourcesBuildPhase section */ 142 | 143 | /* Begin PBXVariantGroup section */ 144 | C3F4AA07212896770071E1DF /* Main.storyboard */ = { 145 | isa = PBXVariantGroup; 146 | children = ( 147 | C3F4AA08212896770071E1DF /* Base */, 148 | ); 149 | name = Main.storyboard; 150 | sourceTree = ""; 151 | }; 152 | /* End PBXVariantGroup section */ 153 | 154 | /* Begin XCBuildConfiguration section */ 155 | C3F4AA0C212896770071E1DF /* Debug */ = { 156 | isa = XCBuildConfiguration; 157 | buildSettings = { 158 | ALWAYS_SEARCH_USER_PATHS = NO; 159 | CLANG_ANALYZER_NONNULL = YES; 160 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 161 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 162 | CLANG_CXX_LIBRARY = "libc++"; 163 | CLANG_ENABLE_MODULES = YES; 164 | CLANG_ENABLE_OBJC_ARC = YES; 165 | CLANG_ENABLE_OBJC_WEAK = YES; 166 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 167 | CLANG_WARN_BOOL_CONVERSION = YES; 168 | CLANG_WARN_COMMA = YES; 169 | CLANG_WARN_CONSTANT_CONVERSION = YES; 170 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 171 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 172 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 173 | CLANG_WARN_EMPTY_BODY = YES; 174 | CLANG_WARN_ENUM_CONVERSION = YES; 175 | CLANG_WARN_INFINITE_RECURSION = YES; 176 | CLANG_WARN_INT_CONVERSION = YES; 177 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 178 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 179 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 180 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 181 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 182 | CLANG_WARN_STRICT_PROTOTYPES = YES; 183 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 184 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 185 | CLANG_WARN_UNREACHABLE_CODE = YES; 186 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 187 | CODE_SIGN_IDENTITY = "Mac Developer"; 188 | COPY_PHASE_STRIP = NO; 189 | DEBUG_INFORMATION_FORMAT = dwarf; 190 | ENABLE_STRICT_OBJC_MSGSEND = YES; 191 | ENABLE_TESTABILITY = YES; 192 | GCC_C_LANGUAGE_STANDARD = gnu11; 193 | GCC_DYNAMIC_NO_PIC = NO; 194 | GCC_NO_COMMON_BLOCKS = YES; 195 | GCC_OPTIMIZATION_LEVEL = 0; 196 | GCC_PREPROCESSOR_DEFINITIONS = ( 197 | "DEBUG=1", 198 | "$(inherited)", 199 | ); 200 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 201 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 202 | GCC_WARN_UNDECLARED_SELECTOR = YES; 203 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 204 | GCC_WARN_UNUSED_FUNCTION = YES; 205 | GCC_WARN_UNUSED_VARIABLE = YES; 206 | MACOSX_DEPLOYMENT_TARGET = 10.13; 207 | MTL_ENABLE_DEBUG_INFO = YES; 208 | ONLY_ACTIVE_ARCH = YES; 209 | SDKROOT = macosx; 210 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 211 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 212 | }; 213 | name = Debug; 214 | }; 215 | C3F4AA0D212896770071E1DF /* Release */ = { 216 | isa = XCBuildConfiguration; 217 | buildSettings = { 218 | ALWAYS_SEARCH_USER_PATHS = NO; 219 | CLANG_ANALYZER_NONNULL = YES; 220 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 221 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 222 | CLANG_CXX_LIBRARY = "libc++"; 223 | CLANG_ENABLE_MODULES = YES; 224 | CLANG_ENABLE_OBJC_ARC = YES; 225 | CLANG_ENABLE_OBJC_WEAK = YES; 226 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 227 | CLANG_WARN_BOOL_CONVERSION = YES; 228 | CLANG_WARN_COMMA = YES; 229 | CLANG_WARN_CONSTANT_CONVERSION = YES; 230 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 231 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 232 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 233 | CLANG_WARN_EMPTY_BODY = YES; 234 | CLANG_WARN_ENUM_CONVERSION = YES; 235 | CLANG_WARN_INFINITE_RECURSION = YES; 236 | CLANG_WARN_INT_CONVERSION = YES; 237 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 238 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 239 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 240 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 241 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 242 | CLANG_WARN_STRICT_PROTOTYPES = YES; 243 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 244 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 245 | CLANG_WARN_UNREACHABLE_CODE = YES; 246 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 247 | CODE_SIGN_IDENTITY = "Mac Developer"; 248 | COPY_PHASE_STRIP = NO; 249 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 250 | ENABLE_NS_ASSERTIONS = NO; 251 | ENABLE_STRICT_OBJC_MSGSEND = YES; 252 | GCC_C_LANGUAGE_STANDARD = gnu11; 253 | GCC_NO_COMMON_BLOCKS = YES; 254 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 255 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 256 | GCC_WARN_UNDECLARED_SELECTOR = YES; 257 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 258 | GCC_WARN_UNUSED_FUNCTION = YES; 259 | GCC_WARN_UNUSED_VARIABLE = YES; 260 | MACOSX_DEPLOYMENT_TARGET = 10.13; 261 | MTL_ENABLE_DEBUG_INFO = NO; 262 | SDKROOT = macosx; 263 | SWIFT_COMPILATION_MODE = wholemodule; 264 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 265 | }; 266 | name = Release; 267 | }; 268 | C3F4AA0F212896770071E1DF /* Debug */ = { 269 | isa = XCBuildConfiguration; 270 | buildSettings = { 271 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 272 | CODE_SIGN_ENTITLEMENTS = NoMoreiTunes/NoMoreiTunes.entitlements; 273 | CODE_SIGN_STYLE = Automatic; 274 | COMBINE_HIDPI_IMAGES = YES; 275 | DEVELOPMENT_TEAM = E7ZXX8R29L; 276 | INFOPLIST_FILE = NoMoreiTunes/Info.plist; 277 | LD_RUNPATH_SEARCH_PATHS = ( 278 | "$(inherited)", 279 | "@executable_path/../Frameworks", 280 | ); 281 | PRODUCT_BUNDLE_IDENTIFIER = gd.ylk.NoMoreiTunes; 282 | PRODUCT_NAME = "$(TARGET_NAME)"; 283 | SWIFT_VERSION = 4.0; 284 | }; 285 | name = Debug; 286 | }; 287 | C3F4AA10212896770071E1DF /* Release */ = { 288 | isa = XCBuildConfiguration; 289 | buildSettings = { 290 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 291 | CODE_SIGN_ENTITLEMENTS = NoMoreiTunes/NoMoreiTunes.entitlements; 292 | CODE_SIGN_STYLE = Automatic; 293 | COMBINE_HIDPI_IMAGES = YES; 294 | DEVELOPMENT_TEAM = E7ZXX8R29L; 295 | INFOPLIST_FILE = NoMoreiTunes/Info.plist; 296 | LD_RUNPATH_SEARCH_PATHS = ( 297 | "$(inherited)", 298 | "@executable_path/../Frameworks", 299 | ); 300 | PRODUCT_BUNDLE_IDENTIFIER = gd.ylk.NoMoreiTunes; 301 | PRODUCT_NAME = "$(TARGET_NAME)"; 302 | SWIFT_VERSION = 4.0; 303 | }; 304 | name = Release; 305 | }; 306 | /* End XCBuildConfiguration section */ 307 | 308 | /* Begin XCConfigurationList section */ 309 | C3F4A9F9212896750071E1DF /* Build configuration list for PBXProject "NoMoreiTunes" */ = { 310 | isa = XCConfigurationList; 311 | buildConfigurations = ( 312 | C3F4AA0C212896770071E1DF /* Debug */, 313 | C3F4AA0D212896770071E1DF /* Release */, 314 | ); 315 | defaultConfigurationIsVisible = 0; 316 | defaultConfigurationName = Release; 317 | }; 318 | C3F4AA0E212896770071E1DF /* Build configuration list for PBXNativeTarget "NoMoreiTunes" */ = { 319 | isa = XCConfigurationList; 320 | buildConfigurations = ( 321 | C3F4AA0F212896770071E1DF /* Debug */, 322 | C3F4AA10212896770071E1DF /* Release */, 323 | ); 324 | defaultConfigurationIsVisible = 0; 325 | defaultConfigurationName = Release; 326 | }; 327 | /* End XCConfigurationList section */ 328 | }; 329 | rootObject = C3F4A9F6212896750071E1DF /* Project object */; 330 | } 331 | -------------------------------------------------------------------------------- /NoMoreiTunes/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | Default 529 | 530 | 531 | 532 | 533 | 534 | 535 | Left to Right 536 | 537 | 538 | 539 | 540 | 541 | 542 | Right to Left 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | Default 554 | 555 | 556 | 557 | 558 | 559 | 560 | Left to Right 561 | 562 | 563 | 564 | 565 | 566 | 567 | Right to Left 568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 664 | 665 | 666 | 667 | 668 | 669 | 670 | 671 | 672 | 673 | 674 | 675 | 676 | 677 | 678 | 679 | 680 | 681 | 682 | 683 | 684 | 685 | 686 | 687 | 688 | 689 | 690 | 691 | 692 | 693 | 694 | 695 | 696 | 697 | 698 | 699 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | --------------------------------------------------------------------------------