#import #import int targetResolution = 1440; static NSString *getClosestQualityLabel(NSArray *formats) { int resolution = 0; int minDiff = INT_MAX; for (MLFormat *format in formats) { int height = [format height]; int diff = abs(height - targetResolution); if (diff < minDiff) { minDiff = diff; resolution = height; } } return [NSString stringWithFormat:@"%dp", resolution]; } static MLQuickMenuVideoQualitySettingFormatConstraint *getConstraint(NSString *qualityLabel) { MLQuickMenuVideoQualitySettingFormatConstraint *constraint; @try { constraint = [[%c(MLQuickMenuVideoQualitySettingFormatConstraint) alloc] initWithVideoQualitySetting:3 formatSelectionReason:2 qualityLabel:qualityLabel]; } @catch (id ex) { constraint = [[%c(MLQuickMenuVideoQualitySettingFormatConstraint) alloc] initWithVideoQualitySetting:3 formatSelectionReason:2 qualityLabel:qualityLabel resolutionCap:0]; } return constraint; } %hook YTSingleVideoController - (void)setInitialAudioAndVideoConstraints { %orig; NSString *qualityLabel = getClosestQualityLabel([self.playerItem selectableVideoFormats]); MLQuickMenuVideoQualitySettingFormatConstraint *constraint = getConstraint(qualityLabel); self.playerItem.videoFormatConstraint = constraint; } %end %hook YTQueuePlayerUtil + (void)setInitialFormatConstraintsOnPlayerItem:(MLHAMPlayerItem *)playerItem withMediaStickySettings:(MLPlayerStickySettings *)mediaStickySettings { %orig; NSString *qualityLabel = getClosestQualityLabel([playerItem selectableVideoFormats]); MLQuickMenuVideoQualitySettingFormatConstraint *constraint = getConstraint(qualityLabel); playerItem.videoFormatConstraint = constraint; } %end