העלאה של פריטי מדיה היא תהליך שכולל שני שלבים:
- מעלים את הבייטים של קובצי המדיה לשרת של Google באמצעות נקודת הקצה uploads. הפונקציה מחזירה אסימון העלאה שמזהה את הבייטים שהועלו.
- משתמשים בקריאה מסוג 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
contains a status נמצא בתוך התג mediaMetadata ומתאר את מצב העיבוד של קובץ הווידאו. קובץ חדש שהועלה יחזיר קודם את הסטטוס PROCESSING, לפני שיהיה אפשר להשתמש בו.READY פרטים נוספים זמינים במאמר בנושא גישה לפריטי מדיה.
אם נתקלתם בשגיאה במהלך השיחה, כדאי לפעול לפי השיטות המומלצות ולנסות שוב. כדאי לעקוב אחרי תמונות שנוספו בהצלחה, כדי שאפשר יהיה להוסיף את התמונה לאלבום במיקום הנכון בבקשה הבאה. מידע נוסף זמין במאמר בנושא יצירת אלבומים.
התוצאות תמיד מוחזרות באותו סדר שבו נשלחו אסימוני ההעלאה.
שיטות מומלצות להעלאות
השיטות המומלצות ומקורות המידע הבאים יעזרו לכם לשפר את היעילות הכוללת של ההעלאות:
- כדאי לפעול לפי השיטות המומלצות לניסיון חוזר ולטיפול בשגיאות, ולזכור את הנקודות הבאות:
- שגיאות
429יכולות להתרחש אם מיציתם את המכסה או אם הוגבלה מהירות השליחה שלכם כי ביצעתם יותר מדי קריאות מהר מדי. חשוב לוודא שלא קוראים ל-batchCreateעבור אותו משתמש עד שהבקשה הקודמת מסתיימת. - צריך להמתין לפחות
30sלפני שמנסים שוב לפתור שגיאות מסוג429. כדאי להשתמש באסטרטגיית השהיה מעריכית לפני ניסיון חוזר (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, אפשר להעלות כמה בייטים מכמה משתמשים במקביל, אבל בשלב 2 אפשר לבצע רק קריאה אחת לכל משתמש בכל פעם.
קוד מדומה
// 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.ממשיכים בתהליך הזה עד שכל ההעלאות והקריאות ליצירת מדיה מסתיימות.