{"id":10009,"date":"2020-09-01T06:00:01","date_gmt":"2020-09-01T10:00:01","guid":{"rendered":"http:\/\/www.theartofretouching.com\/blog\/?p=10009"},"modified":"2024-03-31T00:37:56","modified_gmt":"2024-03-31T04:37:56","slug":"freelancer-success-pt2","status":"publish","type":"post","link":"https:\/\/www.theartofretouching.com\/blog\/freelancer-success-pt2\/","title":{"rendered":"How to Succeed as a Freelancer | Self-Employment Strategies"},"content":{"rendered":"<h2><span style=\"font-weight: bold;\">How to Succeed as a Freelancer &#8211; Self-Employment Strategies<\/span><\/h2>\n<p><em>This video is available <strong>with Free For All<\/strong>.<\/em><br \/>\n<em><strong>Running Time<\/strong>: 10 minutes<\/em><\/p>\n<p>My name is John Ross with the Art of Retouching Studio. This video is part 2 in the series of How To Succeed as a Freelancer, Self-Employment Strategies. How do you handle clients who demand that you get something done at 2AM on a Sunday? What happens when retouching styles clash?<\/p>\n<p>In this video, I&#8217;ll be talking about how to keep yourself sane throughout your retouching career beyond Photoshop and growing your portfolio. Because working from your home office and making money isn&#8217;t all about the basics of Photoshop, it&#8217;s about business. This video aims to teach you real-world skills on how to handle clients the right way and on how to make things happen as a successful freelancer.<\/p>\n<p><!--more--><\/p>\n<div style=\"position: relative; top: 10px;\">\n\r\n\r\n<style>\r\n    \r\n\/* FOLLOWING TWO SHOULD HAVE SAME COLOR - videoControlBarColor *\/\r\n\/* Background color of control bar and big play button *\/\r\n#video1 .vjs-big-play-button {\r\n    border-color: #efefef  !important;\r\n    background-color: #333333 !important;\r\n    font-size: 20px !important;\r\n    opacity: .7;\r\n     }\r\n    \r\n    \r\n\r\n\/* Color of control bar *\/\r\n#videocontent1 .vjs-control-bar button {\r\n    background: unset !important;\r\n}    \r\n\r\n\r\n#videocontent1 .vjs-matrix .vjs-control-bar {\r\n    background: #333333 !important;\r\n    opacity: 1.0 !important;\r\n} \r\n\r\n\/* FOLLOWING TWO SHOULD HAVE SAME COLOR - videoMainColor *\/\r\n\/* Color of all text, icons and \"play\" triangle *\/\r\n#videocontent1 .vjs-default-skin {\r\n    color: #efefef !important; \r\n    overflow: hidden !important;\r\n            font-size: 10px !important;\r\n    }\r\n    \r\n\/* Change the color of various \"bars\" text: Scrubber and Volume - make it same as bg color of big play button*\/\r\n#videocontent1 .vjs-matrix .vjs-volume-level,\r\n#videocontent1 .vjs-matrix .vjs-play-progress,\r\n#videocontent1 .vjs-matrix .vjs-slider-bar\r\n{\r\n    background: #efefef !important;\r\n}\r\n    \r\ndiv#videocontent1 {\r\n    display: block !important;\r\n}    \r\n\r\n    \r\n                    \r\n\r\n\r\n\/* Style inner div to center button *\/\r\n.inner {\r\n    left: 50%;\r\n    top: 10%;\r\n    transform: translate(-50%, -50%);\r\n    position: absolute;\r\n}    \r\n    \r\n    \r\n\r\n        \/* hide the captions settings item from the captions menu *\/\r\n        .video1.vjs-texttrack-settings {\r\n            display: none;\r\n        }\r\n        \r\n    #videocontent1 .vjs-menu-button-popup .vjs-menu .vjs-menu-content {\r\n        background-color: #333333 !important;\r\n        color: #efefef !important;\r\n        padding: 0px !important;\r\n        margin: 0px !important;\r\n        max-height: none !important;\r\n    }\r\n    \r\n    #videocontent1 .vjs-menu-content li {\r\n        list-style: none !important;\r\n    }\r\n    \r\n    #videocontent1 li.vjs-menu-item {\r\n        margin-bottom: 0px !important;\r\n        margin: 0px !important;\r\n    }\r\n    \r\n    #videocontent1 .vjs-control .vjs-button {\r\n        padding-left: 0px !important;\r\n        padding-right: 0px !important;\r\n        margin-left: 0px !important;\r\n        padding:0px !important;\r\n    }\r\n    \r\n    #videocontent1 .vjs-playback-rate-value {\r\n        margin-right: 0em;\r\n    }\r\n    \r\n    #videocontent1 .vjs-playback-rate {\r\n        margin-right: 0em;\r\n    }\r\n        \r\n\r\n    \r\n#videocontent1 .vjs-user-inactive .vjs-control-bar {\r\n    display: none !important;\r\n    visibility: hidden !important;\r\n    opacity: 0 !important;\r\n    cursor: none !important;\r\n}\r\n    \r\n\/**\r\n#videocontent1 .vjs-big-play-button {\r\n    border: 0px !important;\r\n}\r\n*\/\r\n    \r\n#videocontent1 .vjs-play-control {\r\n    border: 0px !important;\r\n}\r\n    \r\n#videocontent1 .vjs-mute-control {\r\n    border: 0px !important;\r\n}\r\n\r\n#videocontent1 .vjs-control {\r\n    border: 0px !important;\r\n}\r\n\r\n#videocontent1 .vjs-button {\r\n    padding: 0px !important;\r\n    border: 0px !important;\r\n}    \r\n    \r\n#videocontent1 .vjs-picture-in-picture-control {\r\n    display: none !important;\r\n    visibility: hidden !important;\r\n    opacity: 0 !important;\r\n    cursor: none !important;\r\n}\r\n    \r\n    \r\n\r\n.video-js-dimensions.vjs-fluid { \r\n    padding-top: 56.25%;\r\n }\r\n.video-js { padding-top: 56.25%; }\r\n    \r\n    \r\n    \r\n<\/style>\r\n\r\n<script>\r\n\r\n    var watermarkCounter = 1;\r\n    \r\n    function setCookie(name, value, daysToExpire) {\r\n        \/\/console.log(\"setCookie\");\r\n        var expires = \"\";\r\n        if (daysToExpire) {\r\n            var date = new Date();\r\n            date.setTime(date.getTime() + (daysToExpire * 24 * 60 * 60 * 1000));\r\n            expires = \"; expires=\" + date.toUTCString();\r\n        }\r\n        document.cookie = name + \"=\" + value + expires + \"; path=\/\";\r\n    }\r\n    \r\n    function getCookie(cookieName) {\r\n        const cookies = document.cookie.split(';');\r\n\r\n        for (const cookie of cookies) {\r\n            const [name, value] = cookie.trim().split('=');\r\n            if (name === cookieName) {\r\n                return decodeURIComponent(value);\r\n            }\r\n        }\r\n\r\n        return null; \/\/ Cookie not found\r\n    }\r\n\r\n<\/script>\r\n\r\n\r\n        <!-- <link href=\"https:\/\/www.theartofretouching.com\/blog\/wp-content\/plugins\/S3MediaVaultPro\/includes\/css\/video-js-2.min.css\" rel=\"stylesheet\"> -->\r\n        <link href=\"https:\/\/www.theartofretouching.com\/blog\/wp-content\/plugins\/S3MediaVaultPro\/includes\/css\/videojs.watermark.css\" rel=\"stylesheet\">\r\n        \r\n        <!-- <script src=\"https:\/\/www.theartofretouching.com\/blog\/wp-content\/plugins\/S3MediaVaultPro\/includes\/javascript\/video-2.js\"><\/script> -->\r\n        <script src=\"https:\/\/www.theartofretouching.com\/blog\/wp-content\/plugins\/S3MediaVaultPro\/includes\/javascript\/videojs.watermark.js\"><\/script>\r\n        \r\n        <div id=\"videoparent1\">\r\n            <div id=\"videocontent1\" class=\"video-wrap\">\r\n                                    <video N id=\"video1\"  oncontextmenu=\"return false;\" class=\"vjs-matrix video-js-responsive-container video-js  vjs-16-9  vjs-default-skin vjs-big-play-centered\"  controls  preload=\"metadata\"  width=\"800\" height=\"450\"   poster=\"https:\/\/www.theartofretouching.com\/blog\/wp-content\/uploads\/2020\/09\/AoR002-Succeed-as-a-Freelancer-Pt-2.jpg\"  data-setup='{\"fluid\": true   ,\"playbackRates\": [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]  }' playsinline>\r\n                        <source src=\"https:\/\/aor-public.s3.amazonaws.com\/Succeed_as_a_Freelancer\/videos\/Aor002_Succeed_As_A_Freelancer_B_LR.mp4?X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIATFRWUZAOT3CJXS7C%2F20260901%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20260901T113831Z&X-Amz-SignedHeaders=host&X-Amz-Expires=1000&X-Amz-Signature=b88462e61d90e35a88af06f0db7074c117d1e6a8c26cf32467acba4414895878\" type=\"video\/mp4\" \/>\r\n                                            <\/video>\r\n                                                 <\/div>\r\n    <\/div>\r\n\r\n        \r\n                \r\n        <style>\r\n    \r\n    .vjs-fullscreen { padding-top: 0px }\r\n\r\n        \r\n    .buttonClass {\r\n        display: flex;\r\n        justify-content: center;\r\n        align-items: center;\r\n        vertical-align: baseline;\r\n        padding: 0px;\r\n    }\r\n\r\n                div1.vjs-watermark {\r\n                bottom: 30px !important;\r\n                top: unset !important;\r\n                right: 0 !important;\r\n                left: unset !important;\r\n            }\r\n         \r\n<\/style>\r\n\r\n<!-- JavaScript Start -->\r\n<script>\r\n    \r\n\/* <![CDATA[ *\/\r\nvar threshold1;\r\nvar ajaxurl = \"https:\/\/www.theartofretouching.com\/blog\/wp-admin\/admin-ajax.php\";\r\nvar promise;\r\n\r\nvar player1 = videojs('video1',{\r\n  width: \"800\",\r\n  height: \"450\"\r\n});\r\n\t\r\nplayer1.bigPlayButton.on('click', function(){\r\n\tif (player1.paused()) {\r\n\t\tplayer1.play();\r\n\t} \r\n\t\t\r\n});\r\n    \r\nvar div1;\r\n\r\n\r\n\r\nvar hasBeenClosed = false;\r\n       \r\n        function closePIP() {\r\n            var $videoWrap = jQuery('.video-wrap');\r\n            var $video = jQuery('.video');\r\n            var $closeButton = jQuery('.closeButton')\r\n\r\n            $videoWrap.height('auto');\r\n            $video.removeClass('stuck');\r\n            $closeButton.removeClass('closeShowing');\r\n            $closeButton.addClass('closeHidden');\r\n\r\n            hasBeenClosed = true;\r\n            player1.pause();\r\n            videojs('video1', { inactivityTimeout: 0 });\r\n            player1.bigPlayButton.show();\r\n\r\n        }\r\n    \r\njQuery(document).ready(function($) {\r\n    \r\n    jQuery(\"#closeButton\").hide();\r\n    var $window = jQuery(window);\r\n    var $videoWrap = jQuery('.video-wrap');\r\n    var $video = jQuery('.video');\r\n    var videoHeight = $video.outerHeight();\r\n    var $closeButton = jQuery('.closeButton')\r\n\r\n    $window.on('scroll',  function() {\r\n        var windowScrollTop = $window.scrollTop();\r\n        var videoBottom = videoHeight + $videoWrap.offset().top;\r\n\r\n        if ( (windowScrollTop > videoBottom) && !hasBeenClosed ) {\r\n            $videoWrap.height(videoHeight);\r\n            $video.addClass('stuck');\r\n            \/\/$closeButton.removeClass('closeHidden');\r\n            \/\/$closeButton.removeClass('closeHidden');\r\n            \/\/$closeButton.addClass('closeShowing');\r\n            \/\/$closeButton.display('block');                            \r\n            jQuery(\"#closeButton\").show();\r\n        } else {\r\n            $videoWrap.height('auto');\r\n            $video.removeClass('stuck');\r\n            jQuery(\"#closeButton\").hide();\r\n        }\r\n\r\n        \/\/console.log(\"videoHeight: \" + videoHeight + \", windowScrollTop: \" + windowScrollTop + \", videoBottom: \" + videoBottom);\r\n\r\n    });\r\n\r\n\/\/hideWatermarkOnLoad1();\r\n    \/\/alert(jQuery(window).width() + \", \" + jQuery(window).height());\r\n    div = document.getElementsByClassName(\"vjs-watermark\")[1-1];\r\n    if (div) {\r\n        \/\/div.style.display = \"none\";\r\n    }\r\n\r\n        \r\n        if(jQuery(window).width() >= 500) {\r\n            var skipBehindButton1 = player1.controlBar.addChild(\"button\", {}, 2);\r\n            var skipBehindButtonDom1 = skipBehindButton1.el();\r\n            skipBehindButtonDom1.innerHTML = \"<<\";\r\n            skipBehindButtonDom1.title = \"Rewind 15 Seconds\";\r\n            skipBehindButton1.addClass(\"buttonClass\");\r\n            skipBehindButtonDom1.onclick = function(){\r\n                skipS3MV1(-15);\r\n            }  \r\n\r\n            var skipAheadButton1 = player1.controlBar.addChild(\"button\", {}, 3);\r\n            var skipAheadButtonDom1 = skipAheadButton1.el();\r\n            skipAheadButtonDom1.innerHTML = \">>\";\r\n            skipAheadButtonDom1.title = \"Fast-Forward 15 Seconds\";\r\n            skipAheadButton1.addClass(\"buttonClass\");\r\n            skipAheadButtonDom1.onclick = function() {\r\n                skipS3MV1(15);\r\n            }  \r\n        }\r\n    \r\n        \r\n}); \/\/End jQuery(document).ready\r\n    \r\n\r\nfunction skipS3MV1(skipBy) {\r\n    player1.currentTime(player1.currentTime() + skipBy);\r\n}\r\n\r\n\r\nfunction getDomainName(hostName) {\r\n    return hostName.substring(hostName.lastIndexOf(\".\", hostName.lastIndexOf(\".\") - 1) + 1);\r\n}\r\n\r\n    \r\nfunction unmuteAndPlayFromStart2() {\r\n    var player1;\r\n    if(player1 == null) {\r\n        player1 = videojs(\"video1\");\r\n    }\r\n\r\n    if( (player1.muted()) && (timesMuted == 1) ) {\r\n        player1.watermark({\r\n          file: '',\r\n          xpos: 1,\r\n          ypos: 0,\r\n          xrepeat: 0,\r\n          opacity: 0,\r\n          url: '',\r\n          clickable: false,\r\n          text: false,\r\n          textContent: '',\r\n          fontSize: 0,\r\n          fontColor: '',\r\n          fontBGColor: ''\r\n        });    \r\n\r\n                player1.currentTime(0);\r\n        player1.muted(false);\r\n        player1.play();\r\n    }\r\n    timesMuted++;\r\n}\r\n\r\n\r\nfunction unmuteAndPlayFromStart1(player1) {\r\n    \/\/var player1;\r\n    if(player1 == null) {\r\n        player1 = videojs(\"video1\");\r\n    }\r\n    \/\/alert(timesMuted);\r\n        player1.currentTime(0);\r\n    player1.muted(false);\r\n    player1.play();\r\n}\r\n\r\n    \r\nfunction roundUpToAny(n,x=15) {\r\n    return Math.round((n+x\/2)\/x)*x;\r\n}\r\n            \r\n    \r\nvideojs(\"video1\").ready(function() {\r\n    \/\/console.log(\"Videojs Ready - should be called only once\");\r\n\tvar player1 = videojs(\"video1\");\r\n    var userIdAnon = 0;\r\n    var videoId = 78;\r\n    var anonTracking = \"N\";\r\n    var captions = localStorage.getItem('captions');\r\n    \/\/console.log(\"captions on load: \" + captions);\r\n    \r\n    if(captions === null) captions = \"on\";\r\n    \r\n    \r\n    var preferredLang = localStorage.getItem('caption-language');\r\n    let tracks = player1.textTracks();\r\n    var trackList = Array.prototype.slice.call(tracks);\r\n    var activeTrack = Array.from(tracks).find(track => track.mode === 'showing');\r\n    \/\/localStorage.setItem('caption-language', activeTrack.language);  \r\n    \/\/console.log(\"currently active language: \" + activeTrack.language);\r\n    \/\/console.log(\"preferredLang on load: \" + preferredLang);\r\n    var preferredLangIsSet = false;\r\n    \r\n    \/\/tracks.addEventListener('change', storeLanguageChoice);\r\n    \/\/var initialTrackLanguageChange = true;\r\n    \r\n    \/\/var videoEl1 = player1.el();\r\n\r\n    \r\n    var savedSpeed = localStorage.getItem('videoSpeed');\r\n    \/\/console.log(\"savedSpeed on load: \" + savedSpeed);\r\n    \r\n    if (savedSpeed) {\r\n        this.playbackRate(savedSpeed);\r\n    }\r\n    \r\n    \r\n    \/\/activeTrack = Array.from(tracks).find(track => track.mode === 'showing');\r\n    \/\/console.log(\"currently active language: \" + activeTrack.language);\r\n    \r\n    function setupTextTracks() {\r\n        \/\/console.log(\"in setupTextTracks\");\r\n        \/\/ If preferredLang found, get track and enable it\r\n        if( preferredLang && (captions === \"on\") ) {\r\n            \/\/console.log(\"preferredLang is set: \" + preferredLang);\r\n            tracks = player1.textTracks();\r\n            \/\/var targetTrack = Array.from(tracks).find(track => track.language === preferredLang);\r\n            \r\n            \/\/console.log(\"targetTrack mode: \" + targetTrack.mode);\r\n            \r\n            for (var i = 0; i < tracks.length; i++) {\r\n                var track = tracks[i];\r\n\r\n                \/\/ Check if the track is a captions track and if the language is German ('de')\r\n                if (track.kind === 'captions' && track.language === preferredLang) {\r\n                    \/\/console.log(\"Yes, match found\");\r\n                    track.mode = 'showing'; \/\/ Show the German captions\r\n                } else {\r\n                    track.mode = 'disabled'; \/\/ Hide other caption tracks\r\n                }\r\n            }\r\n            \r\n            preferredLangIsSet = true;\r\n        } \r\n    }\r\n    \r\n    \r\n    \/\/Can be moved to end??\r\n    \/\/Remembering Captions Settings on User Change\r\n    player1.textTracks().addEventListener('change', function() {\r\n        \/\/console.log(\"User changed captions settings\");\r\n\r\n        var tracks = player1.textTracks(); \r\n        \r\n        \/\/ Convert to array\r\n        var trackList = Array.prototype.slice.call(tracks);\r\n\r\n        \/\/ Check if captions are disabled \r\n        \/\/ I.e. no tracks in 'showing' mode\r\n        var disabled = !trackList.some(function(track) {\r\n            return track.mode === 'showing';  \r\n        });\r\n\r\n        if(disabled) {\r\n            \/\/ Captions were just set to off \r\n            localStorage.setItem('captions', 'off');\r\n            \/\/console.log('Captions disabled');\r\n        } else {\r\n            localStorage.setItem('captions', 'on');\r\n            \/\/console.log('Captions ENABLED');\r\n        }\r\n        \r\n        \r\n        if( captions === \"on\" ) {\r\n            trackList = Array.prototype.slice.call(tracks);\r\n            activeTrack = Array.from(tracks).find(track => track.mode === 'showing');\r\n            \/\/console.log(\"in User changed captions settings: active language: \" + activeTrack.language);\r\n            localStorage.setItem('caption-language', activeTrack.language);  \r\n        }\r\n\r\n    });\r\n    \r\n        \r\n    timesMuted = 0;\r\n    var button = document.createElement(\"button\");\r\n    button.setAttribute(\"id\", \"muteButton\");\r\n    var buttonRemoved = false;\r\n    var endTime = 0;\r\n\tvar restartedOnce = false;\r\n    \r\n    \/\/Disable full screen zand remove full screen on double click\r\n        \r\n\tthis.on('volumechange', function(){\r\n\t\ttimesMuted++;\r\n        \/\/alert(\"volume change \" + timesMuted);\r\n        if( !buttonRemoved && (timesMuted == 10000) ) {\r\n\t\t   \t\/\/alert(\"inside\");\r\n\t\t\tvideo1.removeChild(button);\r\n\t\t\t\/\/document.getElementById(\"muteButton\").remove();\r\n\t\t\tbuttonRemoved = true;\r\n\t\t   \tif(restartedOnce == false) {\r\n\t\t\t\tunmuteAndPlayFromStart1(player1);\r\n\t\t\t\trestartedOnce = true;\r\n\t\t\t}\r\n        }        \r\n    });\r\n    \r\n        \r\n    \r\n\r\n    \r\n    this.on('click', function(evt) {\r\n        \/\/console.log(\"video clicked, \" + evt.target.tagName);\r\n        if (evt.target.tagName === 'VIDEO') {\r\n            \/\/alert(\"after click unmuteAndPlayFromStart1(player1)\");\r\n            \/\/document.getElementsByTagName.removeChild(button);\r\n            if(!buttonRemoved) {\r\n                if(document.getElementById(\"muteButton\")) {\r\n                    document.getElementById(\"muteButton\").remove();\r\n                    buttonRemoved = true;\r\n                    if(restartedOnce == false) {\r\n\t\t\t\t\t\tunmuteAndPlayFromStart1(player1);\r\n\t\t\t\t\t\trestartedOnce = true;\r\n\t\t\t\t\t}\r\n                }\r\n            }\r\n        }\r\n        \r\n        \r\n    });\r\n    \r\n    this.on('pause', function() {\r\n        div = document.getElementsByClassName(\"vjs-watermark\")[1-1];\r\n        if (div) {\r\n            div.style.display = \"none\";\r\n        }\r\n        jQuery('#video1 .vjs-big-play-button').css('display', 'block');\r\n    });\r\n    \r\n        \r\n\tvar threshold1 = 15;\r\n\tvar counter1 = threshold1;\r\n    var duration1 = 609;\r\n    \r\n    \/\/Track loading time\r\n    \/\/console.log(\"ping 1: trackLoads\");\r\n\tvar data = {\r\n\t\t'action': 'trackLoads',\r\n\t\t'videoId': 78,\r\n\t\t'playTime': 0,\r\n        'event': 'load',\r\n        'postId': 10009\t};\r\n    \r\n\tjQuery.post(ajaxurl, data, function(response) { });\r\n    \r\n    st1 = -1;\r\n    et1 = 99999;\r\n    \/\/alert(\"st1: \" + st1 + \", et1: \" + et1);\r\n    playTime1 = 0;\r\n    playTimeCurrent1 = 0;\r\n    \r\n    if( (userIdAnon == 0) && (anonTracking == \"Y\") && (videoId == getCookie(\"videoIdAnon\")) ) {\r\n        playTimeAnon = getCookie(\"playTimeAnon\");\r\n        \/\/console.log(\"playTimeAnon from getCookie: \" + playTimeAnon); \r\n        \/\/console.log(\"videoId: \" + videoId);\r\n        playTimeCurrent1 = playTimeAnon;\r\n    }\r\n    \r\n    \/\/console.log(\"playTime1: \" + playTime1);\r\n    \/\/console.log(\"playTimeCurrent1: \" + playTimeCurrent1);\r\n    \r\n    \/\/console.log(parseInt(st1));\r\n    if(parseInt(st1) >= 0 ) {\r\n        playTimeCurrent1 = parseInt(st1);\r\n    }\r\n    this.currentTime(playTimeCurrent1);\r\n    if( (this.currentTime() + threshold1) > counter1 ) {\r\n        \/\/console.log(\"this.currentTime: \" + this.currentTime() + \", counter1: \" + counter1);\r\n        \/\/counter1 = this.currentTime() + threshold1;\r\n        counter1 = this.currentTime();\r\n        \/\/console.log(\"new this.currentTime: \" + this.currentTime() + \", counter1: \" + counter1);\r\n    }\r\n    \/\/console.log(\"playTime: \" + playTime);\r\n\tvar gotDuration1 = false;\r\n    \r\n    player1.ready(function(){\r\n        this.on('loadedmetadata', function(){ \r\n            \/\/console.log(\"this.duration: \" + this.duration());\r\n            duration1 = this.duration();\r\n            \/\/if (this.currentTime() <= duration1 -1)\r\n        })\r\n    });\r\n\r\n    this.on(\"seeked\", function(){\r\n        \/\/console.log(\"seeked: ------------------------Seeking\");\r\n        \r\n        cuepoint = 0;\r\n                \r\n        \r\n        ct = this.currentTime();\r\n        roundUpHowMuch = 1;\r\n        roundUp = roundUpToAny(ct,roundUpHowMuch);\r\n        \/\/diff = roundUp - counter1;\r\n        diff = ct - playTimeCurrent1;\r\n        diffRoundup = roundUpToAny(diff,roundUpHowMuch) - 30;\r\n        \/\/playTime1 = diffRoundup;\r\n        \/\/console.log(\"playTimeCurrent1: \" + playTimeCurrent1 + \", ct: \" + ct + \", roundUp: \" + roundUp + \", diff: \" + diff + \", diffRoundup: \" + diffRoundup);\r\n        \/\/console.log(\"seeked: currentTime \" + ct + \", old counter1: \" + counter1 + \", roundUp: \" + roundUp + \", diff: \" + diff);\r\n        counter1 = roundUp;\r\n        \/\/console.log(\"New counter1: \" + counter1);\r\n        \r\n        if( (diffRoundup > roundUpHowMuch) || (diffRoundup < -roundUpHowMuch) ) {\r\n            \/\/console.log(\"seeked: Yes, diff > roundUpHowMuch or < -roundUpHowMuch: \" + diffRoundup);\r\n            \/\/console.log(\"ping 2: seeked\");\r\n            var data = {\r\n                'action': 'trackViews',\r\n                'playTime': this.currentTime(),\r\n                'videoId': 78,\r\n                'duration': this.duration(),\r\n                'threshold': threshold1,\r\n                'event': 'seek',\r\n                'diff': diffRoundup,\r\n                'postId': 10009            };\r\n            jQuery.post(ajaxurl, data, function(response) { });\r\n        }\r\n        \r\n        playTimeCurrent1 = this.currentTime();\r\n        \/\/console.log(\"playTimeCurrent1: \" + playTimeCurrent1);\r\n\r\n        \/\/if(ct > roundUp) {\r\n            \/\/console.log(\"DO SOMETHING IMPORTANT HERE!!!!!!!!\");\r\n        \/\/}\r\n    });\r\n    \r\n    this.on(\"timeupdate\", function(){\r\n        \/\/console.log(\"in timeupdate\");\r\n        if (this.currentTime() >= et1) {\r\n            this.pause();\r\n        }\r\n        \r\n        \/\/if( (this.currentTime() + threshold1) > counter1 ) {\r\n            \/\/counter1 = this.currentTime() + threshold1;\r\n            \/\/console.log(\"this.currentTime: \" + this.currentTime() + \", counter1: \" + counter1);\r\n        \/\/}\r\n        \r\n        \/**\r\n        if (this.currentTime() <= duration1 -1) {\r\n            \/\/alert(\"here\");\r\n            playTime1 = 0;\r\n            playTimeCurrent1 = 0;\r\n        } else {\r\n            playTime1 = this.currentTime();\r\n            playTimeCurrent1 = this.currentTime();\r\n        }\r\n        \r\n        if( (this.currentTime() + threshold1) < counter1 ) {\r\n            console.log(\"this.currentTime: \" + this.currentTime() + \", counter1: \" + counter1);\r\n            counter1 = this.currentTime() + threshold1;\r\n            console.log(\"new this.currentTime: \" + this.currentTime() + \", counter1: \" + counter1);\r\n        }\r\n        *\/\r\n\t\t\r\n        \/\/console.log(\"timeupdate: ---> this.currentTime: \" + this.currentTime() + \", counter1: \" + counter1);\r\n        \r\n        if (this.currentTime() >= counter1) {\r\n            \/\/console.log(\"timeupdate: currentTime() >= counter1\");\r\n\r\n\t\t\t\/\/set a timer for threshold seconds\r\n            \/\/console.log(\"this.currentTime: \" + this.currentTime() + \", counter1: \" + counter1 + \", threshold1: \" + threshold1);\r\n\t\t\tsetInterval(function() {\r\n\t\t\t\t\/\/do nothing\r\n\t\t\t}, threshold1 * 1000);\r\n\t\t\t\/\/alert (counter1 + \" seconds up\");\r\n\t\t\t\r\n\t\t\tcounter1 += threshold1;\r\n\r\n\t\t\tif(!gotDuration1) {\r\n\t\t\t\tduration1 = this.duration();\r\n\t\t\t\tgotDuration1 = true;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t\/\/Track play time\r\n            if( !this.paused() ) {\r\n                \/\/console.log(\"ping 3: timeupdate\");\r\n                var data = {\r\n                    'action': 'trackViews',\r\n                    'playTime': this.currentTime(),\r\n                    'videoId': 78,\r\n                    'duration': this.duration(),\r\n                    'threshold': threshold1,\r\n                    'event': 'play',\r\n                    'postId': 10009                };\r\n                jQuery.post(ajaxurl, data, function(response) { });\r\n                \r\n                if(userIdAnon == 0) { \/\/Anonymous user\r\n                    \/\/setCookie(\"userIdAnon\", \"0\", 30);\r\n                    setCookie(\"videoIdAnon\", \"78\", 30);\r\n                    setCookie(\"playTimeAnon\", this.currentTime(), 30);\r\n                    \/\/console.log(\"playTimeAnon: \" + this.currentTime());\r\n                }\r\n            }\r\n\r\n\t\t}\r\n        \r\n\t});\r\n\t\r\n    this.on(\"play\", function(){\r\n        \/\/this.playbackRate(1.5);\r\n        \/**\r\n        if(this.currentTime() < playTimeCurrent1) {\r\n            console.log(\"play: this.currentTime() < playTimeCurrent1\");\r\n            if(this.currentTime() < this.duration()) {\r\n                this.currentTime(playTimeCurrent1);\r\n            } else {\r\n                this.currentTime(0);\r\n            }\r\n            \/\/alert(this.currentTime() + \", \" + playTime);\r\n        }\r\n        *\/\r\n        \r\n                \r\n        \/**\r\n        var data = {\r\n            'action': 'trackLoads',\r\n            'videoId': 78,\r\n            'playTime': 0,\r\n            'event': 'start',\r\n            'postId': 10009        };\r\n    \r\n\t    jQuery.post(ajaxurl, data, function(response) { });        \r\n        \r\n        *\/\r\n        \r\n        jQuery('#video1 .vjs-big-play-button').css('display', 'none');\r\n        \r\n                    div = document.getElementsByClassName(\"vjs-watermark\")[1-1];\r\n            if (div) {\r\n                div.style.display = \"block\";\r\n            }\r\n                    });\r\n\r\n    \r\n    this.on(\"fullscreenchange\", function(){\r\n\t\tjQuery('.vjs-loading-spinner').remove();\r\n\t\tthis.loadingSpinner.hide();\r\n\t});\r\n\t\r\n    this.on('ended', function() {\r\n        \/\/console.log(\"ping 4: ended\");\r\n        var data = {\r\n\t\t\t'action': 'trackViews',\r\n\t\t\t'playTime': this.currentTime(),\r\n\t\t\t'videoId': 78,\r\n            'duration': this.duration(),\r\n            'threshold': threshold1,\r\n            'event': 'end',\r\n            'postId': 10009\t\t};\r\n        \/\/this.currentTime(st);\r\n        \/\/alert(\"starting time: \" + st);\r\n\t\tjQuery.post(ajaxurl, data, function(response) { });\r\n        \/\/console.log('ended: ' + this.duration());\r\n        \r\n        endTime1 = this.currentTime();\r\n\t\t\/\/Track play time\r\n\t\t\/\/console.log(\"event: end firing\");\r\n        counter1 = st1;\r\n        playTime1 = 0;\r\n        playTimeCurrent1 = 0;\r\n        this.currentTime(0);\r\n        threshold1 = 15;\r\n        \/\/console.log(\"ended: ping 2\");\r\n        \r\n  \t});\r\n    \r\n    \r\n    this.on('ratechange', function() {\r\n        var currentSpeed = this.playbackRate();\r\n        \/\/console.log(\"currentSpeed: \" + currentSpeed);\r\n        localStorage.setItem('videoSpeed', currentSpeed);\r\n    });\r\n    \r\n    \r\n        \r\n    \r\n        \r\n        \r\n    \r\n    \r\n    jQuery.fn.isInViewport = function() {\r\n        var elementTop = jQuery(this).offset().top;\r\n        var elementBottom = elementTop + jQuery(this).outerHeight();\r\n\r\n        var viewportTop = jQuery(window).scrollTop();\r\n        var viewportBottom = viewportTop + jQuery(window).height();\r\n\r\n        return elementBottom > viewportTop && elementTop < viewportBottom;\r\n    };\r\n    \r\n    \r\n    \r\n    \r\n        \r\nsetupTextTracks();\r\n    \r\n}); \/\/End videojs player ready\r\n\r\nvar promise;\r\n    \r\n\/\/localStorage.removeItem('captions');\r\n\/\/delete localStorage.captions;\r\n\/\/localStorage.clear();\r\n    \r\n\/* ]]> *\/\r\n<\/script>\r\n\r\n\r\n\r\n\r\n\n<\/div>\n<div style=\"position: relative; top: 20px;\">\n<h4><b>Keep Yourself Sane<\/b><\/h4>\n<h4><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-9995 alignright\" style=\"font-size: 16px;\" src=\"https:\/\/www.theartofretouching.com\/blog\/wp-content\/uploads\/2020\/08\/Insane-252x168.jpg\" alt=\"Keep Yourself Sane\" width=\"325\" height=\"214\" \/><\/h4>\n<p>After a long day of working for paying clients, and putting my son to bed, I need to suck it up and go back to work. I don\u2019t get up as early as my wife and son do, but still, it\u2019s been a very long day. Holidays and weekends, I am still sitting here late at night working for either my clients, or myself. But in either case, I am still staring at the same screen working on the same basic type of jobs.<\/p>\n<p>You know what gets me through these long nights? I try to remember that I usually get to roll out of bed around 10am. I get to casually eat my breakfast while I watch some television show that I downloaded. Throughout the next few hours I pay my bills, answer random emails, and I often go for walks in the park with my wife and dog. So I will deal with the long nights because my days are usually my own. I have been living like this for more than a decade.<\/p>\n<p>The debate has come up about shifting my hours. Get up at 7am instead of 10am because that means I can go to bed at 11pm instead of 2am. In concept this works, it\u2019s the same hours right? The problem is the clients. If I get up that early, I am more likely to answer all of their emails or phone calls about their emergencies.<\/p>\n<p>I try to run my business by a simple principle. \u201cAn emergency on your part, does not necessitate an emergency on my part\u201d. Therefore, if they need to wait an hour or two for a response, the odds are pretty good they will solve the problem without me. That doesn\u2019t mean I like to do it, but if you train your clients that you don\u2019t get to your desk until 10:30am, in the long term they won\u2019t expect you before 10:30am. If something is still outstanding by that point, then they will get my undivided attention until the crisis is averted.<\/p>\n<p>Just remember that if you have multiple clients, then 5 emergencies will fill up every work-week\u2019s morning if you let it. It\u2019s about control. Not of their business, but yours. As a freelancer, you need to make your own hours. If you work, you eat. If you ignore your clients, they will leave. The better plan is to manage them into a planned schedule. I require 24 hours notice for nearly all my work. I don\u2019t move until it\u2019s been planned ahead of time. While there are always exceptions, you are in control because you are not an employee. Your time is not their time. If you don\u2019t understand this, you will be run into the ground with two or more regular clients.<\/p>\n<p>Consider who suffers if you leave the clients in control. You? Nope, you\u2019re a work-a-holic, and you don\u2019t care how long you sit there. The ones who suffer are your wife, children and pets. You care about the other people in your life don\u2019t you? Why, just yesterday I planned to stop working at 3:20pm and take my dog for a walk before picking up my son at 4pm. I never do this. But, just like this article, because I \u201cscheduled\u201d it into my day, I made it happen. The dog was happy, my son was happy, and I was happy\u2026 Now you are happy too.<\/p>\n<p>So, without dragging this on forever (you can tell I am passionate about this topic, right?), let\u2019s move onto the actual article.<\/p>\n<p>&nbsp;<\/p>\n<h4><b>Model Mayhem VIP<\/b><\/h4>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-10015 alignright\" src=\"https:\/\/www.theartofretouching.com\/blog\/wp-content\/uploads\/2020\/09\/Model-Mayhem-224x168.jpg\" alt=\"Model Mayhem VIP\" width=\"325\" height=\"214\" \/><\/p>\n<p>I used to have the free membership, and nothing special came from it. I wanted the extra image gallery from the $36\/yr membership, but once again, nothing special came from it. It wasn\u2019t until I signed up with the $10\/mo VIP membership that things actually started happening.<\/p>\n<p>Nearly every day, as part of my self-employment strategies, I was receiving emails and phone calls asking me about my services as a retoucher. I mean, multiple times per day. I was floored, and needed to find out more. After some digging round, I realized that I was able to be found by doing a general Global Search, and I was #4 on the list. Please understand, that is worldwide. There weren\u2019t many other people paying for this service, so only a few of us were at the top of the list. And obviously (no pat on the back intended), my work was better than anyone else in the top 10. Am I biased, maybe, but that didn\u2019t stop the emails and phone calls.<\/p>\n<p>While my cost seemed to be an issue for many of the photographers, I know that when I find the ones that are willing to pay for the quality, then my price will be met, and I won\u2019t have to back track and bid against myself. Once again, I am happy, and they are happy.<\/p>\n<p>&nbsp;<\/p>\n<h4><b>Treat Everyone Like a New Client<\/b><\/h4>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-10016 alignright\" src=\"https:\/\/www.theartofretouching.com\/blog\/wp-content\/uploads\/2020\/09\/New-Client-252x168.jpg\" alt=\"Treat Everyone Like a New Client\" width=\"325\" height=\"214\" \/><\/p>\n<p>When I was young, I would go to work loud and obnoxious. I would not think I was acting that way, but I likely was. As I became older, I found I had an easier time interacting with co-workers by simply treating them with some respect, and catering to their personal needs as quickly as possible. However, as a freelancer for over a decade, I found that most of my interactions with people were either personal (and I acted like the introvert that I was), or professional (and I catered to their every need).<\/p>\n<p>Recently, I found myself in a freelance corporate environment at the WWE, World Wrestling Entertainment, and I went out of my way to talk with my new co-workers. It was tough, because I prefer being alone (my wife says I am a freelancer because I don&#8217;t work well with others). But once I considered every person I met to be a new client (even though I knew they were not), I was simply amazed at the results.<\/p>\n<p>After 2 weeks of treating everyone I met with the same professional attitude that I treated the people that hired me, I found myself being invited into private gatherings, given private tours, and being treated exactly the way I had wanted to be treated my whole life. All it took was talking slowly to choose my words, asking people about the topics they found interesting, and sharing a little about myself with an interesting story or two. That was it, no secret formula. Damn, wish I figured it out in High School.<\/p>\n<p>I wasn&#8217;t being fake, I was just intentionally being friendly. I went out of my way to greet people at their cubicle, have a small chat, then go back to my desk. As an introvert, it was difficult, but I was sure to inject that fact about myself into conversation. I told them I am not trying to be rude, I just don&#8217;t have much to say. You know what? They all seemed to understand and accept it.<\/p>\n<p>On my last day, several said they hoped that upper management would hire me full time because I fit right in, and was an asset to the company. Clearly they have mistaken me for someone else. <\/p>\n<p>And yet, all it took was some effort on my part. Granted, I have many years of client based experience and new students come into my classroom all the time. So, yes, I have worked out some of my introvert issues. However, every conversation was still a minor struggle just because I&#8217;m happier with the least amount of interaction possible. But, it was crystal clear that once I treated each new person like a possible client, everything was so much easier with my time there.<\/p>\n<p>This reflects my time as a 24 year old at Marvel Comics. Even two decades later, I can reflect and say that I made an effort to get to know the right people. While it was my own choice to leave, the key take-away is that I played the game, and became well known around the office. I made my money before I left. I\u2019ve never regretted the decision. Some companies are just not right for you.<\/p>\n<p>&nbsp;<\/p>\n<h4><b>Provide the Right Vision (Their&#8217;s, Not Yours)<\/b><\/h4>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-10014 alignright\" src=\"https:\/\/www.theartofretouching.com\/blog\/wp-content\/uploads\/2020\/09\/Vision-252x168.jpg\" alt=\"Provide the Right Vision\" width=\"325\" height=\"214\" \/><\/p>\n<p>Nobody likes an overly melodramatic photo. When your images have been pushed to the point of being exaggerated, overdone, or completely over the top, then people notice. If you are a photographer, then this is often a good thing. It&#8217;s a way to define your own personal style. However, if you are the retoucher, then this is often the last thing you want to do.<\/p>\n<p>Think about it. Who wants to hire someone who&#8217;s retouching style will overshadow their own? Paul? Are you still listening? Too many large animations. Unless you\u2019re directed to make specific changes, your goal as a retoucher should be to make the images as natural as physically possible. The removal of obvious flaws or mistakes is fine. But it&#8217;s when you go overboard and start changing the core appearance of the subject that usually becomes a problem. My own rule of thumb is, how will their face look in a month. If that blemish is gone, remove it. If that birthmark is still there, then keep it on. I just want to make them look like it was their best day.<\/p>\n<p>I am not trying to neuter your skills. The retoucher is still an artist. You are being paid to address the subtle details. Conveying emotions that are often the most important in an image. You should be taking notice of them, and I want you to. Enhance the twinkle in a model&#8217;s eyes, the laughter in your subject, and the tones of your overall photo. The audience should be able to feel what the subject of the photo is feeling. But what I am saying, is that you can&#8217;t go changing things just for change&#8217;s sake. If it&#8217;s your image, do what you want. But if it&#8217;s someone else&#8217;s work, you need to respect that you are being paid to provide their vision, not your own.<\/p>\n<p>If you are able to respect the boundaries between you and the client, then you will be hired again. If you think your work is better than theirs (it may be, it doesn&#8217;t matter), you still need to intentionally keep control of every alteration.<\/p>\n<p>Photographers are not sitting around thinking &#8220;I sure hope I find a good retoucher today. I should go look for one.&#8221; While it&#8217;s possible they may be thinking about how their own retouching is mediocre, rarely are they going to go out and find a solution. Rather it&#8217;s your job to find the clients who have a specific problem, and convince them that <b>YOU<\/b> are the solution. So always do your best and put in some extra effort for your clients. This will prove invaluable when the time comes.<\/p>\n<p>Successful freelancers take action. They don&#8217;t sit around and wait. *I* certainly don&#8217;t sit around and wait. Whenever I happen to find a quiet period in my schedule, first I try and fill it with smaller, personal projects. For example, this article&#8217;s framework was laid out more than 5 years ago. I am just finally writing the words to it now. <\/p>\n<p>By Choice, this is the end of the video. I have a whole new part 3 on How to Succeed as a Freelancer coming up. Be sure Like this video, subscribe, and ring the bell notification. If you don;t ring the bell, then YouTube will not let you know when my new videos are released. They can be tricky like that. Thanks for watching.<\/p>\n<p>&#8230;<\/p>\n<p>Mastering client relationships, effective time management, and maintaining a professional approach are crucial Self-Employment Strategies for freelancing success. These real-world skills, explored beyond Photoshop, empower you to thrive as a freelancer. Stay tuned for more insights in Part 3 of the &#8216;How to Succeed as a Freelancer&#8217; series.<\/p>\n<\/div>\n<p>&nbsp;<\/p>\n<p><strong>Other Suggested Videos:<\/strong><\/p>\n<p><P><a href=\"https:\/\/www.theartofretouching.com\/blog\/freelancer-success-pt3\/\" title=\"How to Succeed as a Freelancer | Self Employment for Beginners\" target=\"_self\" rel=\"noopener\">How to Succeed as a Freelancer | Self Employment for Beginners<\/a><\/P><\/p>\n<p><a href=\"https:\/\/www.theartofretouching.com\/blog\/freelancer-success-1\/\" title=\"How to Succeed as a Freelancer | Freelancing Strategies\" target=\"_self\" rel=\"noopener\">How to Succeed as a Freelancer | Freelancing Strategies<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I&#8217;ll be talking about how to keep yourself sane throughout your retouching career beyond Photoshop and growing your portfolio. Because working from your home office and making money isn&#8217;t all about the basics of Photoshop, it&#8217;s about business. This video aims to teach you real-world skills on how to handle clients the right way and on how to make things happen as a successful freelancer.<\/p>\n","protected":false},"author":1816,"featured_media":10017,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_sitemap_exclude":false,"_sitemap_priority":"","_sitemap_frequency":"","_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","footnotes":""},"categories":[29],"tags":[1065,1067,1066,1023,648,1064,1063],"class_list":["post-10009","post","type-post","status-publish","format-standard","has-post-thumbnail","category-articles","tag-clients","tag-find-clients","tag-find-work","tag-freelance","tag-freelancer","tag-self-employed","tag-self-employment","entry","override"],"_links":{"self":[{"href":"https:\/\/www.theartofretouching.com\/blog\/wp-json\/wp\/v2\/posts\/10009","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.theartofretouching.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.theartofretouching.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.theartofretouching.com\/blog\/wp-json\/wp\/v2\/users\/1816"}],"replies":[{"embeddable":true,"href":"https:\/\/www.theartofretouching.com\/blog\/wp-json\/wp\/v2\/comments?post=10009"}],"version-history":[{"count":24,"href":"https:\/\/www.theartofretouching.com\/blog\/wp-json\/wp\/v2\/posts\/10009\/revisions"}],"predecessor-version":[{"id":11589,"href":"https:\/\/www.theartofretouching.com\/blog\/wp-json\/wp\/v2\/posts\/10009\/revisions\/11589"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.theartofretouching.com\/blog\/wp-json\/wp\/v2\/media\/10017"}],"wp:attachment":[{"href":"https:\/\/www.theartofretouching.com\/blog\/wp-json\/wp\/v2\/media?parent=10009"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.theartofretouching.com\/blog\/wp-json\/wp\/v2\/categories?post=10009"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.theartofretouching.com\/blog\/wp-json\/wp\/v2\/tags?post=10009"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}