- Phosphene एक menu bar app + wallpaper extension है जो उपयोगकर्ता की वीडियो फ़ाइलों को macOS डेस्कटॉप और लॉक स्क्रीन वॉलपेपर के रूप में चलाता है
- यह सिस्टम के डिफ़ॉल्ट वॉलपेपर चयनकर्ता में एकीकृत होता है, इसलिए जोड़े गए वीडियो System Settings → Wallpaper में Apple के बिल्ट-इन Aerials के साथ दिखाई देते हैं
- यह Apple के निजी WallpaperExtensionKit के ऊपर बनाया गया है, और Apple Aerials की तरह out-of-process playback, app बंद होने के बाद भी बने रहना, तथा lock screen·idle·sleep lifecycle integration प्रदान करता है
- यह MP4, MOV, और AVFoundation द्वारा पढ़ी जा सकने वाली फ़ाइलें इम्पोर्ट कर सकता है, और कई displays तथा प्रत्येक Space के लिए wallpaper selection को macOS सहेजता है
- loop boundary पर PTS/DTS को offset करके फ़्रेम-स्तर पर जोड़ने की विधि से, बिना flush या रुकावट के gapless looping लागू किया गया है
PlaybackPolicy lid state, battery level, battery/AC power, Game Mode, display mode, user pause, obscured state आदि को मिलाकर full / reduced / minimal / paused में से किसी एक के रूप में playback behavior तय करता है
- जब सभी displays पूरी तरह विंडो से ढक जाते हैं, तो यह rendering रोक देता है और डेस्कटॉप फिर से दिखने तक playback pause कर देता है
- वैकल्पिक रूप से कम resolution और कम fps वाले adaptive variants पहले से बनाए जा सकते हैं, और renderer हर loop boundary पर मौजूदा policy को संतुष्ट करने वाले सबसे सस्ते variant पर स्विच करता है
- Only on Lock Screen सेटिंग में, lock/unlock के समय cubic curve के साथ wallpaper स्वाभाविक रूप से दिखाई देता और गायब होता है, जिससे यह Apple Aerials के व्यवहार से मेल खाता है
- app पक्ष SwiftUI menu bar app है, जो video library, प्रति-वीडियो metadata, HEVC optimization, preferences, और library changes के लिए Darwin notification को संभालता है
- extension पक्ष सिस्टम
WallpaperAgent के अंदर चलता है, runtime पर WallpaperExtensionKit.framework लोड करता है और AVSampleBufferDisplayLayer के माध्यम से remote CAContext में फ़्रेम render करता है
- क्योंकि
AVPlayerLayer remote CAContext के अंदर चुपचाप fail हो जाता है, VideoRenderer सीधे AVAssetReader और AVSampleBufferDisplayLayer को चलाकर monotonically increasing timeline बनाए रखता है
- यह
WallpaperSnapshotXPC swizzle और Mirror-आधारित XPC parsing पर निर्भर करता है, इसलिए यदि Apple निजी types या field names बदलता है, तो snapshot और request handling वाला हिस्सा टूट सकता है
- आवश्यकताएँ हैं macOS Tahoe 26.0+, Apple Silicon, Xcode 17+, और
arm64-apple-macos26.0 को target करते हुए Swift 6 strict concurrency सक्षम है
- लाइसेंस MIT है, और इसमें स्पष्ट किया गया है कि इसे बिना किसी warranty के स्वतंत्र रूप से उपयोग किया जा सकता है
1 टिप्पणियां
Hacker News प्रतिक्रियाएँ
काफ़ी साफ़-सुथरा है। पहले मैं यह सोचकर उलझ गया था कि “वीडियो screensaver डाउनलोड किए जा सकते हैं, तो फिर frames क्यों scrape किए जा रहे हैं?” लेकिन टिप्पणियाँ पढ़कर समझ आया कि मैं अपने वीडियो को desktop और lock screen पर इस्तेमाल कर सकता हूँ
अगर शीर्षक में बात छिपाई न जाए और सीधे यह दिखे कि क्या और कैसे किया जा सकता है, तो वह काफ़ी बेहतर होगा
कुछ हद तक समझ आता है कि Tahoe को काफ़ी आलोचना क्यों मिल रही है, लेकिन वीडियो wallpapers और transparency effects में Windows Vista वाली feel है, जो मज़ेदार और nostalgic लगती है
अब Vista waterfall wallpaper लगाकर सचमुच 2007 जैसा महसूस करने का समय है
मैं सोच रहा हूँ कि किस waterfall की बात हो रही है। यह भी हैरानी की बात है कि Vista में इतने सारे wallpapers थे; मुझे तो बस वह default हरा gradient जैसा wallpaper और bamboo forest वाला, जिसे मैंने कुछ समय इस्तेमाल किया था, वही याद है
इसके लिए सच में धन्यवाद। मैं screensaver collection बना रहा था, लेकिन LegacyScreenSaver बहुत ही ढीला-ढाला था
मैं उम्मीद कर रहा था कि कोई Apple के private wallpaper framework को समझ निकालेगा, और वाकई किसी ने कर दिखाया
com.apple.wallpaperके extension को WallpaperAgent desktop पर चलाता हैscreensaver के लिए दूसरी पोस्ट देखी जा सकती है; वहाँ इसे bypass करने वाले private screensaver API के sample भी डाले गए हैं। Apple अपने “Aerials” में दोनों का इस्तेमाल करता है, और उसके पास screensaver player और desktop player के बीच position share करने वाला synchronization system भी है
मुझे लगता है Apple का सबसे बेहतरीन वीडियो wallpaper Macintosh है। यह कैसे काम करता है, यह जानना दिलचस्प होगा
कई जगह तारीख़ और समय system की तारीख़-समय से सेकंड तक मेल खाते हैं
वाह, यह सच में कमाल है। मैं private screensaver
.appexframework को reverse engineer करके उसे Aerial 4 में चलाने में सफल हुआ था, और जो लोग चाहें उनके लिए पिछले हफ़्ते v4 के साथ sample project और docs भी जारी किए थे: https://github.com/AerialScreensaver/AppexSaverMinimalWallpaper appex के साथ भी यही तरीका आज़माया था। reverse engineering खुद तो आसान लग रही थी, लेकिन WallpaperAgent उसे load करने से मना कर देता है, इसलिए अभी भी मैं वही पुरानी trick इस्तेमाल कर रहा हूँ जिसमें wallpaper के ऊपर और icons के नीचे अपनी window और video player दिखा देता हूँ। देखना पड़ेगा कि मुझसे क्या छूट रहा है
बहुत बढ़िया बना है। हाल ही में मैं भी इसी तरह के rabbit hole में गया था, Aerials catalog को reverse engineer किया और समझा कि Apple इसे कैसे जोड़ता है; इसलिए किसी और open source project को यह करते देखना अच्छा लग रहा है
सबसे पसंदीदा detail, जिसे हम अपने tool में दोहरा नहीं पाए, वह यह है कि login window और live desktop के बीच animation लगातार जारी रहती है। हमने इसी विचार का cross-platform implementation phonto में बनाया: https://github.com/museslabs/phonto. मैं पूरे reverse engineering process पर एक पोस्ट लिखने ही वाला था, और यह शायद शुरुआत करने का अच्छा बहाना बन जाए
यह देखकर Windows 98 में HTML page को wallpaper की तरह इस्तेमाल करने की बात याद आ गई। उस HTML में वीडियो भी डाला जा सकता था
वैसे भी Windows 98 का Active Desktop पहले से ही अस्थिर operating system का सबसे अस्थिर हिस्सा था। नया system install करते ही सबसे पहले उसे बंद करना पड़ता था, और तब भी वह गिर जाता था, लेकिन कम से कम सिर्फ़ मज़े के लिए नहीं गिरता था
अच्छा बना है, लेकिन README में demo video होती तो अच्छा रहता
अब app के लिए download link वाला landing page बन गया है, और वहाँ दूसरे projects भी देखे जा सकते हैं। सबसे बड़ा project Refrax browser है, और इसके अलावा कई छोटे utility apps भी हैं
https://kagerou.glass/phosphene/
https://kagerou.glass
यह भी जानना है कि design में किस चीज़ ने मदद की
सच में बहुत बढ़िया। इससे मुझे याद आया कि मैं पहले अपने पास मौजूद किसी वीडियो से custom video wallpaper सेट करके देखना चाहता था
इसे देखने से पहले मुझे पता भी नहीं था कि यह default रूप से supported नहीं है