תהליך העלאת פריטי מדיה מורכב משני שלבים:
- מעלים את הבייטים של קובצי המדיה לשרת Google באמצעות נקודת הקצה להעלאות. הפעולה הזו מחזירה אסימון העלאה שמזהה את הבייטים שהועלו.
- משתמשים בקריאה ב-batchCreate עם אסימון ההעלאה כדי ליצור פריט מדיה בחשבון Google Photos של המשתמש.
השלבים האלה מתארים את תהליך ההעלאה של פריט מדיה יחיד. אם אתם מעלים כמה פריטים של מדיה (סביר להניח שזה יקרה בכל אפליקציה שפועלת בסביבת הייצור), כדאי לעיין בשיטות המומלצות להעלאות כדי לשפר את היעילות של ההעלאות.
לפני שמתחילים
היקפי ההרשאות הנדרשים
כדי להעלות פריטי מדיה לספרייה או לאלבום של משתמש, נדרש ההיקף photoslibrary.appendonly
. מידע נוסף על היקפים זמין במאמר היקפי הרשאה.
סוגי הקבצים והגדלים הקבילים
אפשר להעלות את סוגי הקבצים שמפורטים בטבלה הזו.
סוג מדיה | סוגי קבצים קבילים | גודל קובץ מקסימלי |
---|---|---|
תמונות | AVIF, BMP, GIF, HEIC, ICO, JPG, PNG, TIFF, WEBP, קובצי RAW מסוימים. | 200 GB |
סרטונים | 3GP, 3G2, ASF, AVI, DIVX, M2T, M2TS, M4V, MKV, MMV, MOD, MOV, MP4, MPG, MTS, TOD, WMV. | 20 GB |
שלב 1: העלאת בייטים
העלאת בייטים ל-Google באמצעות בקשות העלאה. בקשת העלאה מוצלחת מחזירה טוקן העלאה בצורת מחרוזת טקסט גולמית. אפשר להשתמש באסימוני ההעלאה האלה כדי ליצור פריטי מדיה באמצעות הקריאה batchCreate
.
REST
כוללים את השדות הבאים בכותרת הבקשה POST:
שדות כותרת | |
---|---|
Content-type |
מגדירים את הערך application/octet-stream . |
X-Goog-Upload-Content-Type |
מומלץ. מגדירים את סוג ה-MIME של הבייטים שאתם מעלים.
סוגי MIME נפוצים כוללים את image/jpeg , image/png ו-image/gif .
|
X-Goog-Upload-Protocol |
מגדירים את הערך raw . |
זוהי כותרת של בקשת POST:
POST https://photoslibrary.googleapis.com/v1/uploads Authorization: Bearer oauth2-token Content-type: application/octet-stream X-Goog-Upload-Content-Type: mime-type X-Goog-Upload-Protocol: raw
בגוף הבקשה, כוללים את הקובץ הבינארי של הקובץ:
media-binary-data
אם בקשת ה-POST הזו תאושר, אסימון העלאה שיוחזר כגוף התגובה יהיה בצורת מחרוזת טקסט גולמית. כדי ליצור פריטים של מדיה, צריך להשתמש במחרוזות הטקסט האלה בקריאה ל-batchCreate
.
upload-token
גודל הקובץ המוצע לתמונות קטן מ-50MB. קבצים שגודלם עולה על 50MB עלולים לגרום לבעיות בביצועים.
Google Photos Library API תומך בהעלאות שניתן להמשיך. העלאה שניתן להמשיך מאפשרת לפצל קובץ מדיה למספר קטעים ולהעלות כל קטע בנפרד.
שלב 2: יצירת פריט מדיה
אחרי שמעלים את הבייטים של קובצי המדיה, אפשר ליצור אותם כפריטי מדיה ב-Google Photos באמצעות אסימוני העלאה. אסימון העלאה תקף ליום אחד אחרי שיוצרים אותו. פריט מדיה תמיד מתווסף לספרייה של המשתמש. אפשר להוסיף פריטים של מדיה לאלבומים שנוצרו על ידי האפליקציה שלכם בלבד. מידע נוסף זמין במאמר היקפי הרשאה.
כדי ליצור פריטי מדיה חדשים, צריך להפעיל את mediaItems.batchCreate
ולציין רשימה של newMediaItems
. כל newMediaItem
מכיל אסימון העלאה שצוין ב-simpleMediaItem
ותיאור אופציונלי שמוצג למשתמש.
שדה התיאור מוגבל ל-1,000 תווים, וצריך לכלול רק טקסט משמעותי שנוצר על ידי משתמשים. לדוגמה, הטיול שלנו בפארק או ארוחת חג. אל תכללו מטא-נתונים כמו שמות קבצים, תגים פרוגרמטיים או טקסט אחר שנוצר באופן אוטומטי.
כדי לשפר את הביצועים, מומלץ לצמצם את מספר הקריאות ל-mediaItems.batchCreate
שצריך לבצע על ידי הוספת כמה פריטי מדיה בקריאה אחת. תמיד צריך להמתין עד להשלמת הבקשה הקודמת לפני שמבצעים קריאה נוספת לאותו משתמש.
אפשר ליצור פריט מדיה אחד או כמה פריטי מדיה בספרייה של משתמש על ידי ציון התיאורים ואסימוני ההעלאה התואמים:
REST
זוהי כותרת בקשת ה-POST:
POST https://photoslibrary.googleapis.com/v1/mediaItems:batchCreate Content-type: application/json Authorization: Bearer oauth2-token
גוף הבקשה צריך לציין רשימה של newMediaItems
.
{ "newMediaItems": [ { "description": "item-description", "simpleMediaItem": { "fileName": "filename", "uploadToken": "upload-token" } } , ... ] }
אפשר גם לציין albumId
ו-albumPosition
כדי להוסיף קובצי מדיה למיקום ספציפי באלבום.
REST
{ "albumId": "album-id", "newMediaItems": [ { "description": "item-description", "simpleMediaItem": { "fileName": "filename", "uploadToken": "upload-token" } } , ... ], "albumPosition": { "position": "after-media-item", "relativeMediaItemId": "media-item-id" } }
פרטים נוספים על מיקום התמונות באלבומים זמינים במאמר הוספת תוכן נוסף.
תגובה ליצירת פריט
קריאה ל-mediaItems.batchCreate
מחזירה את התוצאה לכל פריט מדיה שניסיתם ליצור. הרשימה של newMediaItemResults
מציינת את הסטטוס וכוללת את uploadToken
של הבקשה. קוד סטטוס שאינו אפס מציין שגיאה.
REST
אם כל פריטי המדיה נוצרו בהצלחה, הבקשה תחזיר את סטטוס ה-HTTP 200 OK
. אם אי אפשר ליצור פריטי מדיה מסוימים, הבקשה תחזיר את הסטטוס 207 MULTI-STATUS
של HTTP כדי לציין שהפעולה הושלמה בהצלחה.
{ "newMediaItemResults": [ { "uploadToken": "upload-token", "status": { "message": "Success" }, "mediaItem": { "id": "media-item-id", "description": "item-description", "productUrl": "https://photos.google.com/photo/photo-path", "mimeType": "mime-type", "mediaMetadata": { "width": "media-width-in-px", "height": "media-height-in-px", "creationTime": "creation-time", "photo": {} }, "filename": "filename" } }, { "uploadToken": "upload-token", "status": { "code": 13, "message": "Internal error" } } ] }
אם הפריט נוסף בהצלחה, מוחזר mediaItem
שמכיל את הערכים של mediaItemId
, productUrl
ו-mediaMetadata
. מידע נוסף זמין במאמר גישה לפריטי מדיה.
אם פריט המדיה הוא סרטון, צריך לעבד אותו קודם. השדה mediaItem
מכיל status
בתוך mediaMetadata
שמתאר את מצב העיבוד של קובץ הסרטון. קובץ חדש שיועלה יחזיר קודם את הסטטוס PROCESSING
, לפני שהוא READY
לשימוש. לפרטים נוספים, ראו גישה לפריטי מדיה.
אם מופיעה שגיאה במהלך השיחה, פועלים לפי השיטות המומלצות ומנסים שוב לשלוח את הבקשה. כדאי לעקוב אחרי הוספות שבוצעו בהצלחה, כדי שאפשר יהיה להוסיף את התמונה לאלבום במיקום הנכון בבקשה הבאה. למידע נוסף, ראו יצירת אלבומים.
התוצאות תמיד מוחזרות באותו הסדר שבו הושלחו אסימוני ההעלאה.
שיטות מומלצות להעלאות
השיטות המומלצות והמקורות הבאים יעזרו לכם לשפר את היעילות הכוללת של ההעלאות:
- פועלים לפי השיטות המומלצות לניהול שגיאות וניסיון חוזר, תוך שמירה על הנקודות הבאות:
- שגיאות מסוג
429
יכולות להתרחש אם המכסה שלכם נוצלה או אם יש הגבלת קצב בגלל ביצוע יותר מדי קריאות במהירות גבוהה מדי. חשוב לוודא שלא קוראים לפונקציהbatchCreate
עבור אותו משתמש עד שהבקשה הקודמת הושלמה. - כשמתקבלות שגיאות מסוג
429
, צריך להמתין30s
שניות לפחות לפני שמנסים שוב. כשמנסים לשלוח שוב בקשות, כדאי להשתמש באסטרטגיה של השהיה מעריכית לפני ניסיון חוזר (exponential backoff). - שגיאות מסוג
500
מתרחשות כשהשרת נתקל בשגיאה. סביר להניח שהסיבה לכך היא ביצוע כמה קריאות כתיבה (למשל,batchCreate
) לאותו משתמש בו-זמנית. צריך לבדוק את פרטי הבקשה ולא לבצע קריאות ל-batchCreate
במקביל.
- שגיאות מסוג
- כדאי להשתמש בתהליך ההעלאה שניתן להמשיך כדי לשפר את העמידות של ההעלאות במקרה של שיבושים ברשת, וכך לצמצם את השימוש ברוחב הפס על ידי האפשרות להמשיך העלאות שהושלמו חלקית. חשוב להשתמש בהגדרה הזו כשאתם מעלים קבצים גדולים או מעלים קבצים ממכשירים ניידים של לקוחות.
בנוסף, כדאי ליישם את הטיפים הבאים בכל שלב בתהליך ההעלאה: העלאת בייטים ולאחר מכן יצירת פריטי מדיה.
העלאת בייטים
- אפשר להעלות בייטים (כדי לאחזר אסימוני העלאה) במקביל.
- צריך להגדיר תמיד את סוג ה-MIME הנכון בכותרת
X-Goog-Upload-Content-Type
בכל קריאת העלאה.
יצירת פריטים של מדיה
אין לבצע שיחות במקביל ל-
batchCreate
עבור משתמש יחיד.- לכל משתמש, מבצעים קריאות ל-
batchCreate
ברצף. - אם יש כמה משתמשים, תמיד צריך לבצע קריאות ל-
batchCreate
לכל משתמש בנפרד. לבצע במקביל רק שיחות עבור משתמשים שונים.
- לכל משתמש, מבצעים קריאות ל-
מומלץ לכלול כמה שיותר
NewMediaItems
בכל קריאה ל-batchCreate
כדי לצמצם את מספר הקריאות הכולל שצריך לבצע. אפשר לכלול עד 50 פריטים.מגדירים טקסט תיאור משמעותי שנוצר על ידי המשתמשים. אין לכלול מטא-נתונים כמו שמות של קובצי וידאו, תגים פרוגרמטיים או טקסט אחר שנוצר באופן אוטומטי בשדה התיאור.
הדרכה מפורטת לדוגמה
בדוגמה הזו נעזרים בפסאודו-קוד כדי להסביר איך מעלים פריטים של מדיה לכמה משתמשים. המטרה היא לתאר את שני השלבים בתהליך ההעלאה (העלאת בייטים גולמיים ויצירת פריטי מדיה), ולפרט את השיטות המומלצות ליצירת שילוב יעיל ועמיד של העלאה.
שלב 1: מעלים בייטים גולמיים
קודם צריך ליצור תור כדי להעלות את הבייטים הגולמיים של פריטי המדיה מכל המשתמשים. מעקב אחרי כל uploadToken
שהוחזר לכל משתמש. חשוב לזכור את הנקודות החשובות הבאות:
- מספר השרשורים להעלאה בו-זמנית תלוי בסביבת ההפעלה שלכם.
- כדאי לשנות את הסדר של תורי ההעלאה לפי הצורך. לדוגמה, אפשר לתעדף העלאות על סמך מספר ההעלאות שנותרו לכל משתמש, ההתקדמות הכוללת של המשתמש או דרישות אחרות.
פסאודו קוד
CREATE uploadQueue FROM users, filesToUpload // Upload media bytes in parallel. START multiple THREADS WHILE uploadQueue is not empty POP uploadQueue UPLOAD file for user GET uploadToken CHECK and HANDLE errors STORE uploadToken for user in uploadTokensQueue END
שלב 2: יוצרים פריטים של מדיה
בשלב 1 תוכלו להעלות מספר בייטים ממספר משתמשים במקביל, אבל בשלב השני תוכלו לשלוח קריאה אחת לכל משתמש בלבד בכל פעם.
פסאודו קוד
// For each user, create media items once 50 upload tokens have been // saved, or no more uploads are left per user. WHEN uploadTokensQueue for user is >= 50 OR no more pending uploads for user // Calls can be made in parallel for different users, // but only make a single call per user at a time. START new thread for (this) user if there is no thread yet POP 50 uploadTokens from uploadTokensQueue for user CALL mediaItems.batchCreate with uploadTokens WAIT UNTIL batchCreate call has completed CHECK and HANDLE errors (retry as needed) DONE.
צריך להמשיך בתהליך הזה עד להשלמת כל ההעלאות והשיחות ליצירת מדיה.